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

Saemi Min·2023년 2월 13일
0

MySQL

목록 보기
4/21
post-thumbnail

문제

해당 문제 링크

정답

정답 1

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

정답 2

SELECT RI.REST_ID, RI.REST_NAME, RI.FOOD_TYPE, RI.FAVORITES, RI.ADDRESS, ROUND(AVG(RR.REVIEW_SCORE),2) AS SCORE
FROM REST_INFO RI
JOIN REST_REVIEW RR
ON RI.REST_ID =RR.REST_ID
GROUP BY RR.REST_ID
HAVING RI.ADDRESS LIKE '서울%'
ORDER BY SCORE DESC, RI.FAVORITES DESC

문법

그룹화하여 데이터 조회(GROUP BY)

  • 특정 컬럼을 그룹화 하는 GROUP BY
  • 특정 컬럼을 그룹화한 결과에 조건을 거는 HAVING
  • WHERE랑 HAVING을 헷깔리는 경우가 많은데 WHERE는 그룹화 하기 전이고, HAVING은 그룹화 후에 조건입니다.
  1. 컬럼 그룹화
SELECT 컬럼 FROM 테이블 GROUP BY 그룹화할 컬럼;
  1. 조건 처리 후에 컬럼 그룹화
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화할 컬럼;
  1. 컬럼 그룹화 후에 조건 처리
SELECT 컬럼 FROM 테이블 GROUP BY 그룹화할 컬럼 HAVING 조건식;
  1. 조건 처리 후에 컬럼 그룹화 후에 조건 처리
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화할 컬럼 HAVING 조건식;
  1. ORDER BY가 존재하는 경우
SELECT 컬럼 FROM 테이블 [WHERE 조건식]
GROUP BY 그룹화할 컬럼 [HAVING 조건식] ORDER BY 컬럼1 [, 컬럼2, 컬럼3 ...];

테이블 합치기

결합연산 (JOIN)
: 테이블을 가로 방향으로 붙이는 연산
1. LEFT OUTER JOIN: 왼쪽 테이블을 기준으로 합쳐짐 (왼쪽 테이블에 존재하는 row만 보여짐)
2. RIGHT OUTER JOIN: 오른쪽 테이블을 기준으로 합쳐짐 (오른쪽 테이블에 존재하는 row만 보여짐)
3. INNER JOIN: 왼쪽, 오른쪽 테이블 모두에 존재하는 row만 추려서 합쳐짐 (교집합 개념)
MySQL에서는 JOIN, INNER JOIN, CROSS JOIN이 모두 같은 의미로 사용

특정 문자포함 검색 LIKE

: LIKE 연산자는 특정 문자가 포함되어 있는 데이터를 검색 할때 사용한다.
1. 특정 문자로 시작하는 데이터 검색

SELECT [필드명] FROM [테이블명] WHERE [필드명] LIKE '특정 문자열%';
  1. 특정 문자로 끝나는 데이터 검색
SELECT [필드명] FROM [테이블명] WHERE [필드명] LIKE '%특정 문자열';
  1. 특정 문자를 포함하는 데이터 검색
SELECT [필드명] FROM [테이블명] WHERE [필드명] LIKE '%특정 문자열%';

반올림 / 버릴 자릿수

  • ROUND(숫자, 반올림할 자릿수) : 숫자를 반올림할 자릿수+1 자릿수에서 반올림

정렬

ORDER BY절
: 특정 속성을 기준으로 정렬하여 검색할 때 사용
= ASC :오름차순 (생략하면 오름차순)
= DESC : 내림차순

해석 및 조심할 부분

두 가지 기준으로 정렬할 때 아래 코드와 같이 연속으로 작성하면 됨.

ORDER BY SCORE DESC, RI.FAVORITES DESC

<REST_INFO>

<REST_INFO>

정답 코드는 아래와 같다.

SELECT RI.REST_ID, RI.REST_NAME, RI.FOOD_TYPE, RI.FAVORITES, RI.ADDRESS, ROUND(AVG(RR.REVIEW_SCORE),2) AS SCORE
FROM REST_INFO RI
JOIN REST_REVIEW RR
ON RI.REST_ID =RR.REST_ID
GROUP BY RI.REST_ID
HAVING RI.ADDRESS LIKE '서울%'
ORDER BY SCORE DESC, RI.FAVORITES DESC

LEFT OUTER JOIN REST_REVIEW RR으로 바꾸면 안됐던 이유
후기가 없는 음식점이 존재했기 때문에 한쪽으로 치우쳐져 JOIN 하면 안됐고, 교집합으로 했어야 했다!

GROUP BY는 왜 쓰는걸까?
그룹화를 안하고 WHERE RI.ADDRESS LIKE '서울%'를 썼다면, REST_ID가 1만 나온다

profile
I believe in myself.

0개의 댓글