ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL 기초 문법 3
    SQL 2024. 8. 6. 15:12

    수업 자료와 함께 SQL KATA(프로그래머스 SQL문제)를 풀어보면서 알아두면 좋을 SQL기초 문법들


     

    날짜 포맷

     

     date_format(date(컬럼명), ' % 바꿔주고 싶은 날짜 포맷 ' )

    년 : Y (4자리), y(2자리)

    월 : M, m
    일 : d, e
    요일 : w

     

    오늘 날짜를 예로 들면, 

     

    2024.08.06.(화) 

     

    %Y → 2024 

    %y → 24

    %M → August

    %m → 08

    %d → 06 

    %e → 6 

    %w → 2

     

    요일은

     

    • 0 일요일
    • 1 월요일
    • 2 화요일
    • 3 수요일
    • 4 목요일
    • 5 금요일
    • 6 토요일

     

    예를 들어, date_format(date(HIRE_YMD), '%Y-%m-%d') 이렇게 SQL문을 작성해서 실행하면

     

    select DR_NAME, DR_ID, MCDP_CD,
           date_format(date(HIRE_YMD), '%Y-%m-%d') HIRE_YMD
    from doctor
    where MCDP_CD in ('cs', 'gs')
    order by HIRE_YMD desc, DR_NAME

     

    데이터는 아래와 같은 추출된다.

    DR_NAME    DR_ID     MCDP_CD     HIRE_YMD
    니모	DR20200012	CS	2020-03-01
    윈더	DR20190029	CS	2019-03-01
    뽀로로	DR20170123	GS	2017-03-01
    벨	DR20100039	GS	2010-07-01
    자스민	DR20100032	GS	2010-03-01

     


     

    Q. 가격이 제일 비싼 식품의 정보 출력하기

     

    문제

    FOOD_PRODUCT 테이블에서 가격이 제일 비싼 식품의 식품 ID, 식품 이름, 식품 코드, 식품분류, 식품 가격을 조회하는 SQL문을 작성해주세요.

     

    예시

    FOOD_PRODUCT 테이블이 다음과 같을 때

    PRODUCT_ID PRODUCT_NAME PRODUCT_CD CATEGORY PRICE
    P0018 맛있는고추기름 CD_OL00008 식용유 6100
    P0019 맛있는카놀라유 CD_OL00009 식용유 5100
    P0020 맛있는산초유 CD_OL00010 식용유 6500
    P0021 맛있는케첩 CD_OL00001 소스 4500
    P0022 맛있는마요네즈 CD_OL00002 소스 4700

     

    SQL을 실행하면 다음과 같이 출력되어야 합니다.

    PRODUCT_ID PRODUCT_NAME PRODUCT_CD CATEGORY PRICE
    P0020 맛있는산초유 CD_OL00010 식용유 6500

     

    테이블에서 특정 컬럼의 최댓값을 구하고 그 행의 데이터들을 출력

     

    하는 문제다. 

     

    처음에는 max(price) 를 써서 간단하게 구하고 싶었는데.. 오류가 났다. 가격만 최댓값이 구해지고 나머지는 컬럼들의 가장 위의 값이 추출되었기 때문이다. 가격에만 최대값을 줬으니까...ㅎ 생각해보면 당연..🤭

    select PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, max(PRICE) PRICE
    from food_product

     

     

    그래서 그냥 price 컬럼 order by  desc 로 내림차순 해준 후 limit 1 을 줬더니 정답처리가 됐다.

    select PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
    from food_product
    order by price desc 
    limit 1

     

     

    근데 이런 경우, max나 min 같은 최대값 최소값을 써서 구하는 방법이 있지 않을까 궁급했고, 찾아보니 방법이 있었다. 아마 이 방법이 이 문제를 푸는 정석이 아닐까 싶다. 

    근데 생각보다 간단하진 않네... 아직 서브쿼리문이 익숙하지 않아서 그런가..

     

    whrere 절에 서브쿼리문을 넣어주면 된다.

    select PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
    from food_product
    where price = ( 
    select max(price)
    from food_product
    )

     

     


     

     

     

    빈 값 (NULL 값) 찾을 때

     

    in null in not null 

     

    IS NULL: 컬럼의 값이 빈 값 (NULL) 인 경우를 찾을 때 where 절에 넣어서 찾아주면 손쉽게 찾을 수 있다.

    SELECT *
    FROM my_table
    WHERE column is null

     

    IS NOT NULL: 컬럼의 값이 빈 값 (NULL)이 아닌 경우를 찾을 때 

    SELECT *
    FROM my_table
    WHERE column is not null

     

     


     

    필요한 데이터가 서로 다른 테이블에 있을 때 join 

     

    • LEFT JOIN : 공통 컬럼 (키값) 을 기준으로, 하나의 테이블에 값이 없더라도 모두 조회된다.

    예를 들어 테이블 1에 1,2,3 이 있고 테이블 2에 2,3,4가 있다고 했을 때 둘을 합치면 1, 2, 3 이 나온다.  

     

    -- LEFT JOIN
    select 조회 할 컬럼
    from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명

     

    • INNER JOIN : 공통 컬럼 (키값) 을 기준으로, 두 테이블 모두에 있는 값만 조회된다.

    테이블 1에 1,2,3 이 있고 테이블 2에 2,3,4가 있다고 했을 때  둘을 합치면  2, 3 이 나온다. 

     

    -- INNER JOIN
    select 조회 할 컬럼
    from 테이블1 a inner join 테이블2 b on a.공통컬럼명=b.공통컬럼명

     

     

    JOIN 으로 두 테이블의 데이터 조회하기

     

    아래는 50세 이상 고객의 연령에 따라 경로 할인율을 적용하고, 음식 타입별로 원래 가격과 할인 적용 가격 합을 구한 예

     

    select cuisine_type,
           sum(price) "원래 가격",
           sum(price)-sum(discount_price) "할인 적용 가격",
           sum(discount_price) "할인 가격" 
    from 
    (
    select a.cuisine_type,
           price,
           price*((b.age-50)*0.005) discount_price
    from food_orders a inner join customers b on a.customer_id=b.customer_id
    where b.age>=50
    ) t
    group by 1
    order by 4 desc

    'SQL' 카테고리의 다른 글

    SQL 기초 문법 2  (0) 2024.08.06
    SQL 기초 다지기  (0) 2024.08.02
Designed by Tistory.