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
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
- 특정 컬럼을 그룹화한 결과에 조건을 거는 HAVING
- WHERE랑 HAVING을 헷깔리는 경우가 많은데 WHERE는 그룹화 하기 전이고, HAVING은 그룹화 후에 조건입니다.
- 컬럼 그룹화
SELECT 컬럼 FROM 테이블 GROUP BY 그룹화할 컬럼;
- 조건 처리 후에 컬럼 그룹화
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화할 컬럼;
- 컬럼 그룹화 후에 조건 처리
SELECT 컬럼 FROM 테이블 GROUP BY 그룹화할 컬럼 HAVING 조건식;
- 조건 처리 후에 컬럼 그룹화 후에 조건 처리
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화할 컬럼 HAVING 조건식;
- 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 연산자는 특정 문자가 포함되어 있는 데이터를 검색 할때 사용한다.
1. 특정 문자로 시작하는 데이터 검색SELECT [필드명] FROM [테이블명] WHERE [필드명] LIKE '특정 문자열%';
- 특정 문자로 끝나는 데이터 검색
SELECT [필드명] FROM [테이블명] WHERE [필드명] LIKE '%특정 문자열';
- 특정 문자를 포함하는 데이터 검색
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만 나온다