https://school.programmers.co.kr/learn/courses/30/lessons/131123
다음은 식당의 정보를 담은 REST_INFO 테이블입니다. REST_INFO 테이블은 다음과 같으며 REST_ID, REST_NAME, FOOD_TYPE, VIEWS, FAVORITES, PARKING_LOT, ADDRESS, TEL은 식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.
| Column name | Type | Nullable |
|---|---|---|
| REST_ID | VARCHAR(5) | FALSE |
| REST_NAME | VARCHAR(50) | FALSE |
| FOOD_TYPE | VARCHAR(20) | TRUE |
| VIEWS | NUMBER | TRUE |
| FAVORITES | NUMBER | TRUE |
| PARKING_LOT | VARCHAR(1) | TRUE |
| ADDRESS | VARCHAR(100) | TRUE |
| TEL | VARCHAR(100) | TRUE |
REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.
REST_INFO 테이블이 다음과 같을 때
| REST_ID | REST_NAME | FOOD_TYPE | VIEWS | FAVORITES | PARKING_LOT | ADDRESS TEL |
|---|---|---|---|---|---|---|
| 00001 | 은돼지식당 | 한식 | 1150345 | 734 | N | 서울특별시 중구 다산로 149 |
| 00002 | 하이가쯔네 | 일식 | 120034 | 112 | N | 서울시 중구 신당동 375-21 |
| 00003 | 따띠따띠뜨 | 양식 | 1234023 | 102 | N | 서울시 강남구 신사동 627-3 1F |
| 00004 | 스시사카우스 | 일식 | 1522074 | 230 | N | 서울시 서울시 강남구 신사동 |
| 00005 | 코슌스 | 일식 | 15301 | 123 | N | 서울특별시 강남구 언주로153길 |
SQL을 실행하면 다음과 같이 출력되어야 합니다.
| FOOD_TYPE | REST_ID | REST_NAME | FAVORITES |
|---|---|---|---|
| 한식 | 00001 | 은돼지식당 | 734 |
| 일식 | 00004 | 스시사카우스 | 230 |
| 양식 | 00003 | 따띠따띠뜨 | 102 |
ORDER BY를 사용해 정렬하고, GROUP BY를 통해 묶어 주었는데 통과하지 못했다.
SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC;
GROUP BY로 묶으면 가장 상단에 있는 데이터들을 임의로 가져오게 된다고 한다.
즉, 여기서 GROUP BY FOOD_TYPE으로 묶으면 한식의 맨 첫번째, 일식의 맨 첫번째, .. 를 가져온다. 문제에서 요구하는 즐겨찾기 수가 가장 많은 식당이 아닌 테이블의 가장 상단의 식당 정보들을 가져오게 되는 것.
SQL 쿼리에는 실행 순서가 존재하는데, GROUP BY 이후에 MAX를 진행하면 테이블 최상단 값을 가져와 거기서 최대값을 찾아 준다.
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;
FROM (+JOIN) : 가장 먼저 실행됨WHEREGROUP BYHAVINGSELECTORDER BYLIMIT