본문 바로가기
DB/DB 문제풀이

[프로그래머스] Lv.4 서울에 위치한 식당 목록 출력하기

by kKkKkKWJ 2024. 7. 20.

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

 

프로그래머스

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

programmers.co.kr

 

📌 문제

다음은 식당의 정보를 담은 REST_INFO 테이블과

식당의 리뷰 정보를 담은 REST_REVIEW 테이블입니다.

 

REST_INFO 테이블은 다음과 같으며

REST_ID, REST_NAME, FOOD_TYPE, VIEWS, FAVORITES, PARKING_LOT, ADDRESS, TEL은

식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.

 

REST_REVIEW 테이블은 다음과 같으며

REVIEW_ID, REST_ID, MEMBER_ID, REVIEW_SCORE, REVIEW_TEXT, REVIEW_DATE는

각각 리뷰 ID, 식당 ID, 회원 ID, 점수, 리뷰 텍스트, 리뷰 작성일을 의미합니다. 

 

REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의

식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요.

이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고

결과는 평균점수를 기준으로 내림차순 정렬해주시고,

평균점수가 같다면 즐겨찾기 수를 기준으로 내림차순 정렬해주세요.

 

📌 풀이

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

📌 관련 개념 정리

- 반올림

ROUND(column, 반올림 자릿수)

반올림 자릿수를 생략하면 소수점 첫 번째 자리로 반올림한다.

반올림 자릿수를 1로 하면 소숫점 첫 번째 자리까지 표시된다.

 

반올림 자릿수는 음수도 가능하며, -1은 1의 자릿수를 반올림 하는 것이다.

예를 들어, 아래의 결과는 120이다.

SELECT ROUND(123.456, -1);

 

 

- 집계함수

그룹화된 데이터에 대해 계산을 수행하여 요약된 결과를 반환한다.

테이블 전체를 대상으로 집계 연산을 수행하면 GROUP BY절이 필요 없으며

특정 그룹 별로 집계 연산을 수행할 때 GROUP BY절을 사용한다.

COUNT() 컬럼의 NULL 값을 제외한 모든 행의 수를 센다.
SUM() 지정된 컬럼의 합계를 반환한다.
AVG() 지정된 컬럼의 평균값을 반환한다.
MIN() 지정된 컬럼의 최소값을 반환한다.
MAX() 지정된 컬럼의 최대값을 반환한다.

 

 

- 조인(JOIN)

두 개 이상의 테이블을 합쳐서 테이블을 조회하는데 사용한다.

 

INNER JOIN, OUTER JOIN 등이 있다.

OUTER JOIN은 LEFT, RIGHT, FULL로 또 다시 나눌 수 있다.

 

아래의 예시로 각 JOIN을 설명해보자.

 

INNER JOIN

두 테이블에서 일치하는 행만 반환한다. 공통된 값을 기반으로 데이터를 결합한다.

SELECT A.*, B.*
FROM TableA A
INNER JOIN TableB B
ON A.common_column = B.common_column;
id name id city
1 Alice 1 New York

 

 

LEFT JOIN

왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 해을 반환한다.

일치하는 값이 없으면 NULL을 반환한다.

SELECT A.*, B.*
FROM TableA A
LEFT JOIN TableB B
ON A.common_column = B.common_column;
id name id city
1 Alice 1 New York
2 Bob NULL NULL

 

 

RIGHT JOIN

오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 해을 반환한다.

일치하는 값이 없으면 NULL을 반환한다.

SELECT A.*, B.*
FROM TableA A
RIGHT JOIN TableB B
ON A.common_column = B.common_column;
id name id city
1 Alice 1 New York
NULL NULL 3 London

 

 

FULL OUTER JOIN

두 테이블의 모든 행을 반환한다. 일치하지 않는 경우 NULL값을 포함한다.

LEFT JOIN과 RIGHT JOIN의 합이라고 생각하면 쉽다.

SELECT A.*, B.*
FROM TableA A
FULL OUTER JOIN TableB B
ON A.common_column = B.common_column;
id name id city
1 Alice 1 New York
2 Bob NULL NULL
NULL NULL 3 London