다음은 식당의 정보를 담은 REST_INFO 테이블입니다. REST_INFO 테이블은 다음과 같으며 REST_ID, REST_NAME, FOOD_TYPE, VIEWS, FAVORITES, PARKING_LOT, ADDRESS, TEL은 식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.
REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요.
이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.
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
2) 예시
예를 들어, REST_INFO 테이블이 아래와 같다면
REST_ID
REST_NAME
FOOD_TYPE
VIEWS
FAVORITES
PARKING_LOT
ADDRESS
TEL
00001
은돼지식당
한식
1,150,345
734
N
서울특별시 중구 다산로 149
010-4484-8751
00002
하이가쯔네
일식
120,034
112
N
서울시 중구 신당동 375-21
NULL
00003
따띠따띠뜨
양식
1,234,023
102
N
서울시 강남구 신사동 627-3 1F
02-6397-1023
00004
스시사카우스
일식
1,522,074
230
N
서울시 강남구 신사동 627-27
010-9394-2554
00005
코슌스
일식
15,301
123
N
서울특별시 강남구 언주로153길
010-1315-8729
SQL을 실행하면 다음과 같이 출력되어야 합니다.
FOOD_TYPE
REST_ID
REST_NAME
FAVORITES
한식
00001
은돼지식당
734
일식
00004
스시사카우스
230
양식
00003
따띠따띠뜨
102
3) 풀이
※SQL 논리적 실행 순서 ① FROM: 테이블 결합 및 필요한 데이터 검색. ② WHERE: 행을 필터링. ③ GROUP BY: 그룹화된 데이터 생성. ④ HAVING: 그룹화된 데이터에 대한 조건 검사. ⑤ SELECT: 열 선택 및 계산. ⑥ ORDER BY: 결과 정렬.
1. 테이블에서 음식종류, ID, 식당이름, 즐겨찾기수를 조회합니다.
● SELECT FOOD_TYPE, REST_ID,REST_NAME, FAVORITES FROM REST_INFO
2. WHERE 조건문에 서브쿼리를 이용하여 즐겨찾기수가 제일 많은 음식 종류를 구해내고, 그 구한값을 조건으로 합니다.
● WHERE (FOOD_TYPE, FAVORITES) IN ( SELECT FOOD_TYPE, MAX(FAVORITES) FROM REST_INFO GROUP BY FOOD_TYPE)
※ WHERE(A) IN (B)
B값과 일치하는 A열을 조건으로 합니다.
※ 만약 SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES) FROM REST_INFO GROUP BY FOOD_TYPE 라고 했으면 어떻게 되었을까?
위 구문을 사용했다면, 음식 타입별로 최대 즐겨찾기수를 찾는 것은 맞지만!! 어떤 REST_ID 및 NAME이 해당 최댓값에 대응하는지는 찾지 못합니다.
GROUB BY절은 집계 함수를 사용한 열과 나머지 열 간의 관계를 설정하지 않으므로 데이터베이스에서 어떤 REST_ID와 REST_NAME 값을 선택해야 할지 알 수 없게 됩니다.
/// 1번 아이디의 소나무식당이 돼지갈비로 유명하고, 즐겨찾기 500개 /// 만약 돼지갈비가 즐겨찾기 500개로 가장 많은 음식 타입이라할지라도,
테이블에서 (돼지갈비, 500개)를 찾게되니 그게 소나무식당이고 1번 아이디식당임을 알 수 있다는 것입니다.
※ MAX(A)
A 중 최대값을 반환하는 함수입니다.
3. 음식 종류를 기준으로 내림차순 정렬합니다. ● ORDER BY FOOD_TYPE DESC;
4) 코드
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;