문제
REST_INFO
와 REST_REVIEW
테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기 수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요.
이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고
결과는 평균점수를 기준으로 내림차순 정렬해주시고,
평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.
답
-- 코드를 입력하세요
SELECT
ri.Rest_ID, ri.FOOD_TYPE, ri.FAVORITES, ri.ADDRESS, ROUND(AVG(rr.REVIEW_SCORE), 2)AS SCORE
FROM REST_INFO ri JOIN REST_REVIEW rr
ON ri.REST_ID = rr.REST_ID
WHERE ADDRESS LIKE '서울%'
GROUP BY ri.REST_ID
ORDER BY SCORE DESC, FAVORITES DESC
풀이
이번 문제를 풀면서 평균 점수를 구하는 쿼리문과 반올림하는 명령을 찾아보면서 진행했습니다.
또 결과를 차순 정렬 할 때, 차순 정렬이 두 개 이상 일 때
어떻게 써야 하는 지를 알아보게 되었습니다.
먼저 조회해야 할 데이터 중 리뷰 평균 점수를 구해야 했습니다.
리뷰 점수는 REST_REVIEW 테이블에 존재했기에 rr.REVIEW_SCORE 로 지칭했고,
평균 점수를 구하기 위해 AVG( ) 함수를 사용해야 했습니다.
평균을 구한 뒤 REVIEW_SCORE를 소수점 세 번째 자리에서 반올림하라는 지령이 있었기에
평균 점수를 구한 리뷰 점수를 소수점 세 번째 자리에서 반올림하는 함수도 같이 붙여야 한다는 것을 알게 되었습니다.
그래서 REST_REVIEW 테이블에서 소수점 세 번째 자리에서 반올림 한 리뷰 평균 점수를
구하기 위해서 ROUND(AVG(rr.REVIEW_SCORE), 2) 를 사용했습니다.
FROM JOIN을 사용해 각 테이블을 ri 와 rr로 지정했고,
각 테이블에 공통적으로 들어가있는 REST_ID를 기준으로 JOIN시켰습니다.
WHERE절에서 서울에 있는 식당만 골라내야 했습니다.
이 과정에서 LIKE 연산자와 함께 사용되는
와일드 카드 “%” 와 “_” 어떤 역할을 하는지 알게 되었습니다.
- %
0개 이상의 문자를 대체하는 역할로 이번 문제에서는
LIKE “서울%”로 사용되어 서울로 시작하는 모든 데이터를 뽑아내는 역할을 하였습니다.
다른 예시로 LIKE “%구” 로 작성할 경우 ADDRESS 에서 구로 끝나는 모든 데이터를 뽑아낼 것입니다.
- _
정확히 한 문자를 대체하는 역할입니다.
예시로 LIKE “서울_구” 로 작성할 경우 “서울특구” 는 데이터로 나오지만 “서울특별구”는 선택되지 않는다고 합니다.
이번 문제를 통해 와일드 카드에 대해 복기하게 되었습니다.
평균점수를 기준으로 내림차순 정렬하고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순
하라는 것을 보고 ORDER BY를 쓰고 AND를 넣어야 하나 생각을 하고 생각하여 제출했었지만
ORDER BY 절에서는 AND 를 사용할 수 없단 것을 알게 되었습니다.
ORDER BY 에서는 정렬 기준을 나열하는 방식으로, 각각의 기준을 “ , “ 로 나눠야 한다는 것을
알게 되었습니다.
Share article