DB/SQL

[SQL]서울에 위치한 식당 목록 출력하기 - SQL 고득점 Kit

나맘임 2025. 2. 12. 18:48

문제

코딩테스트 연습 - 서울에 위치한 식당 목록 출력하기 | 프로그래머스 스쿨

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

풀이

SELECT 
    INFO.REST_ID,
    INFO.REST_NAME,
    INFO.FOOD_TYPE,
    INFO.FAVORITES,
    INFO.ADDRESS,
    ROUND(AVG(REVIEW.REVIEW_SCORE), 2) AS SCORE
FROM REST_INFO AS INFO
JOIN REST_REVIEW AS REVIEW
ON INFO.REST_ID = REVIEW.REST_ID
WHERE INFO.ADDRESS LIKE '서울%'
GROUP BY INFO.REST_ID, INFO.REST_NAME, INFO.FOOD_TYPE, INFO.FAVORITES, INFO.ADDRESS
ORDER BY SCORE DESC, FAVORITES DESC;

 

이 문제는 두 테이블을 JOIN 후에 필터링,그룹핑,정렬하는 과정을 거쳐야 한다.

 

 

FROM REST_INFO AS INFO
JOIN REST_REVIEW AS REVIEW
ON INFO.REST_ID = REVIEW.REST_ID
WHERE INFO.ADDRESS LIKE '서울%'

 

먼저 JOIN, WHERE 부분부터 확인해보자.

두 테이블을 연결하거나 결합하는 것을 JOIN이라고 말한다.

JOIN에도 여러 종류가 있지만 여기선 두 테이블의 모든 데이터가 필요하기에 INNER JOIN인 기본값 JOIN을 사용한다.

JOIN을 할 땐, ON을 사용해서 두 테이블 모두 공통으로 가진 데이터를 지정해줘야 한다.

여기선 REST_ID가 공통 데이터이다.

 

WHERE는 필터링 기능이다.

결합된 표에서 서울에 있는 식당을 찾아야 하므로 주소에서 서울로 시작하는지를 LIKE를 통해 필터링 해준다.

 

SELECT 
    INFO.REST_ID,
    INFO.REST_NAME,
    INFO.FOOD_TYPE,
    INFO.FAVORITES,
    INFO.ADDRESS,
    ROUND(AVG(REVIEW.REVIEW_SCORE), 2) AS SCORE
....
GROUP BY INFO.REST_ID, INFO.REST_NAME, INFO.FOOD_TYPE, INFO.FAVORITES, INFO.ADDRESS

이 문제에선 리뷰 평균 점수를 구해야 한다.

그렇기에 JOIN으로 만들어진 표에서  REST_ID 기준으로 그룹을 지어준 다음에 그 그룹에서 평균값을 구해야 한다.

GROUP BY를 통해 그룹핑을 진행한다.

이때, AVG()로 만들 칼럼을 제외한 결과에 필요한 칼럼들을 GROUP BY에 넣어주면 된다.

소수점 세 번째 자리에서 반환해야 한다는 말은 두 번째 자리까지 표시하라는 말이므로 ROUND(,2)를 해주면 된다.

 

 

ORDER BY SCORE DESC, FAVORITES DESC;

정렬에 여러 조건이 붙는다면 ,로 순서대로 적어주면 된다.

모든 결과 테이블을 만들고 나서 ORDER BY가 실행된다.