โค๏ธ ๋ฌธ์ ์ค๋ช
๋ค์์ ์๋น์ ์ ๋ณด๋ฅผ ๋ด์ 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๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ์ด๋ ๋ฆฌ๋ทฐ ํ๊ท ์ ์๋ ์์์ ์ธ ๋ฒ์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผ ํด์ฃผ์๊ณ ๊ฒฐ๊ณผ๋ ํ๊ท ์ ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํด์ฃผ์๊ณ , ํ๊ท ์ ์๊ฐ ๊ฐ๋ค๋ฉด ์ฆ๊ฒจ์ฐพ๊ธฐ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์.
๐ ์ถ๋ ฅ ์์
โ
๐ ํ์ด
์ฒซ๋ฒ์งธ ์๋ ๐ ๐ปโ๏ธ - ํ๋ฆผ
- ์ฃผ์๊ฐ ์์ธํน๋ณ์์ธ ์ปฌ๋ผ๋ง ์กฐ์ธํ๋๊น INNER JOIN ํจ.
- ๊ทธ๋ฆฌ๊ณ ADDRESS์ '์์ธํน๋ณ์%'๋ก ์์ํ๋ ์ปฌ๋ผ์ ์กฐํ
- B.REVIEW_SCORE์ ํ๊ท ์ ๋ด๊ณ , ๊ทธ ๊ฐ์ ROUND(COLUMN, DECIMAL PLACES)๋ก ๋ฌถ์ด ์์์ 2์งธ์ง๋ฆฌ๊น์ง ๋ฐ์ฌ๋ฆผ
- ์ ๊ฐ์ ALIAS์ ์ค์ SCORE ์ด๋ผ๊ณ ๋ช ๋ช
๋๋ฒ์งธ ์๋ ๐ ๐ปโ๏ธ - ํ๋ฆผ
์ผ๋จ ์ฒซ๋ฒ์งธ ์๋์์ ์๋ชป๋ ๋ถ๋ถ์ ๊ณ ์นจ.
โ ON ์ ์๋ JOIN ์กฐ๊ฑด์ผ๋ก A.REST_ID์ B.REST_ID๊ฐ ๊ฐ๋ค๋ ์ฟผ๋ฆฌ๋ฅผ ์จ ์ค์ผ ํ๊ณ
๋์ ์ฃผ์๊ฐ ์์ธํน๋ณ์๋ผ๋ ์กฐ๊ฑด์ WHERE ์ ์ ๋ค์ด๊ฐ์ผ ํจ.
(์์์๋ WHERE ์ ์ ๋ค์ด๊ฐ ์กฐ๊ฑด์ด ON ์ ์ ๋ค์ด๊ฐ ์์)
โ AVG(REVIEW_SCORE) => AVG(B.REVIEW_SCORE)
ํ๋ฆฐ ์ด์ ๋ฅผ ์์๋ค! REST_REIVEW ํ ์ด๋ธ์์ REST_ID ๋ณ๋ก GROUP BY๋ฅผ ํด ์ค์ผ ํจ
๊ทธ๋ฆฌ๊ณ ๋์ A ํ ์ด๋ธ์ด๋ JOIN ํด์ผ ํ๋๋ฐ B ํ ์ด๋ธ์ ์ธ๋ผ์ธ๋ทฐ(์๋ธ์ฟผ๋ฆฌ)๋ก ๋ง๋ค์ด์ REST_ID๋ณ ์ง๊ณ๋ฅผ ๋จผ์ ํด์ผ ํจ
๊ทธ๋ฆฌ๊ณ B์ REST_ID๋ณ ํ๊ท REVIEW_SCORE๋ฅผ ๊ณ์ฐํ ํ, ์ด ๊ฒฐ๊ณผ๋ฅผ A ํ ์ด๋ธ๊ณผ ์กฐ์ธ
์ธ๋ฒ์งธ ์๋ ๐ ๐ปโ๏ธ - ํ๋ฆผ
๋ ํ๋ ธ๋ค๊ณ ํฉ๋๋ค ใ ใ ใ ใ ใ ์ด๋๊ฐ ํ๋ฆฐ๊ฑฐ์ผ... ์คํ๋ ์ ๋๋๋ฐ ใ ใ
- ์ผ๋จ ๋ง์์ ๊ฑธ๋ฆฌ๋ ๋ถ๋ถ์ ์คํ๊ฒฐ๊ณผ์ฐฝ SCORE ์ด 5.00 ์ด๋ผ๋ ๊ฒ์
- ๋ญ๊ฐ ๊ณ์ฐ์ด ์ ๋๋ก ์ ๋ ๋๋์ ์ธ ๋๋
๋์ ํ ๋ชจ๋ฅด๊ฒ ์ => ๊ฒฐ๊ตญ ๊ฒ์ํจ
์ด ๋ฌธ์ ๋ ์๋ธ์ฟผ๋ฆฌ ์จ์ค ํ์๊ฐ ์๋ ๋ฌธ์ ์ด๋ฉฐ, GROUP BY ๋ HAVING ์ ์ ์ ์จ ์ฃผ๋ฉด ๋๋ ๋ฌธ์
๋ค๋ฒ์งธ ์๋ ๐โ๏ธ - ์ ๋ต๐ฅณ
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
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;
์์ ๋ ๋ค ๋ง๋ ์ฝ๋๊ณ ์ฒซ๋ฒ์งธ๋ REST_REVIEW๋ฅผ A๋ก ์ก์๊ณ ๋๋ฒ์งธ๋ REST_INFO๋ฅผ A๋ก ์ก์
๐๐ป ๊ธฐ์คํ ์ด๋ธ์ด A๊ฐ REST_INFO์ธ ๊ฒฝ์ฐ์ REST_REVIEW์ธ ๊ฒฝ์ฐ GROUP BY ์ ์ ๋ช ์ํด์ผ ํ๋ ์ปฌ๋ผ๋ค์ด ๋ค๋ฅธ ์ด์ ๐๐ป
having์ ์ ์กฐ๊ฑด์ ์ฐ๋ ๊ฒฝ์ฐ์ where ์ ์ ์ฐ๋ ๊ฒฝ์ฐ ์ฐจ์ด
โ SQL ๋ฌธ์ ์คํ ์์
FROM - WHERE - GROUP BY - HAVING SELECT - ORDER BY
SELECT department, COUNT(employee_id) AS total_employees
FROM employees
WHERE salary > 50000
GROUP BY department
HAVING COUNT(employee_id) > 5
ORDER BY total_employees DESC;
์ ์์ ์ฟผ๋ฆฌ์ ์คํ ์์๋
FROM: employees ํ ์ด๋ธ์ ์ ํ
WHERE: salary > 50000 ์กฐ๊ฑด์ ํตํด ์ง์๋ค์ ํํฐ๋ง
GROUP BY: ํํฐ๋ง๋ ๋ฐ์ดํฐ๋ฅผ department ๋ณ๋ก ๊ทธ๋ฃนํ
HAVING: ๊ฐ ๊ทธ๋ฃน์ ์ง์ ์๊ฐ 5๋ณด๋ค ๋ง์ ๊ทธ๋ฃน๋ง ์ ํ (์ง๊ณ ํจ์)
SELECT: department์ ๊ทธ๋ฃน๋น ์ง์ ์๋ฅผ ์ ํ
ORDER BY: ๊ฒฐ๊ณผ๋ฅผ ์ง์ ์์ ๋ฐ๋ผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ
โ WHERE ๊ณผ HAVING ์ ์ฌ์ฉ ์์
WHERE
- ์ฌ์ฉ ์์ : ๊ทธ๋ฃนํ ์ ์ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ ๋ ์ฌ์ฉ
- ์ ์ฉ ๋์: ๊ฐ๋ณ ํ์ ๊ธฐ์ค์ผ๋ก ์กฐ๊ฑด์ ์ ์ฉ
- ํน์ง: GROUP BY ๋๋ ์ง๊ณ ํจ์๊ฐ ์ฌ์ฉ๋๊ธฐ ์ ์ ์กฐ๊ฑด์ ๊ฑธ์ด์ผ ํ ๋ ์ ์ฉ
- ์์: WHERE age > 18์ฒ๋ผ ๊ทธ๋ฃนํ์ ํ๊ธฐ ์ ์ age ์ด์์ 18๋ณด๋ค ํฐ ํ๋ค๋ง ํํฐ๋งํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ
HAVING
- ์ฌ์ฉ ์์ : ๊ทธ๋ฃนํ ํ ๋๋ ์ง๊ณ ํจ์๊ฐ ์ฌ์ฉ๋ ๋ฐ์ดํฐ์ ์กฐ๊ฑด์ ์ ์ฉํ ๋ ์ฌ์ฉ
- ์ ์ฉ ๋์: ๊ทธ๋ฃนํ๋ ๊ฒฐ๊ณผ์ ๋ํด ์กฐ๊ฑด์ ๊ฑธ ๋ ์ ์ฉํ๋ฉฐ, ์ง๊ณ ํจ์๊ฐ ๋ค์ด๊ฐ ์กฐ๊ฑด์ ๊ฑธ ๋ ์ฃผ๋ก ์ฌ์ฉ
- ํน์ง: SUM, COUNT, AVG ๋ฑ ์ง๊ณ ํจ์๊ฐ ํฌํจ๋ ์กฐ๊ฑด์ ์ ์ฉํ ๋ ์ฌ์ฉ
- ์์: HAVING COUNT(*) > 1์ฒ๋ผ ํน์ ๊ทธ๋ฃน์ ์ง๊ณ ๊ฐ์ด ๊ธฐ์ค์ ๋ง์กฑํ๋์ง ํํฐ๋ง