๐SQL ๋ฌธ๋ฒ - GROUP BY & HAVING ๊ตฌ๋ถํ๊ธฐ
SQL์์ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ ๋ ๊ผญ ๋ฑ์ฅํ๋ ๋ ์น๊ตฌ,
GROUP BY ์ HAVING.
์ด ๋์ ํจ๊ป ์ฐ์ด์ง๋ง, ์ญํ ์ด ์์ ํ ๋ค๋ฆ
๋๋ค.
์ด๋ฒ ๊ธ์์๋ ๋ ๋ฌธ๋ฒ์ ์๋ฒฝํ๊ฒ ๊ตฌ๋ถํ๊ณ , ์ ๋๋ก ํ์ฉํ๋ ๋ฒ์ ์ตํ๋ด
๋๋ค!
โ GROUP BY๋?
GROUP BY
๋ ํน์ ์ปฌ๋ผ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํด์
๊ทธ๋ฃน๋ณ๋ก ์ง๊ณ ํจ์(SUM, COUNT ๋ฑ)๋ฅผ ์ ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ์ ์
๋๋ค.
SELECT ์ปฌ๋ผ๋ช
, ์ง๊ณํจ์
FROM ํ
์ด๋ธ๋ช
GROUP BY ๊ธฐ์ค์ปฌ๋ผ;
๐น ์์
๊ฐ์ custid ๊ฐ์ ๊ฐ์ง ํ๋ผ๋ฆฌ ๋ฌถ์ด์
๊ฐ ๊ทธ๋ฃน์ ๋ํด SUM(saleprice) ๊ณ์ฐ
-- ๊ณ ๊ฐ๋ณ ์ด ๊ตฌ๋งค ๊ธ์ก
SELECT custid, SUM(saleprice)
FROM Orders
GROUP BY custid;
โ HAVING์ด๋?
HAVING์ GROUP BY๋ก ๊ทธ๋ฃนํ๋ ๊ฒฐ๊ณผ์ ์กฐ๊ฑด์ ๊ฑธ ๋ ์ฌ์ฉํ๋ ์ ์
๋๋ค.
์ฆ, ๊ทธ๋ฃน ๋จ์์ ํํฐ๋ง์ ๋ด๋นํฉ๋๋ค.
SELECT ์ปฌ๋ผ๋ช
, ์ง๊ณํจ์
FROM ํ
์ด๋ธ๋ช
GROUP BY ๊ธฐ์ค์ปฌ๋ผ
HAVING ์กฐ๊ฑด;
๐น ์์
WHERE COUNT(*) >= 2๋ โ ๋ถ๊ฐ๋ฅ HAVING์ ์ง๊ณ ํจ์์ ํจ๊ป ์กฐ๊ฑด ์ง์ ๊ฐ๋ฅ
-- 2ํ ์ด์ ์ฃผ๋ฌธํ ๊ณ ๊ฐ๋ง ์กฐํ
SELECT custid, COUNT(*)
FROM Orders
GROUP BY custid
HAVING COUNT(*) >= 2;
๐ง WHERE vs HAVING ์ฐจ์ด
ํญ๋ชฉ | WHERE ์ | HAVING ์ |
์ ์ฉ ์์ | GROUP BY ์ด์ | GROUP BY ์ดํ |
๋์ | ๊ฐ๋ณ ํ(Row) | ๊ทธ๋ฃน(Group) |
์ง๊ณ ํจ์ ์ฌ์ฉ | โ ์ฌ์ฉ ๋ถ๊ฐ | โ ์ฌ์ฉ ๊ฐ๋ฅ |
์ฃผ์ฉ๋ | ๊ฐ๋ณ ๋ฐ์ดํฐ ํํฐ๋ง | ๊ทธ๋ฃนํ๋ ๊ฒฐ๊ณผ ํํฐ๋ง |
์ฌ์ฉ ์์น | SELECT ~ FROM ~ WHERE | SELECT ~ FROM ~ GROUP BY ~ HAVING |
๐งช ์ค์ ์์ ๋น๊ต
-- ์ถํ์ฌ๋ณ ๋์ ํ๊ท ๊ฐ๊ฒฉ ๊ตฌํ๊ธฐ
SELECT publisher, AVG(price) AS avg_price
FROM Book
GROUP BY publisher;
-- ํ๊ท ๊ฐ๊ฒฉ์ด 15,000์ ์ด์์ธ ์ถํ์ฌ๋ง
SELECT publisher, AVG(price)
FROM Book
GROUP BY publisher
HAVING AVG(price) >= 15000;
-- ๊ณ ๊ฐ ์ด๋ฆ + ์ด ๊ตฌ๋งค ๊ธ์ก ์ถ๋ ฅ
SELECT name, SUM(saleprice)
FROM Customer C, Orders O
WHERE C.custid = O.custid
GROUP BY name;
โ ์์ฃผ ํ๋ ์ค์
โ WHERE ์ ์ ์ง๊ณ ํจ์๋ฅผ ์ฐ๋ฉด ์ค๋ฅ ๋ฐ์
โ GROUP BY์ ํฌํจ๋์ง ์์ ์ปฌ๋ผ์ SELECT์์ ์ฌ์ฉํ๋ฉด ์ค๋ฅ ๋ฐ์
-- ์: ์ค๋ฅ ๋ฐ์
SELECT publisher, price
FROM Book
GROUP BY publisher; -- price๋ ๊ทธ๋ฃน ๊ธฐ์ค์ด ์๋
โ ์ด๋ด ๊ฒฝ์ฐ MAX(price) ๋๋ AVG(price)์ฒ๋ผ ์ง๊ณ ํจ์๋ก ๊ฐ์ธ์ค์ผ ํจ
๐ฆ ์์ฉ ์์ ๋ชจ์
-- ์ถํ์ฌ๋ณ ๋์ ํ๊ท ๊ฐ๊ฒฉ์ด 15,000 ์ด์์ธ ๊ฒฝ์ฐ๋ง
SELECT publisher, AVG(price) AS avg_price
FROM Book
GROUP BY publisher
HAVING AVG(price) >= 15000;
-- ๊ณ ๊ฐ๋ณ ์ด๊ตฌ๋งค๊ธ์ก์ด 5๋ง ์ ์ด์
SELECT custid, SUM(saleprice)
FROM Orders
GROUP BY custid
HAVING SUM(saleprice) >= 50000;
๐ ๋ง๋ฌด๋ฆฌ
ํญ๋ชฉ | ์ค๋ช |
GROUP BY | ํน์ ์ปฌ๋ผ ๊ธฐ์ค์ผ๋ก ํ๋ค์ ๊ทธ๋ฃนํํจ |
์ง๊ณ ํจ์ ์ฌ์ฉ |
|
HAVING | ๊ทธ๋ฃนํ ๊ฒฐ๊ณผ์ ์กฐ๊ฑด์ ์ถ๊ฐํจ (์ง๊ณ ํจ์์ ํจ๊ป ์ฌ์ฉ) |
WHERE์์ ์ฐจ์ด | WHERE๋ ํ ํํฐ๋ง, HAVING์ ๊ทธ๋ฃน ํํฐ๋ง (์ง๊ณ ํจ์ ์ฌ์ฉ ์ฌ๋ถ์ ์ฃผ์) |
์ฃผ์์ฌํญ | SELECT์ ๋์ค๋ ์ปฌ๋ผ์ ๋๋ถ๋ถ GROUP BY์๋ ํฌํจ๋์ด์ผ ํจ |
๐ ํ์ต ํ
โข GROUP BY ์์ด HAVING๋ง ์ฐ๋ ๊ฑด โ (ํญ์ ์ง๊ฟ!)
โข SELECT์ ๋์ค๋ ์ปฌ๋ผ์ ๋๋ถ๋ถ GROUP BY์๋ ์์ด์ผ ์์
โข HAVING์ ํญ์ ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ํํฐ๋งํ๋ค๋ ์ ์ ๊ธฐ์ตํ์