문제 설명
다음은 식당의 정보를 담은 REST_INFO 테이블과 식당의 리뷰 정보를 담은 REST_REVIEW 테이블입니다. 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 | VARCAHR(100) | TRUE |
TEL | VARCAHR(100) | TRUE |
REST_REVIEW 테이블은 다음과 같으며 REVIEW_ID, REST_ID, MEMBER_ID, REVIEW_SCORE, REVIEW_TEXT, REVIEW_DATE는 각각 리뷰 ID, 식당 ID, 회원 ID, 점수, 리뷰 텍스트, 리뷰 작성일을 의미합니다.
Column name | Type | Nullable |
REVIEW_ID | VARCHAR(10) | FALSE |
REST_ID | VARCHAR(10) | TRUE |
MEMBER_ID | VARCHAR(100) | TRUE |
REVIEW_SCORE | NUMBER | TRUE |
REVIEW_TEXT | VARCHAR(1000) | TRUE |
REVIEW_DATE | DATE | TRUE |
문제
REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.
문제 풀이
두 테이블을 JOIN하여 조회해야한다. 여기서 조인 조건은 두 테이블에 동시에 존재하는 식당ID가 될 것이다.
SELECT 절에서 조회할 내용
REST_INFO -> REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS
REST_REVIEW -> REST_ID, REVIEW_SCORE
여기서 리뷰의 평균점수를 조회해야하기 때문에 FROM절의 서브쿼리를 통해 리뷰점수의 평균을 구한다. 단 여기서 소수점 세번째 자리에서 반올림을 해야하기 때문에 ROUND를 사용해 평균 점수를 반올림한다.
# 서브쿼리
SELECT REST_ID, ROUND(AVG(REVIEW_SCORE), 2) AS SCORE
FROM REST_REVIEW
GROUP BY REST_ID
문제에서 서울에 위치한 식당이라는 조건이 있기 때문에 LIKE를 이용해 서울에 위치한 식당을 조회한다. ADDRESS가 전체 데이터를 살펴보면 주소가 "서울시"로 시작하는 것도 있고, "서울특별시"로 시작되는 것이 있기 때문에 공통적으로 "서울"으로 시작된 식당 정보만을 조회한다.
WHERE ADDRESS LIKE '서울%'
정렬기준은 첫번째로 평균점수를 기준으로 내림차순하며, 두 번째로 즐겨찾기수를 기준으로 내림차순한다.
ORDER BY SCORE DESC, FAVORITES DESC
MySQL 풀이 예시
SELECT I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS, R.SCORE
FROM REST_INFO I, (SELECT REST_ID, ROUND(AVG(REVIEW_SCORE), 2) AS SCORE
FROM REST_REVIEW
GROUP BY REST_ID) R
WHERE I.REST_ID = R.REST_ID AND I.ADDRESS LIKE '서울%'
ORDER BY R.SCORE DESC, I.FAVORITES DESC;
여기서 I.REST_ID = R.REST_ID의 경우 두 테이블의 조인 조건이기 때문에 JOIN을 사용해 나타낸다면 ON절에 나타내야한다.
# JOIN ON을 사용해 나타낸 경우
SELECT I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS, R.SCORE
FROM REST_INFO I JOIN(SELECT REST_ID, ROUND(AVG(REVIEW_SCORE), 2) AS SCORE
FROM REST_REVIEW
GROUP BY REST_ID) R
ON I.REST_ID = R.REST_ID
WHERE I.ADDRESS LIKE '서울%'
ORDER BY R.SCORE DESC, I.FAVORITES DESC;
Oracle 풀이 예시
SELECT I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS, R.SCORE
FROM REST_INFO I, (SELECT REST_ID, ROUND(AVG(REVIEW_SCORE), 2) AS SCORE
FROM REST_REVIEW
GROUP BY REST_ID) R
WHERE I.REST_ID = R.REST_ID AND I.ADDRESS LIKE '서울%'
ORDER BY R.SCORE DESC, I.FAVORITES DESC;
여기서 I.REST_ID = R.REST_ID의 경우 두 테이블의 조인 조건이기 때문에 JOIN을 사용해 나타낸다면 ON절에 나타내야한다.
# JOIN ON을 사용해 나타낸 경우
SELECT I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS, R.SCORE
FROM REST_INFO I JOIN(SELECT REST_ID, ROUND(AVG(REVIEW_SCORE), 2) AS SCORE
FROM REST_REVIEW
GROUP BY REST_ID) R
ON I.REST_ID = R.REST_ID
WHERE I.ADDRESS LIKE '서울%'
ORDER BY R.SCORE DESC, I.FAVORITES DESC;
'Study > SQL' 카테고리의 다른 글
[MySQL/ORACLE] 프로그래머스 - 평균 일일 대여 요금 구하기 (0) | 2023.06.20 |
---|---|
[MySQL/ORACLE] 프로그래머스 - 조건에 맞는 도서 리스트 출력하기 (0) | 2023.06.20 |
[MySQL/ORACLE] 프로그래머스 - 흉부외과 또는 일반외과 의사 목록 출력하기 (0) | 2023.06.18 |
[MySQL/ORACLE] 프로그래머스 - 조건에 부합하는 중고거래 댓글 조회하기 (0) | 2023.06.17 |
[MySQL/ORACLE] 프로그래머스 - 3월에 태어난 여성 회원 목록 출력하기 (0) | 2023.06.16 |