프로그래머스에서 제공하는 SQL문제 매일 풀기 챌린지
문제 설명
다음은 식당의 정보를 담은 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문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.
예시
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
'SQL 문제 풀기 > 1. 프로그래머스 SQL : 2023.12.17~2024.2.29' 카테고리의 다른 글
<프로그래머스 68> 저자 별 카테고리 별 매출액 집계하기(Lv.4) (0) | 2024.02.22 |
---|---|
<프로그래머스 67> 년, 월, 성별 별 상품 구매 회원 수 구하기(Lv.4) (0) | 2024.02.21 |
<프로그래머스 65> 취소되지 않은 진료 예약 조회하기(Lv.4) (0) | 2024.02.19 |
<프로그래머스 64> 5월의 식품들의 총매출 조회하기(Lv.4) (0) | 2024.02.18 |
<프로그래머스 63> 식품분류별 가장 비싼 식품의 정보 조회하기(Lv.4) (2) | 2024.02.17 |