SQL

[SQL/SELECT] 서울에 위치한 식당 목록 출력하기

지니지니하지니 2022. 12. 15. 11:15

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


테이블 정보

1.REST_INFO( as ri )

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

 

2. REST_REVIEW( as rr )

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

컬럼 정보

식당ID(rest_id), 식당이름(rest_name), 음식종류(food_type), 즐겨찾기수(favorites), 주소(address), 리뷰점수 (review_score)


문제 설명

REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.


풀이 과정

서울에 위치한

where address like '서울%' -- "서울%" 로 하면 에러가 나기 때문에 주의

 

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

리뷰점수(review_score)은 rest_review테이블에, 이를 제외한 나머지 컬럼은 rest_info 에 있기 때문에 두 테이블을 join해서 사용해서 컬럼을 select해야한다.

join의 기준은 두 테이블에 공통적으로 존재하는 rest_id를 통해 가능

리뷰의 평균 점수를 조회해야하기 때문에 특정 기준으로 테이블을 그룹화해야하는데 해당 조건은 mySql 과 Oracle에서 각각 다르기 때문에 유의해서 사용하자

 

리뷰 평균점수는 소수점 세 번째 자리에서 반올림

avg() 와 round() 내장함수를 사용하여 처리 가능

 

평균점수, 즐겨찾기수로 내림차순

정렬은 order by를 사용해 각 컬럼의 위치로도 가능, 컬럼의 이름으로도 가능하기때문에 편한대로 사용

내림차순은 뒤에 desc를 붙여주면 가능


정답

MySQL

select ri.rest_id, ri.rest_name, ri.food_type, ri.favorites, ri.address, round(avg(review_score),2) as score
from rest_info ri
join rest_review rr
	on ri.rest_id = rr.rest_id
where ri.address like '서울%'
group by ri.rest_id -- ri.rest_name, ri.address 로도 그룹화 가능(중복이 없는 값들)
order by 6 desc, 4 desc

Oracle

select ri.rest_id, ri.rest_name, ri.food_type, ri.favorites, ri.address, round(avg(review_score),2) as score
from rest_info ri
join
rest_review rr
on ri.rest_id = rr.rest_id
where ri.address like '서울%'
group by ri.rest_id, ri.rest_name, ri.food_type, ri.favorites, ri.address
-- 그룹을 하고자 하는 컬럼명을 select와 group by 절에 둘 다 명시해줘야 함, 집계함수(위에선 avg)는 따로 명시할 필요가 없음
order by 6 desc, 4 desc

oracle에서 group by 를 쓸 때 주의할 점은 select하는 컬럼명을 select절과 group by 절에 모두 명시해줘야 한다는 점이다.

다만 집계함수(sum, count, avg 등의) 는 group by에 명시하지 않아도 됨