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 |
'DB > DB 문제풀이' 카테고리의 다른 글
[프로그래머스] Lv.1 강원도에 위치한 생산공장 목록 출력하기 (0) | 2024.07.20 |
---|---|
[프로그래머스] Lv.1 인기있는 아이스크림 (0) | 2024.07.20 |
[프로그래머스] Lv.1 흉부외과 또는 일반외과 의사 목록 출력하기 (0) | 2024.07.20 |
[프로그래머스] Lv.2 3월에 태어난 여성 회원 목록 출력하기 (0) | 2024.07.20 |
[프로그래머스] Lv.1 조건에 부합하는 중고래 댓글 조회하기 (0) | 2024.07.20 |