์นดํ ๊ณ ๋ฆฌ ์ด๋ณด์๋ ์ค๋นํ๋ SQL ์ฝ๋ฉ ํ ์คํธ์ ๊ฐ์๋ฉด ํด๋น ์๋ฆฌ์ฆ๋ฅผ ํ์ธํ์ค ์ ์์ต๋๋ค.
- ํด๋น ์๋ฆฌ์ฆ๋ฅผ ์์ํ๋ฉฐ
- ๊ธฐ์ด ์ด๋ก ๋ค์ง๊ธฐ
- ์ด๋ณด์๋ ์ค๋นํ๋ SQL ์ฝ๋ฉ ํ ์คํธ ์๋ฆฌ์ฆ๋ฅผ ๋ง์น๋ฉฐ ๋ถ์ -์ด์ ๋ญ ํด์ผ ํ๋์?
๋ชฉ์ฐจ
- ์ง๊ณ ํจ์
- AVG, MIN, MAX, COUNT
- ์ค์ต ํด๋ณด๊ธฐ
- ํผ์ ์๊ฐํด๋ณด๊ธฐ
- GROUP BY
- ๊ธฐ๋ณธ์ ์ธ GROUP BY ํ์
- GROUP BY๋ฅผ ๋ ๊น๊ฒ ์ฌ์ฉํ๊ธฐ
- ํผ์ ์๊ฐํด๋ณด๊ธฐ
- HAVING
- ์ HAVING์ด ํ์ํ ๊น
- HAVING์ ์ฌ์ฉํ๊ธฐ
์ง๋ ์๊ฐ์ ์ฐ๋ฆฌ๋ SELECT์ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ SELECT์ ํจ๊ผ ์ฐ์ผ ์ ์๋ WHERE, ORDER BY์ ๋ํด์ ๋ฐฐ์ ๋ค.
์ด๋ฒ ์๊ฐ์๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฌถ์ด์ฃผ๋ GROUP BY์ ๋ํด์ ์์๋ณด์.
GROUP BY ์ ์ SQL ์ฝ๋ฉ ํ
์คํธ์์ ์์ฃผ ์ถ์ ๋๋ ์ ํ์ค ํ๋์ด๋ค.
์ง๊ณ ํจ์
์ง๊ณ ํจ์๋ ํน์ ๊ฐ๋ค์ ๋ง ๊ทธ๋๋ก ์ง๊ณ ํ ๋ ์ฌ์ฉ๋๋ค.
์ง๊ณ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ข ๋ฅ๊ฐ ์กด์ฌํ๋ค.
๊ทธ ์ค์ ๋ํ์ ์ธ 4๊ฐ์ง๋ฅผ ๋ด๋ณด์.
AVG
: ํ๊ท ์ ๊ตฌํ๋ ์ง๊ณMIN
: ์ต์๋ฅผ ๊ตฌํ๋ ์ง๊ณMAX
: ์ต๋๋ฅผ ๊ตฌํ๋ ์ง๊ณCOUNT
: ์ด ๊ฐ์๋ฅผ ๊ตฌํ๋ ์ง๊ณ
๊ทธ๋ผ ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
buytb1 ์์ ์ด ์ผ๋งํผ ์ฃผ๋ฌธ๋์๋์ง ์ด ์ฃผ๋ฌธ๋์ ์ถ๋ ฅํ๋ผ
SELECT sum(amount)
FROM buytb1;
usertb1 ์์ ์ฌ์ฉ์๋ค์ ํ๊ท ํค๋ฅผ ์ถ๋ ฅํ๋ผ
SELECT avg(height)
FROM usertb1;
์ด๋ฐ ์ง๊ณ ํจ์๋ ์ฌ์ฉ๋ ์ ์๋ ์ฟผ๋ฆฌ๋ฌธ ์์ญ์ด ๋งค์ฐ ๋ค์ํ๋ฉฐ, ์์ฃผ ์ฌ์ฉ๋ ์ ์๋ค.
๊ทธ ๋ง์ ์ฝ๋ฉ ํ
์คํธ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฐ ์ง๊ณ ํจ์๋ฅผ ์ด์ฉํ๋ ๋ฌธ์ ๊ฐ ์์ฃผ ์ถ์ ๋ ์ ์๋ค๋ ์๋ฆฌ์ด๋ค.
ํผ์ ์๊ฐํด๋ณด์!
๋ง์ฝ usertb1 ์์ ํค๊ฐ ๊ฐ์ฅ ํฐ ์ฌ์ฉ์์ ํค๊ฐ ๊ฐ์ฅ ์์ ์ฌ์ฉ์์ ์ด๋ฆ์ ์ถ๋ ฅํ๋ผ! ๋ผ๊ณ ํ๋ค๋ฉด ์ด๋ค ์ฟผ๋ฆฌ๋ฌธ์ด ๋์ฌ๊น?
๋ถ๋ช ์ฌ๋ฌ๋ถ์ ํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
๋ชป ํด๋ ์ข์ต๋๋ค. ์ด๊ฑด ๊ฝค๋ ์ด๋ ค์ด ๋ฌธ์ ์์! ์์ฃผ ์ด๋ ต์ง๋ง ์ฌ๋ฌ๋ฒ ๋ณด๊ณ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด ํ ์ ์์ผ๋ ๊ฑฑ์ ํ์ง ๋ง์ธ์ :)
์ง๊ธ์ ๋ชฐ๋ผ๋ ์๋ง ํ 80% ์์ํ๋๋ฐ, ์๋ง ์ด๋ก ์๋ฆฌ์ฆ๋ง ๋๋ด๋ฉด ์ด ๋ฌธ์ ์ค์ค๋ก ํ ์ ์์๊ฑธ์?
๋ง์ฝ ๋ต์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ๋น๋ฐ ๋๊ธ๋ ์ข์ผ๋ ๋ฌ์์ฃผ์ธ์ ใ ใ
GROUP BY
SELECT ํ๋๋ช
FROM ํ
์ด๋ธ๋ช
GROUP BY ํ๋๋ช
ํน์ ํํ์
์ฐ์ GROUP BY์ ๋ํด์ ์๊ธฐ ์ ์ ์ด๋์ ์ฌ์ฉ๋๋์ง ์์ ๋ฅผ ๋จผ์ ์ ํ๊ณ ์ดํดํด๋ณด์.
- 1 buytb1 ์์ ๋ฌผํ ๋ณ๋ก ์ด ๋ช ๊ฐ๊ฐ ์ฃผ๋ฌธ๋์๋์ง ์ถ๋ ฅํ๋ผ
- 2 usertb1 ์์ ์ง์ญ ๋ณ๋ก ์ฌ์ฉ์๋ค์ ํค ํ๊ท ์ด ๋ช์ธ์ง ์ถ๋ ฅํ๋ผ
- 3 usertb1 ์์ ๋ฒํธ ์ ์๋ฆฌ(010์ธ์ง 011์ธ์ง) ๋ณ๋ก ๋ช ๋ช ์ด ์๋์ง ์ถ๋ ฅํ๋ผ.
- 4 buytb1 ์์ ๋ฌผํ ๋ณ๋ก ๊ฐ์ฅ ๋ง์ด ์ฃผ๋ฌธ๋ ๊ฒ์ ์ถ๋ ฅํ๋ผ
GROUP BY๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์ 4๊ฐ ์ฟผ๋ฆฌ๋ฅผ ํผ์์ ํ ๋ฒ ์ํํด๋ณด์.
์ฝ์ง ์์ ๊ฒ์ด๋ค. ์ด ๊ณผ์ ์ ๊ฑฐ์น๋ค๋ฉด ์ ์ฐ๋ฆฌ๋ GROUP BY ํจ์๋ฅผ ์จ์ผํ๋์ง ์์ฃผ ์ง๊ด์ ์ด๊ฒ ์ดํดํ ์ ์์ ๊ฒ์ด๋ค.
์์ ๋์จ ๋ฌธ์ ๋ค์ ๋ชจ๋ GROUP BY ์ ์ด ์ฌ์ฉ๋์ด์ผ ์ถ๋ ฅํ ์ ์๋ค.
๊ทธ๋ผ ๊ณตํต์ ์ ํ ๋ฒ ์ฐพ์๋ณด์.
- ์ด ๋ช๊ฐ, ํ๊ท ์ด ๋ช ๋ช , ๊ฐ์ฅ ํฐ, ๋ช ๋ช ์ด ์๋์ง์ ๊ฐ์ ์ง๊ณ ํจ์๊ฐ ์ฌ์ฉ๋์๋ค.
- xx ๋ณ๋ก๋ผ๋ ๋ง์ด ์ฐ์๋ค.
์ด ๋์ ์ข ํฉํด์ ๋ณธ๋ค๋ฉด, GROUP BY๋ ์ง๊ณ ํจ์๋ฅผ ํตํด์ xx ๋ณ๋ก ๊ทธ๋ค ๋ง์ ๊ทธ๋ฃน์ ๋ง๋ค์ด์ฃผ๋ ํจ์๋ผ๊ณ ์ ์ํ ์ ์๋ค.
๊ทธ๋ผ ๊ฐ๊ฐ์ ๋ฌธ์ ์ ๋ํด์ ์ฟผ๋ฆฌ๋ฅผ ์งํํ ์ ์๋ค.
/* 1๋ฒ buytb1 ์์ **๋ฌผํ ๋ณ๋ก** ์ด ๋ช ๊ฐ๊ฐ ์ฃผ๋ฌธ๋์๋์ง ์ถ๋ ฅํ๋ผ */
SELECT prodname, count(amount)
FROM buytb1
GROUP BY prodname;
/* 2๋ฒ usertb1 ์์ **์ง์ญ ๋ณ๋ก** ์ฌ์ฉ์๋ค์ ํค ํ๊ท ์ด ๋ช์ธ์ง ์ถ๋ ฅํ๋ผ */
SELECT addr, avg(height)
FROM usertb1
GROUP BY addr;
/* 3๋ฒ usertb1 ์์ **๋ฒํธ ์ ์๋ฆฌ(010์ธ์ง 011์ธ์ง) ๋ณ๋ก** ๋ช ๋ช
์ด ์๋์ง ์ถ๋ ฅํ๋ผ.
*/
SELECT mobile1, count(*)
FROM usertb1
GROUP BY mobile1;
/* 4๋ฒ buytb1 ์์ **๋ฌผํ ๋ณ๋ก** ๊ฐ์ฅ ๋ง์ด ์ฃผ๋ฌธ๋ ๊ฒ์ ์ถ๋ ฅํ๋ผ */
SELECT prodname, max(amount)
FROM buytb1
GROUP BY prodname;
GROUP BY ํจ์๋ฅผ ์ข ๋ ๊น๊ฒ ์ฌ์ฉํด๋ณด์.
buytb1 ์์ ์ฌ์ฉ์๋ค์ ์ด ๊ตฌ๋งค ๊ธ์ก์ ์ถ๋ ฅํ๋ผ.
์ฐ์ ์ฐ๋ฆฌ๋ ์ฌ์ฉ์ ๋ณ๋ก ๊ตฌ๋งค ๊ธ์ก์ ๋ฐ๋ก ๋๋ ์ผ ํ๋ ์ฌ์ฉ์๋ฅผ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด์ค์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ์ ์ด ๊ตฌ๋งค ๊ธ์ก์ ๊ณ์ฐํด๋ณด์.
SELECT userid, amount * price
FROM buytb1;
์ ์ํํ๋ฉด ๊ฐ๊ฐ ์ฌ์ฉ์์ ๋ฌผํ๋ณ ๊ตฌ๋งค ๊ธ์ก์ด ๋์จ๋ค.
์ฐ๋ฆฌ๋ ์ด ๋ฌผํ๋ณ ๊ตฌ๋งค ๊ธ์ก์ ๋ชจ๋ ํฉ์ฐํด์ผ ํ๋ฏ๋ก sum์ ์ด์ฉํด ์ง๊ณํ ์ ์๋ค.
SELECT userid, sum(amount * price)
FROM buytb1;
์ค ๊ทผ๋ฐ ์๋ฌ๊ฐ ๋๋ค.
์๋? ์ง๊ณ ํจ์๋ก ์ง๊ณ๋ฅผ ํ ๊ฒฐ๊ณผ๊ฐ ์ด๋ค ๊ทธ๋ฃน์ ์ํด์ผ ํ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์.
userid๋ ์ฌ๋ฌ ๊ฐ๊ฐ ์กด์ฌํ๋๋ฐ, ๊ทธ ์ค ์ด๋์ ์ํด์ผ ํ ์ง ๋ฏ๋ก๋ฏ๋ก userid๋ก GROUP ์ง์ด์ฃผ๋ฉด ๋๋ค.
SELECT userid, sum(amount * price)
FROM buytb1
GROUP BY userid;
๊ทธ๋ผ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ์์ฃผ ์๋ฆ๋ต๊ฒ ์ ๋์ค๊ฒ ๋๋ค.
ํผ์ ์๊ฐํด๋ณด์!
๋ง์ฝ buytb1์์ ์ฌ์ฉ์๋ค์ด ํ๊ท ์ ์ผ๋ก ๋ช ๊ฐ์ ๋ฌผ๊ฑด์ ์๋์ง ์ถ๋ ฅํ๋ผ๊ณ ํ๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
์ด ๋ฌธ์ ๋ํ ๋ชป ํด๋ ์ข์ต๋๋ค. ์์ ๋ง ํ๋ฏ ์ฌ๋ฌ๋ฒ ๋ณด๊ณ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด ํ ์ ์์ผ๋ ๊ฑฑ์ ํ์ง ๋ง์ธ์ :)
๋ง์ฝ ๋ต์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ๋น๋ฐ ๋๊ธ๋ ์ข์ผ๋ ๋ฌ์์ฃผ์ธ์ ใ ใ
HAVING
๊ทธ๋ผ ๋ด์น๊น์ ์ด๊ฒ๋ ํ์ด๋ณด์.
buytb1 ์์ ์ฌ์ฉ์๋ค์ ์ด ๊ตฌ๋งค ๊ธ์ก์ด 1500 ์ด์์ธ ์ฌ์ฉ์๋ฅผ ์ถ๋ ฅํ๋ผ.
์์์ ์ฐ๋ฆฌ๋ ์ด ๊ตฌ๋งค ๊ธ์ก์ ๊ตฌํ์ ์ด ์๋ค.
SELECT userid, sum(amount * price)
FROM buytb1
GROUP BY userid;
๊ทธ๋ผ ์ด์ 1500 ์ด์์ธ ์ฌ์ฉ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ ์์ฃผ ์ฝ๋ค.
WHERE ์ ์ฌ์ฉํ์.
SELECT userid, sum(amount * price)
FROM buytb1
GROUP BY userid
WHERE sum(amount * price) > 1500;
์ฅ? ์๋๋ค.
์ฐ๋ฆฌ์ ๋
ผ๋ฆฌ๋ผ๋ฉด ๋ผ์ผ ํ๋๋ฐ ์๋๋ค..
์ด์ ๋ ์ฐ๋ฆฌ์ ๋
ผ๋ฆฌ๋ผ์ ๊ทธ๋ ๋ค.
์ฐ๋ฆฌ์ ๋
ผ๋ฆฌ๋ฅผ ์ข ํ์ฅ ์ํค๋ฉด ์ด๊ฑด ๋น์ฐํ ์๋๋ ๊ฒ์ด ๋๋ค.
๋ ผ๋ฆฌ๋ฅผ ํ์ฅ์์ผ๋ณด์.
์ง๊ณ ํจ์์์ ์กฐ๊ฑด์ ์ค ๋
์ง๊ณ ํจ์์์ ์กฐ๊ฑด์ ์ค ๋๋ WHERE ๋์ HAVING์ ์ฌ์ฉํ๋ค.
์ฆ, HAVING ์ ์ ์ง๊ณ ํจ์์์ ์กฐ๊ฑด์ ์ค ๋ ์ฌ์ฉํ๋ค.
๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ์์์ ์กฐ๊ฑด์ ์ง๊ณํจ์๋ฅผ ์ฌ์ฉํ ๊ฐ์ผ๋ก ์คฌ๊ธฐ ๋๋ฌธ์ ๋์ํ์ง ์๋ ๊ฒ์ด๋ค.
์ด์ HAVING์ด ์ ํ์ํ์ง ์๊ฒ ๋์๋ค.
HAVING์ ์ฌ์ฉ ๋ฐฉ๋ฒ
SELECT ํ๋๋ช
FROM ํ
์ด๋ธ๋ช
GROUP BY ํ๋๋ช
ํน์ ํํ์
HAVING where์กฐ๊ฑด
์ฌ๊ธฐ์ HAVING์ where ์กฐ๊ฑด์๊ณผ ๋์ผํ ํํ์ ์กฐ๊ฑด์์ด ๋ค์ด๊ฐ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ค์ํ ๊ฒ์ด HAVING์ ๋ฌด์กฐ๊ฑด GROUP BY ๋ค์ ์์นํด์ผ ํ๋ค.
์ด์ ์ฐ๋ฆฌ๋ ์์ ๋ดค๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ฒ ๋์๋ค.
SELECT userid, sum(amount * price)
FROM buytb1
GROUP BY userid
HAVING sum(amount * price) > 1500;
์นดํ ๊ณ ๋ฆฌ ์ด๋ณด์๋ ์ค๋นํ๋ SQL ์ฝ๋ฉ ํ ์คํธ์ ๊ฐ์๋ฉด ํด๋น ์๋ฆฌ์ฆ๋ฅผ ํ์ธํ์ค ์ ์์ต๋๋ค.
๋๊ธ