SQL 쿼리 연습/SUM, MAX, MIN

[Lv.2 / 프로그래머스 / SQL] 가격이 제일 비싼 식품의 정보 출력하기

김세진 2023. 2. 24. 01:39
반응형

 

 

 

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이 (MySQL)

 

가장 가격이 비싼 항목을 하나 출력해야 한다.

 

다양한 풀이 방법이 있다. 정렬을 이용하여 가격 내림차순의 첫 번째 것을 고르는 것,  서브쿼리나 조인을 이용하는 것 등... 필자는 처음에 서브쿼리로 풀이했다.

 

 

SUB QUERY

SELECT
    PRODUCT_ID
    , PRODUCT_NAME
    , PRODUCT_CD
    , CATEGORY
    , PRICE
FROM
    FOOD_PRODUCT
WHERE
    PRICE = (
        SELECT 
            MAX(PRICE)
        FROM
            FOOD_PRODUCT
    )

 

위의 풀이도 정답이지만, 매 행마다 WHERE절의 서브쿼리를 반복해야 하는 형태이므로 성능에는 좋지 않다고 한다. DB에 따라서 어느 정도 해소하는 솔루션을 가지고 있다고 하긴 하지만, 더 나은 형태를 고려해 볼 필요가 있다고 느꼈다.

 

 

INNER JOIN

SELECT
    p.PRODUCT_ID
    , p.PRODUCT_NAME
    , p.PRODUCT_CD
    , p.CATEGORY
    , p.PRICE
FROM
    FOOD_PRODUCT AS p
    JOIN (
        SELECT
            MAX(PRICE) AS MAX_PRICE
        FROM
            FOOD_PRODUCT
    ) max_price
    ON p.PRICE = max_price.MAX_PRICE;

 

위 코드는 서브쿼리의 결과값을 조인을 이용하여 연결한 방식이다. 이렇게 하면 불필요한 연산을 줄이고, 최대값만 비교하여 이전보다 연산을 많이 줄일 수 있다.

 

 

ORDER BY

SELECT
    PRODUCT_ID
    , PRODUCT_NAME
    , PRODUCT_CD
    , CATEGORY
    , PRICE
FROM
    FOOD_PRODUCT
ORDER BY PRICE DESC
LIMIT 1;

 

내림차순 정렬을 활용한 풀이법으로, 정렬에는 약간의 시간이 소요되겠지만 WHERE절에 서브쿼리를 넣는 것보다는 더 나은 방식이며, 코드가 깔끔하다는 장점이 있다.

 

 

SET

SET @max_price := (SELECT MAX(price) FROM FOOD_PRODUCT);

SELECT
    PRODUCT_ID
    , PRODUCT_NAME
    , PRODUCT_CD
    , CATEGORY
    , PRICE
FROM
    FOOD_PRODUCT
WHERE
    PRICE = @max_price

 

위 코드는 MySQL에서 제공하는 변수 기능을 활용한 코드이다. SET을 이용하면 위와 같이 변수를 만들어 활용할 수 있으므로, 유연하게 대처가 가능하다. 

 

 

 

반응형