์ฟผ๋ฆฌ1
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
GROUP BY B.REST_ID
HAVING A.ADDRESS LIKE '์์ธ%'
ORDER BY SCORE DESC, A.FAVORITES DESC
์ฟผ๋ฆฌ 2
SELECT A.REST_ID, B.REST_NAME, B.FOOD_TYPE, B.FAVORITES, B.ADDRESS,
ROUND(AVG(A.REVIEW_SCORE),2) AS SCORE
FROM REST_REVIEW A
JOIN REST_INFO B ON A.REST_ID = B.REST_ID
GROUP BY A.REST_ID
HAVING B.ADDRESS LIKE '์์ธ%'
ORDER BY SCORE DESC, B.FAVORITES DESC
์ ์ฟผ๋ฆฌ1์ ํ๋ ธ๊ณ , ์ฟผ๋ฆฌ2๋ ๋ง๋๊ฑด์ง ๋ชจ๋ฅด๊ฒ ์
๊ทธ๋ฅ ๊ธฐ์ค ํ ์ด๋ธ๋ง ๋ค๋ฅผ ๋ฟ์ธ๋ฐ....
์์ชฝ ์ฝ๋๋ REST_INFO๋ฅผ A๋ก, REST_REVIEW๋ฅผ B๋ก ํด์ JOINํ ์ฟผ๋ฆฌ์ด๋ค
์๋ ์ฝ๋๋ REST_REVIEW๋ฅผ A๋ก, REST_INFO๋ฅผ B๋ก ํด์ JOINํ ์ฟผ๋ฆฌ์ด๋ค
ํด๋น ์ฟผ๋ฆฌ๋ฅผ ๋น๊ตํ๊ธฐ ์์ ์ฟผ๋ฆฌ2์ ๊ธฐ์ค์ ์ Aํ ์ด๋ธ๋ก ๊ณ ์ณ๋ณด๊ฒ ๋ค
๋ ๋ค REST_INFO๊ฐ A ํ ์ด๋ธ์ด ๋๋ ๊ฑธ๋ก ์ก์๋ณด๊ฒ ๋ค
์ฟผ๋ฆฌ1 (ํ๋ฆฐ ์ฟผ๋ฆฌ)
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
GROUP BY B.REST_ID
HAVING A.ADDRESS LIKE '์์ธ%'
ORDER BY SCORE DESC, A.FAVORITES DESC
์ฟผ๋ฆฌ2 (๋ง๋ ์ฟผ๋ฆฌ)
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
JOIN REST_REVIEW B ON A.REST_ID = B.REST_ID
GROUP BY A.REST_ID, A.REST_NAME, A.FOOD_TYPE, A.FAVORITES, A.ADDRESS
HAVING A.ADDRESS LIKE '์์ธ%'
ORDER BY SCORE DESC, A.FAVORITES DESC;
๋ ์ฟผ๋ฆฌ์ ์ฐจ์ด๋ GROUP BY ์
๊ทธ๋ฃนํ ํด ์ค๋, ์ฟผ๋ฆฌ2์ ๊ฒฝ์ฐ ๋ชจ๋ ์ปฌ๋ผ ๋์์ผ๋ก GROUP BY๋ฅผ ํ์
REST_INFO๋ฅผ A ํ ์ด๋ธ๋ก ์กฐ์ธํ๋ฉด
GROUP BY ์ ์ A.REST_NAME, A.FOOD_TYPE, A.FAVORITES, A.ADDRESS๋ฅผ ๋ชจ๋ ๋ช ์ํจ
๋ฐ๋ฉด REST_REVIEW ํ ์ด๋ธ์ด A๊ฐ ๋๊ณ , REST_INFO ํ ์ด๋ธ์ด B ์ด๋ฉด B.REST_ID๋ง GROUP BY์ ์ ๋ค์ด๊ฐ
์ ์ด๋ ๊ฒ ํด์ผ ํ๋๊ฑฐ์ง?
SQL์์ SELECT ๊ตฌ๋ฌธ์ ํฌํจ๋ ๋ชจ๋ ๋น์ง๊ณ ์ด์ GROUP BY ์ ์ ๋ช ์ํด์ผ ํ๋ค๊ณ ํจ
SELECT restaurant_id, restaurant_name, AVG(review_score)
FROM restaurant_reviews
GROUP BY restaurant_id; -- OK
SELECT restaurant_id, restaurant_name, AVG(review_score)
FROM restaurant_reviews
GROUP BY restaurant_id; -- ERROR! restaurant_name๋ GROUP BY์ ํฌํจ๋์ด์ผ ํจ
์์ ๊ฐ์ ๊ฒฝ์ฐ, restaurant_name์ด GROUP BY ์ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋จ
REST_REVIEW ํ ์ด๋ธ์ A๋ก ์ฌ์ฉํ์ ๋ GROUP BY ์ ์ REST_ID ์ปฌ๋ผ๋ง ์์ด๋ ๋๋ ์ด์ ๋ SQL์์ ์ง๊ณ ํจ์์ ๋น์ง๊ณ ์ด์ ์ฒ๋ฆฌ ๋ฐฉ์ ๋๋ฌธ.
GROUP BY ์ ์ ๋ชจ๋ ๋น์ง๊ณ ์ด์ด ํฌํจ๋์ด์ผ ํ๋ค๋ ๊ท์น์, ์ ํ๋ ์ด์ด ํน์ ๊ทธ๋ฃน์ ์ํ๋ ๋ฐ์ดํฐ์ ์ฐ๊ฒฐ๋ ์ ์๋๋ก ํ๊ธฐ ์ํด์ด๋ค. ํ์ง๋ง REST_REVIEW ํ ์ด๋ธ์์ REST_ID๋ง ์ฌ์ฉํ๋ฉด, ๊ทธ ๊ทธ๋ฃน์ ๋ชจ๋ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์ ๋ํด ํ๊ท ์ ๊ณ์ฐํ ์ ์๋ค. ์ฆ, GROUP BY๊ฐ REST_REVIEW ํ ์ด๋ธ ๋ด์์ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ๊ทธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ก๋ง ํ๊ท ๊ฐ์ ๊ณ์ฐํ๋ฏ๋ก ์ถ๊ฐ์ ์ธ ๋น์ง๊ณ ์ด์ด ํ์ ์๋๊ฒ. ์ฆ,
ํด๋น ๊ทธ๋ฃน์ REST_ID๋ ๋ช ํํ๊ฒ ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํ๋ฏ๋ก, ๋ค๋ฅธ ๋น์ง๊ณ ์ด(REVIEW_SCORE)์ ํฌํจ๋ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ.
์๋ ์ฝ๋๋ฅผ ๋ณด์
SELECT A.REST_ID, ROUND(AVG(A.REVIEW_SCORE), 2) AS SCORE
FROM REST_REVIEW A
GROUP BY A.REST_ID
HAVING ...;
์ด ๊ฒฝ์ฐ, A.REST_ID์ ๋ฐ๋ผ ๊ทธ๋ฃนํํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ ํ๊ท ๋ฆฌ๋ทฐ ์ ์๋ฅผ ๊ณ์ฐํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ์ ๋ณด๊ฐ REST_REVIEW ํ ์ด๋ธ ์์ ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋น์ง๊ณ ์ด์ด ์์ด๋ ์ฟผ๋ฆฌ๊ฐ ์ฑ๋ฆฝํจ.
์์ฝ
- GROUP BY ์ ์ ๋ช ์ํ๋ ๋น์ง๊ณ ์ด์ ์ ํํ ํ ์ด๋ธ์ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๋ค.
- REST_REVIEW๋ฅผ A๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ, REST_ID๋ง์ผ๋ก๋ ์ถฉ๋ถํ ํ๊ท ์ ์๋ฅผ ๊ณ์ฐํ ์ ์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ๋น์ง๊ณ ์ด์ด ํ์ํ์ง ์๋ค.