본문 바로가기
SQL 문제 풀기/1. 프로그래머스 SQL : 2023.12.17~2024.2.29

<프로그래머스 66> 서울에 위치한 식당 목록 출력하기(Lv.4)

by HYEHYE_SON 2024. 2. 20.
728x90

 
프로그래머스에서 제공하는 SQL문제 매일 풀기 챌린지


 

문제 설명

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

예시

REST_INFO 테이블이 다음과 같고
 
[ REST_INFO ]

REST_ID REST_NAME FOOD_TYPE VIEWS FAVORITES PARKING_LOT ADDRESS TEL
00028 대우부대찌개 한식 52310 10 N 경기도 용인시 처인구 남사읍 처인성로 309 031-235-1235
00039 광주식당 한식 23001 20 N 경기도 부천시 산업로8번길 60 031-235-6423
00035 삼촌식당 일식 532123 80 N 서울특별시 강서구 가로공원로76가길 02-135-1266

 
[ REST_REVIEW ]

REVIEW_ID REST_ID MEMBER_ID REVIEW_SCORE REVIEW_TEXT REVIEW_DATE
R000000065 00028 soobin97@naver.com 5 부찌 국물에서 샤브샤브 맛이나고 깔끔 2022-04-12
R000000066 00039 yelin1130@gmail.com 5 김치찌개 최곱니다. 2022-02-12
R000000067 00028 yelin1130@gmail.com 5 햄이 많아서 좋아요 2022-02-22
R000000068 00035 ksyi0316@gmail.com 5 숙성회가 끝내줍니다. 2022-02-15
R000000069 00035 yoonsy95@naver.com 4 비린내가 전혀없어요. 2022-04-16

 
SQL을 실행하면 다음과 같이 출력되어야 합니다.

REST_ID REST_NAME FOOD_TYPE FAVORITES ADDRESS SCORE
00035 삼촌식당 일식 80 서울특별시 강서구 가로공원로76가길 4.50

 


 

♥ 오라클, MySQL 정답 

select i.rest_id, i.rest_name, i.food_type, i.favorites, i.address, 
        round(avg(r.review_score), 2) as score
    from rest_info i, rest_review r
    where i.rest_id = r.rest_id
     and address like '서울%'
    group by i.rest_id, i.rest_name, i.food_type, i.favorites, i.address
    order by score desc, i.favorites desc;

 

 


 

■ EQUI JOIN

조인은 여러 개의 테이블의 컬럼들을 활용하여 한 번에 원하는 것을 출력하고자 할 때 사용하는 문법이다.
 
그 중 EQUI JOIN 이란, 
조인하려는 테이블 사이에 공통된 컬럼이 있을 경우 (컬럼명은 달라도 되고, 데이터가 공통될 때)
EQUAL(=) 조인하는 조인 문법이다.
 
ORACLE과 MySQL의 차이점은
MySQL에서는 IN LINE VIEW에 별칭을 지정해줘야 오류가 발생하지 않는 것이다.
ORACLE은 별칭이 없어도 에러가 발생하지 않았다.
 

■ ROUND

ROUND([숫자|컬럼명], [표시할 자리수])

예를들어 3.1415라는 수가 있을 때 
두번째 인자에 2라는 값을 넣으면, 소수점 두번째 자리까지만 표시되고
3번째 자리의 값을 반올림 한다는 의미이다.  
 
 

■ LIKE함수와 와일드카드(%)

LKIE함수는 특정 값이 포함된 데이터를 출력할 수 있는 함수이다.
와일드 카드(%)는 LKIE함수와 함께 쓰이며 
그 자리에 무엇이 와도 상관없고, 개수가 몇 개가 와도 상관없다는 의미이다.

 


정답 해설

위의 내용을 기반으로 해설해보면,
 
# 1. EQUI JOIN
rest_info 테이블과 rest_review 테이블을 공통 컬럼인 rest_id를 활용하여 equi join을 해준다.
from절에 조인하려는 컬럼명을 나열하고
where절에서 rest_id를 활용하여 연결조건을 준다.
 
 
# 2. SELECT절
출력해야할 컬럼명을 나열해주는데,
컬럼을 가져올 테이블 명 혹은 테이블의 별칭을
온점(.)을 사용하여 컬렴과 연결해준다.
 
여기서 중요한 것은 score 컬럼을 만드는 것이다.
review_score 컬럼의 평균을 구하는데, 소수점 2자리 수까지만 출력해야한다.
따라서 avg(r.review_score)를 round함수로 둘러주고
2번째 인자에 2를 입력하여 소수점 셋째자리에서 반올림 할 수 있도록 해준다.
 
 
# 3. WHERE절
 서울에 위치한 데이터에 대해서만 출력해야하기 때문에 

where절에서 like연산자와 와일드카드(%)를 사용하여 이 조건을 충족시켜준다.

and address like '서울%'
    group by i.rest_id, i.rest_name, i.food_type, i.favorites, i.address
    order by score desc, i.favorites desc;
 
 
# 4. GROUP BY절
리뷰 평균 점수 SCORE는 식당 ID 별 평균 점수 이므로

GROUP BY로 식당 ID를 묶어주어 그룹함수를 사용할 수 있도록 조치 한다.

이때 그룹함수를 사용하는 컬럼을 제외하고 모두 GROUP BY로 묶어줘야 오류가 발생하지 않는다.

 

 

# 5. ORDER BY 절

리뷰 평균 점수를 기준으로 desc하게 정렬하되,

점수가 같다면 favorites를 기준으로 desc하게 정렬될 수 있도록 나열해준다.

 


 
 

 
 
 
 

 

 
 
출처 : 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

반응형