:< [프로그래머스 SQL] 식품분류별 가장 비싼 식품의 정보 조회하기

kiki·2024년 1월 10일
0

프로그래머스

목록 보기
53/79

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/131116

문제 설명

  • 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회
  • 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력
  • 식품 가격을 기준으로 내림차순 정렬

1차 시도

SELECT M.CATEGORY,
       MAX_PRICE,
       PRODUCT_NAME FROM FOOD_PRODUCT F
       INNER JOIN (SELECT CATEGORY, MAX(PRICE) AS MAX_PRICE
            FROM FOOD_PRODUCT
            WHERE CATEGORY IN ('과자','국','김치','식용유')
            GROUP BY CATEGORY) M 
       ON M.CATEGORY=F.CATEGORY AND M.MAX_PRICE=F.PRICE
       ORDER BY MAX_PRICE DESC;

서브쿼리에서 카테고리 내에서 가장 큰 값을 갖는 데이터만 뽑고, 이를 본 테이블과 INNER JOIN(CATEGORY, PRICE가 동일한 경우)해 MAX_PRICE 값을 갖는 데이터만 조회했다.

2차 시도

SELECT CATEGORY,
       PRICE AS MAX_PRICE,
       PRODUCT_NAME 
       FROM FOOD_PRODUCT F
       WHERE (CATEGORY, PRICE) IN (SELECT CATEGORY, MAX(PRICE) AS MAX_PRICE
            FROM FOOD_PRODUCT
            WHERE CATEGORY IN ('과자','국','김치','식용유')
            GROUP BY CATEGORY)
       ORDER BY MAX_PRICE DESC;

서브쿼리를 WHERE 절에 적용해 조건을 먹일 수 있다.
즉 서브쿼리에서 카테고리 내 가장 큰 값을 갖는 데이터의 카테고리와 PRICE를 뽑고, WHERE (CATEGORY, PRICE) IN 서브쿼리로 MAX_PRICE를 갖는 데이터만 조회하기
이게 조금 더 깔끔한 것도 같다.

궁금한 점

SELECT CATEGORY, PRICE
            FROM FOOD_PRODUCT
            WHERE CATEGORY IN ('과자','국','김치','식용유')
            GROUP BY CATEGORY
            HAVING PRICE=MAX(PRICE)

HAVING에서 MAX를 먹이면 카테고리 내에서 MAX(PRICE) 값이 PRICE 값인 데이터만 뽑아져 나올 줄 알았는데, 그렇지 않고 그냥 WHERE 절 후 테이블에서 전체 PRICE 중 MAX 값으로 뽑혀서 하나의 데이터만 나온다.
HAVING이 GROUP BY 후 쓰는 WHERE로 알고있었는데 뭘 잘못하고있는거지?
SQL에서 커맨드가 실행되는 순서를 봐야겠다. 뭔가 잘못알고있는 게 있는겨

정리

  • WHERE ~ IN 서브쿼리: ~에 들어갈 수 있는 건 필드, 그리고 (필드, 필드) 이런식으로 튜플 형식으로 묶어서 들어갈 수도 있다.

0개의 댓글