Study/SQL

[프로그래머스/SQL 고득점 Kit] 서울에 위치한 식당 목록 출력하기

growingtree 2022. 11. 9. 15:50

https://school.programmers.co.kr/learn/courses/30/lessons/131118

 

문제

다음은 식당의 정보를 담은 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 VARCHAR(100) TRUE
TEL VARCHAR(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문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.

 

요약

1. 식당 ID, 식당 이름, 음식 종류, 즐겨찾기 수, 주소, 리뷰 평균 점수 조회 

2. 조건 1 : 리뷰 평균 점수는 소수점 3번째 자리에서 반올림

3. 조건 2 : (전체)결과는 평균점수를 기준으로 내림차 순 

4. 조건 3 : 평균이 같으면 즐겨찾기 수를 기준으로 내림차 순 

 

아이디어

1. 1번의 내용을 출력하려면 두 테이블간 JOIN이 필요 (KEY는  REST_ID) 

2. 조건 1의 경우, 서브쿼리로 생성 GROUP BY REST_ID로 레스토랑 별로 그룹화 후 평균 구하기 -> 그 후 소수점 반올림 (round 함수 사용) -> score라는 이름의 칼럼 생성

3. 조건 2,3의 경우 ORDER BY로 정렬 

 

코드 

SELECT  I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS,
(SELECT ROUND(AVG(REST_REVIEW.REVIEW_SCORE),2) 
FROM REST_REVIEW
WHERE I.REST_ID = REST_REVIEW.REST_ID
) AS SCORE

FROM REST_INFO AS I  JOIN REST_REVIEW AS R
ON I.REST_ID = R.REST_ID

WHERE I.ADDRESS LIKE "서울특별시%" OR I.ADDRESS LIKE "서울시%"
GROUP BY I.REST_ID
ORDER BY SCORE DESC, I.FAVORITES DESC;

SQL을 읽는 순서는 다음과 같다.

 

1. FROM절 >> REST_INFO 테이블과 REST_REVIEW 테이블을 조인 (KEY는 REST_ID) 

2. WHERE절 >> ADDRESS칼럼의 값이 "서울특별시" 이거나 "서울시"인 경우만 남기고 나머진 제거 

3. GROUP BY절 >> REST_ID로 그룹화

4. ORDER BY절 >> SCORE 칼럼과 FAVORITES 칼럼으로 정렬, 그런데 SCORE칼럼에 대한 정보가 없는 상태 

5. SELECT절 >> 이미 있는 칼럼들 조회 (REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS) 그리고 서브쿼리

6. 서브쿼리 SELECT절  

6-1. FROM절 >> REST_REVIEW 테이블 선택

6-2. WHERE절 >> 메인쿼리에 있던 I(REST_INFO)테이블의 REST_ID와 서브쿼리 테이블(REST_REVIEW)의 REST_ID가 같은 경우 (즉, 메인 쿼리의 결과 >> 서울 특별시, 서울시에 해당하는 REST_ID 와 같은 경우) 

6-3. SELECT절 >> REVIEW_SCORE의 평균의 반올림 리턴 

 

 

설명 : 서브쿼리 

- 서브쿼리란 ? : 하나의 SQL문 안에 포함되어있는 또다른 SQL문을 말한다. (서브쿼리를 포함하는 외부 쿼리는 메인쿼리) 

- 서브쿼리는 메인 쿼리의 칼럼을 쓸 수 있지만, 메인 쿼리는 서브쿼리의 칼럼을 쓸 수 없다. (상속에서 부모,자식 클래스 관계와 유사)

- 서브쿼리는 SELECT문으로만 사용할 수 있고, ()로 감싸서 사용해야한다. 또한, 서브쿼리에서는 ORDER BY를 사용할 수 없다.

 

참고 링크 : https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC-%EC%A0%95%EB%A6%AC

 

반응형