[프로그래머스] LEVEL4 서울에 위치한 식당 목록 출력하기(SQL)

Loopy·2023년 10월 12일
1

프로그래머스

목록 보기
27/32
post-thumbnail

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


🧐 문제 설명


😍 나의 풀이

  1. 공통된 컬럼을 가진 두 테이블 조인하기
  • 문제에서 식당 정보 REST_INFO 테이블과 식당의 리뷰 정보 REST_REVIEW 테이블이 있습니다. 두 테이블은 REST_ID라는 공통된 컬럼이 존재하기 때문에 이를 LEFT JOIN 하여 SELECT 하는 방법을 선택했습니다. 추출해야 하는 정보가 주로 식당 정보 REST_INFO 테이블에 있기 때문에 LEFT JOIN을 사용하였습니다.
  1. GROUP BY를 사용하여 그룹별 집계하기
  • 두 테이블을 JOIN 한 이후에, 식당 ID(REST_ID)에 대한 리뷰 점수들이 1:N으로 각각 존재할 수 있으며, 평균 점수를 구하는 것이 문제입니다. 따라서, 특정 컬럼을 기준으로 그룹화하여 사용하기 좋은 GROUP BY와 집계함수 AVG()를 사용하였습니다.
  1. HAVING을 사용하여 그룹별 집계한 데이터의 조건 넣기
  • 식당 ID인 REST_ID로 그룹화한 후에 HAVING을 사용하여 문제 조건을 만족하게 출력해야 합니다. 'WHERE절에 조건을 추가하면 안 되나? 왜 HAVING을 사용하냐?'라고 질문할 수 있습니다만, 우리는 SELECT에서 그룹화한 데이터를 추출하기 때문에 GROUP BY로 집계한 데이터의 조건절은 HAVING을 사용하여 추출해야 합니다.

위 문제에서는 조건에 2가지 정도 함정이 있는데 서울에 위치한 주소를 찾기 위하여 ADDRESS LIKE '%서울%'과 같이 사용해서는 안됩니다. '부산광역시 서울로 00000'과 같은 테스트 데이터가 있기 때문에 주소가 서울시 혹은 서울특별시로 시작하는 데이터만 추출해야 합니다.


또한 리뷰가 없는 식당의 경우 JOIN 이후에 SCORE 컬럼의 데이터가 NULL입니다. SCORE IS NOT NULL을 사용하여 리뷰가 없는 식당은 조회하지 않도록 주의해야 합니다.

SELECT I.REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS, ROUND(AVG(REVIEW_SCORE), 2) AS SCORE
FROM REST_INFO AS I
   LEFT JOIN REST_REVIEW AS R
   ON I.REST_ID = R.REST_ID
GROUP BY REST_ID
HAVING ADDRESS LIKE '서울%' AND SCORE IS NOT NULL
ORDER BY SCORE DESC, VIEWS DESC

🥇 Today I Learn

LEFT JOIN

SELECT 컬럼
FROM 테이블1
	LEFT JOIN 테이블2
	ON 조건(테이블1.컬럼 = 테이블2.컬럼)

서로 다른 두 테이블1, 2를 테이블1 기준으로 공통된 컬럼을 ON 조건에 넣어 JOIN 하는 방식입니다. 테이블2를 기준으로 출력하고 싶다면 RIGHT JOIN을 사용해도 되지만 테이블 순서만 (테이블1↔테이블2) 바꿔서 LEFT JOIN을 그대로 사용해도 됩니다.
profile
공부 쫌 해!!!😂

0개의 댓글