sein-choi 님의 블로그
[SQL] Lv.3 즐겨찾기가 가장 많은 식당 정보 출력하기 본문
✅REST_INFO

✅문제
REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.
# 처음 작성한 쿼리
WITH ORDER_BY_FAVORITES AS(
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
ORDER BY FAVORITES DESC
)
SELECT *
FROM ORDER_BY_FAVORITES
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC
GROUP BY FOOD_TYPE는 각 FOOD_TYPE 그룹에서 가장 먼저 나오는 행을 선택합니다. 그렇기 때문에 FAVRITES을 기준으로 내림차순으로 정렬한 서브쿼리를 만들었습니다. 서브쿼리는 FAVRITES을 기준으로 내림차순으로 정렬되어있기 때문에 서브쿼리에 GORUP BY FOOD_TYPE을 실행하면 RKR FOOD_TYPE 그룹에서 가장 먼저 나오는 행은 FOOD_TYPE 별 즐겨찾기가 가장 많은 행이라고 생각했습니다.
하지만 SQL에서는 GROUP BY가 항상 가장 먼저 나오는 행을 선택한다는 것을 보장하지 않습니다:
GROUP BY는 데이터를 특정 기준으로 그룹화할 뿐이며, 서브쿼리에서 데이터를 정렬한 상태는 GROUP BY 처리 시 무시될 수 있습니다. 이로 인해 GROUP BY가 반환하는 행은 임의의 행이 될 가능성이 있습니다.
따라서 GROUP BY가 어떤 행을 선택할지 명시해주어야 합니다.
# 수정한 쿼리
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) IN
(
SELECT FOOD_TYPE, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC
WHERE 구문에 서브쿼리의 명칭은 '비연관 다중행 서브쿼리' 입니다.
비연관 다중행 서브쿼리?
- 비연관: 서브쿼리가 메인쿼리의 컬럼을 가지고 있지 않은 형태
- 다중행: 서브쿼리의 결과가 여러행인 형태로 여러 열과 행을 반환하며, 주로 IN과 EXISTS 연산자를 사용합니다.
IN: 서브쿼리가 반환한 값들이 메인 쿼리 조건에 포함되는지 여부를 확인
EXISTS : 서브쿼리의 조건을 만족하는 행이 존재하는지 확인, 조건을 만족하는 행이 발견되면 서브쿼리가 즉시 종료
서브쿼리의 결과는 FOOD_TYPE별 가장 많은 즐겨찾기수 입니다.

메인 쿼리의 (FOOD_TYPE, FAVORITES) 튜플이 서브쿼리에서 반환된 (FOOD_TYPE, MAX(FAVORITES)) 튜플과 각 컬럼 값이 동시에 일치하는 경우를 조건으로 설정합니다. 즉, FOOD_TYPE= FOOD_TYPE이면서 FAVORITES= MAX(FAVORITES) 인 경우
이렇게 하면 FOOD_TYPE별로 가장 많은 즐겨찾기수를 보유한 행만 조회됩니다.
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
'QUIZ > [SQL]' 카테고리의 다른 글
| [SQL] Lv.3 조건에 맞는 사용자와 총 거래금액 조회하기 (0) | 2025.03.05 |
|---|---|
| [SQL] Lv.3 대여 기록이 존재하는 자동차 리스트 구하기 (1) | 2025.02.28 |
| [SQL] Lv.3 오랜 기간 보호한 동물(2) (0) | 2025.02.28 |
| [SQL] Lv.3 카테고리 별 도서 판매량 집계하기 (0) | 2025.02.27 |
| [SQL] Lv.3 있었는데요 없었습니다 (0) | 2025.02.27 |