😵 틀린 풀이
SELECT CATEGORY, MAX(PRICE) AS MAX_PRICE, PRODUCT_NAME FROM FOOD_PRODUCT WHERE CATEGORY IN("과자","국","김치","식용유") GROUP BY CATEGORY ORDER BY MAX_PRICE DESC;
- 사실 이렇게 풀고 테스트케이스 돌리면, 정답 코드랑 정답은 같게 나온다. 그래서 왜 틀린지를 전혀 몰랐다
- 하지만!! 최대가격과 같은 가격을 갖는 음식이 여러개인 경우? 이렇게 하면 뭐가 나올지 모른다. 왜냐, GROUP BY 그룹 조건에 카테고리는 있지만,PRODCUT_NAME은 그룹 조건에 없어서 랜덤값이 나오기 때문이다.
- 그래서 서브쿼리를 써 주고, 그 테이블과 원래 테이블을 JOIN해서 찾아줘야 하는 것!
FOOD_PRODUCT
테이블을 JOIN 하면서, 최대금액과 같은 금액을 갖고, 카테고리도 같은 행들을 찾으면 되는 것이다.🙆♀️ 정답 코드
SELECT A.CATEGORY, A.PRICE AS MAX_PRICE, A.PRODUCT_NAME FROM FOOD_PRODUCT A JOIN ( SELECT MAX(PRICE) AS PRICE, CATEGORY FROM FOOD_PRODUCT GROUP BY CATEGORY HAVING CATEGORY IN ('과자','국','김치','식용유') ) B ON A.CATEGORY=B.CATEGORY AND A.PRICE=B.PRICE ORDER BY A.PRICE DESC;
- ()안이 서브쿼리.
GROUP BY CATEGORY
를 통해 각 카테고리별로 그룹화를 진행했고,MAX(PRICE)
집계함수를 이용하여 각 카테고리의 최대 금액을 구해줬다.각 식품분류가 '과자','국','김치','식용유' 인 경우만 출력
해야 하는 조건 때문에HAVING CATEGORY IN ()
조건을 써줬다.- 서브쿼리를 B 테이블로 명시하고, FOOD_PRODUCT를 A 테이블로 설정하여 둘을 조인하는데, 조인조건을
A.CATEGORY=B.CATEGORY AND A.PRICE = B.PRICE
로 주었다. 즉, 식품분류별 가장 비싼 식품을 조회한 것.- 정렬 조건을 위해 ORDER BY 써줌.
난이도가 좀 있는 sql문제에서 서브쿼리는 무조건 나올 수밖에 없다. 서브쿼리 조인할 때 문법도 꼭꼭 외워놓기!!
SELECT CATEGORY, PRICE as MAX_PRICE, PRODUCT_NAME FROM FOOD_PRODUCT WHERE (CATEGORY, PRICE) IN ( SELECT CATEGORY, MAX(PRICE) as PRICE FROM FOOD_PRODUCT WHERE CATEGORY IN ('과자', '국', '김치', '식용유') GROUP BY CATEGORY) ORDER BY PRICE desc