๐ 2-1-5. GROUP BY, HAVING ์
๊ณผ๋ชฉ2. SQL ๊ธฐ๋ณธ๊ณผ ํ์ฉ
์ 1์ฅ SQL ๊ธฐ๋ณธ
์ 5์ GROUP BY, HAVING ์
1. ์ง๊ณ ํจ์(Aggregate Function)
์ฌ๋ฌ ํ๋ค์ ๊ทธ๋ฃน์ด ๋ชจ์ฌ์ ๊ทธ๋ฃน๋น ๋จ ํ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ฃผ๋ ๋ค์คํ ํจ์ ์ค ์ง๊ณ ํจ์(Aggregate Function)์ ํน์ฑ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ฌ๋ฌ ํ๋ค์ ๊ทธ๋ฃน์ด ๋ชจ์ฌ์ ๊ทธ๋ฃน๋น ๋จ ํ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ฃผ๋ ํจ์์ด๋ค.
GROUP BY ์ ์ ํ๋ค์ ์๊ทธ๋ฃนํ ํ๋ค.
SELECT ์ , HAVING ์ , ORDER BY ์ ์ ์ฌ์ฉํ ์ ์๋ค.
ANSI/ISO์์ ๋ฐ์ดํฐ ๋ถ์ ๊ธฐ๋ฅ์ผ๋ก ๋ถ๋ฅํ ํจ์ ์ค ๊ธฐ๋ณธ์ ์ธ ์ง๊ณ ํจ์๋ ๋ณธ ์ ์์ ์ค๋ช ํ๊ณ , ROLLUP, CUBE, GROUPING SETS ๊ฐ์ GROUP ํจ์๋ 2์ฅ 5์ ์์, ๋ค์ํ ๋ถ์ ๊ธฐ๋ฅ์ ๊ฐ์ง WINDOW ํจ์๋ 2์ฅ 4์ ์์ ์ค๋ช ํ๋ค.
์ง๊ณ ํจ์๋ช ( [DISTINCT | ALL] ์นผ๋ผ์ด๋ ํํ์ )
์ง๊ณํจ์๋ช ์ ์ฌ์ฉ๋๋ 2๊ฐ์ง ์ต์ ์ ๋ํ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ๋ค.
ALL : Default ์ต์ ์ด๋ฏ๋ก ์๋ต ๊ฐ๋ฅํจ
DISTINCT : ๊ฐ์ ๊ฐ์ ํ๋์ ๋ฐ์ดํฐ๋ก ๊ฐ์ฃผํ ๋ ์ฌ์ฉํ๋ ์ต์ ์
์์ฃผ ์ฌ์ฉ๋๋ ์ฃผ์ ์ง๊ณ ํจ์๋ค์ ๋ค์๊ณผ ๊ฐ๋ค. ์ง๊ณ ํจ์๋ ๊ทธ๋ฃน์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ฏ๋ก ์ฃผ๋ก ์ซ์ ์ ํ์ ์ฌ์ฉ๋์ง๋ง, MAX, MIN, COUNT ํจ์๋ ๋ฌธ์, ๋ ์ง ์ ํ์๋ ์ ์ฉ์ด ๊ฐ๋ฅํ ํจ์์ด๋ค.

[์์ ] ์ผ๋ฐ์ ์ผ๋ก ์ง๊ณ ํจ์๋ GROUP BY ์ ๊ณผ ๊ฐ์ด ์ฌ์ฉ๋์ง๋ง ์๋์ ๊ฐ์ด ํ ์ด๋ธ ์ ์ฒด๊ฐ ํ๋์ ๊ทธ๋ฃน์ด ๋๋ ๊ฒฝ์ฐ์๋ GROUP BY ์ ์์ด ๋จ๋ ์ผ๋ก๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
[์์ ]
[์คํ ๊ฒฐ๊ณผ]
480
447
196
165
179.31
1 ๊ฐ์ ํ์ด ์ ํ๋์์ต๋๋ค.
์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด COUNT(HEIGHT)๋ NULL๊ฐ์ด ์๋ ํค(HEIGHT) ์นผ๋ผ์ ๊ฑด์๋ง ์ถ๋ ฅํ๋ฏ๋ก COUNT(*)์ 480๋ณด๋ค ์์ ๊ฒ์ ๋ณผ ์ ์๋ค. ๊ทธ ์ด์ ๋ COUNT(*) ํจ์์ ์ฌ์ฉ๋ ์์ผ๋์นด๋(*)๋ ์ ์ฒด ์นผ๋ผ์ ๋ปํ๋๋ฐ ์ ์ฒด ์นผ๋ผ์ด NULL์ธ ํ์ ์กด์ฌํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ COUNT(*)๋ ์ ์ฒด ํ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ ๊ฒ์ด๊ณ , COUNT(HEIGHT)๋ HEIGHT ์นผ๋ผ ๊ฐ์ด NULL์ธ 33๊ฑด์ ์ ์ธ๋ ๊ฑด์์ ํฉ์ด๋ค.
2. GROUP BY ์
WHERE ์ ์ ํตํด ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ์ง๋ง ํ ์ด๋ธ์ 1์ฐจ์ ์ผ๋ก ์กด์ฌํ๋ ๋ฐ์ดํฐ ์ด์ธ์ ์ ๋ณด, ์๋ฅผ ๋ค๋ฉด ๊ฐ ํ๋ณ๋ก ์ ์๊ฐ ๋ช ๋ช ์ธ์ง, ์ ์๋ค์ ํ๊ท ์ ์ฅ๊ณผ ๋ชธ๋ฌด๊ฒ๊ฐ ์ผ๋ง๋ ๋๋์ง, ๋๋ ๊ฐ ํ์์ ๊ฐ์ฅ ํฐ ํค์ ์ ์๊ฐ ๋๊ตฌ์ธ์ง ๋ฑ์ 2์ฐจ ๊ฐ๊ณต ์ ๋ณด๋ ํ์ํ๋ค. GROUP BY ์ ์ SQL ๋ฌธ์์ FROM ์ ๊ณผ WHERE ์ ๋ค์ ์ค๋ฉฐ, ๋ฐ์ดํฐ๋ค์ ์์ ๊ทธ๋ฃน์ผ๋ก ๋ถ๋ฅํ์ฌ ์๊ทธ๋ฃน์ ๋ํ ํญ๋ชฉ๋ณ๋ก ํต๊ณ ์ ๋ณด๋ฅผ ์ป์ ๋ ์ถ๊ฐ๋ก ์ฌ์ฉ๋๋ค.
GROUP BY ์ ๊ณผ HAVING ์ ์ ๋ค์๊ณผ ๊ฐ์ ํน์ฑ์ ๊ฐ์ง๋ค.
GROUP BY ์ ์ ํตํด ์๊ทธ๋ฃน๋ณ ๊ธฐ์ค์ ์ ํ ํ, SELECT ์ ์ ์ง๊ณ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
์ง๊ณ ํจ์์ ํต๊ณ ์ ๋ณด๋ NULL ๊ฐ์ ๊ฐ์ง ํ์ ์ ์ธํ๊ณ ์ํํ๋ค.
GROUP BY ์ ์์๋ SELECT ์ ๊ณผ๋ ๋ฌ๋ฆฌ ALIAS ๋ช ์ ์ฌ์ฉํ ์ ์๋ค.
์ง๊ณ ํจ์๋ WHERE ์ ์๋ ์ฌ ์ ์๋ค. (์ง๊ณ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ GROUP BY ์ ๋ณด๋ค WHERE ์ ์ด ๋จผ์ ์ํ๋๋ค)
WHERE ์ ์ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ GROUP์ผ๋ก ๋๋๊ธฐ ์ ์ ํ๋ค์ ๋ฏธ๋ฆฌ ์ ๊ฑฐ์ํจ๋ค.
HAVING ์ ์ GROUP BY ์ ์ ๊ธฐ์ค ํญ๋ชฉ์ด๋ ์๊ทธ๋ฃน์ ์ง๊ณ ํจ์๋ฅผ ์ด์ฉํ ์กฐ๊ฑด์ ํ์ํ ์ ์๋ค.
GROUP BY ์ ์ ์ํ ์๊ทธ๋ฃน๋ณ๋ก ๋ง๋ค์ด์ง ์ง๊ณ ๋ฐ์ดํฐ ์ค, HAVING ์ ์์ ์ ํ ์กฐ๊ฑด์ ๋์ด ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ด์ฉ๋ง ์ถ๋ ฅํ๋ค.
HAVING ์ ์ ์ผ๋ฐ์ ์ผ๋ก GROUP BY ์ ๋ค์ ์์นํ๋ค.
์ผ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ณผ๊ฑฐ ๋ฒ์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ GROUP BY ์ ์ ๋ช ์๋ ์นผ๋ผ์ ์์๋๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ์๋์ผ๋ก ์ค์(๋น๊ณต์์ ์ธ ์ง์์ด์์)ํ๋ ๊ฒฝ์ฐ๊ฐ ์์์ผ๋, ์์น์ ์ผ๋ก ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๊ฒฝ์์๋ ๋ค์์ ์ธ๊ธํ ORDER BY ์ ์ ๋ช ์ํด์ผ ๋ฐ์ดํฐ ์ ๋ ฌ์ด ์ํ๋๋ค. ANSI/ISO ๊ธฐ์ค์์๋ ๋ฐ์ดํฐ ์ ๋ ฌ์ ๋ํ ๋ด์ฉ์ ORDER BY ์ ์์๋ง ์ธ๊ธ๋์ด์์ง, GROUP BY ์ ์๋ ์ธ๊ธ๋์ด ์์ง ์๋ค.
[์์ ] K-๋ฆฌ๊ทธ ์ ์๋ค์ ํฌ์ง์ ๋ณ ํ๊ท ํค๋ ์ด๋ป๊ฒ ๋๋๊ฐ๋ ์๊ตฌ ์ฌํญ์ ์ ์ํ์๋ค. GROUP BY ์ ์ ์ฌ์ฉํ์ง ์๊ณ ์ง๊ณ ํจ์๋ฅผ ์ฌ์ฉํ์ ๋ ์ด๋ค ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ด๋์ง ํฌ์ง์ ๋ณ ํ๊ท ํค๋ฅผ ๊ตฌํด๋ณธ๋ค.
[์์ ]
[์คํ ๊ฒฐ๊ณผ]
GROUP BY ์ ์์ ๊ทธ๋ฃน ๋จ์๋ฅผ ํ์ํด ์ฃผ์ด์ผ SELECT ์ ์์ ๊ทธ๋ฃน ๋จ์์ ์นผ๋ผ๊ณผ ์ง๊ณ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์ ์ ๊ฐ์ด ์๋ฌ๋ฅผ ๋ฐ์ํ๊ฒ ๋๋ค.
[์์ ] SELECT ์ ์์ ์ฌ์ฉ๋ ํฌ์ง์ ์ด๋ผ๋ ํ๊ธ ALIAS๋ฅผ GROUP BY ์ ์ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉํด๋ณธ๋ค.
[์์ ]
[์คํ ๊ฒฐ๊ณผ]
GROUP BY POSITION ํฌ์ง์
3ํ์ ์ค๋ฅ: ERROR: SQL ๋ช ๋ น์ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ข ๋ฃ๋์ง ์์๋ค.
์คํ ๊ฒฐ๊ณผ๋ฅผ ์ดํด๋ณด๋ฉด GROUP BY ์ ์ "ํฌ์ง์ "์ด๋ผ๊ณ ํ์๋ ๋ถ๋ถ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ์นผ๋ผ์ ๋ํ ALIAS๋ SELECT ์ ์์ ์ ์ํ๊ณ ORDER BY ์ ์์๋ ์ฌํ์ฉํ ์ ์์ง๋ง, GROUP BY ์ ์์๋ ALIAS ๋ช ์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋ณด์ฌ ์ฃผ๋ ์ฌ๋ก์ด๋ค.
[์์ ] ํฌ์ง์ ๋ณ ์ต๋ํค, ์ต์ํค, ํ๊ท ํค๋ฅผ ์ถ๋ ฅํ๋ค. (ํฌ์ง์ ๋ณ์ด๋ ์๊ทธ๋ฃน์ ์กฐ๊ฑด์ ์ ์ํ์๊ธฐ ๋๋ฌธ์ GROUP BY ์ ์ ์ฌ์ฉํ๋ค.)
[์์ ]
[์คํ ๊ฒฐ๊ณผ]
์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ํฌ์ง์ ๋ณ๋ก ํ๊ท ํค ์ธ์๋ ์ธ์์, ํค๋์ ์ธ์์, ์ต๋ํค, ์ต์ํค๊ฐ ์ ๋๋ก ์ถ๋ ฅ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ORDER BY ์ ์ด ์๊ธฐ ๋๋ฌธ์ ํฌ์ง์ ๋ณ๋ก ์ ๋ ฌ์ ๋์ง ์์๋ค. ์ถ๊ฐ๋ก ํฌ์ง์ ๊ณผ ํค ์ ๋ณด๊ฐ ์๋ ์ ์๊ฐ 3๋ช ์ด๋ผ๋ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ผ๋ฉฐ, ํฌ์ง์ ์ด DF์ธ 172๋ช ์ค 30๋ช ์ ํค์ ๋ํ ์ ๋ณด๊ฐ ์๋ ๊ฒ๋ ์ ์ ์๋ค. GK, DF, FW, MF์ ์ต๋ํค, ์ต์ํค, ํ๊ท ํค๋ฅผ ๊ตฌํ ๋ ํค ๊ฐ์ด NULL์ธ ๊ฒฝ์ฐ๋ ๊ณ์ฐ ๋์์์ ์ ์ธ๋๋ค. ์ฆ ํฌ์ง์ DF์ ์ต๋ํค, ์ต์ํค, ํ๊ท ํค ๊ฒฐ๊ณผ๋ ํค ๊ฐ์ด NULL์ธ 30๋ช ์ ์ ์ธํ 142๋ช ์ ๋์์ผ๋ก ์ํํ ํต๊ณ ๊ฒฐ๊ณผ์ด๋ค.
3. HAVING ์
[์์ ] K-๋ฆฌ๊ทธ ์ ์๋ค์ ํฌ์ง์ ๋ณ ํ๊ท ํค๋ฅผ ๊ตฌํ๋๋ฐ, ํ๊ท ํค๊ฐ 180 ์ผํฐ๋ฏธํฐ ์ด์์ธ ์ ๋ณด๋ง ํ์ํ๋ผ๋ ์๊ตฌ ์ฌํญ์ด ์ ์๋์์ผ๋ฏ๋ก WHERE ์ ๊ณผ GROUP BY ์ ์ ์ฌ์ฉํด SQL ๋ฌธ์ฅ์ ์์ฑํ๋ค.
[์์ ]
[์คํ ๊ฒฐ๊ณผ]
WHERE AVG(HEIGHT) >= 180
3ํ์ ์ค๋ฅ: ERROR: ์ง๊ณ ํจ์๋ ํ๊ฐ๋์ง ์๋๋ค.
์คํ ๊ฒฐ๊ณผ์์ WHERE ์ ์ ์ง๊ณ ํจ์ AVG(HEIGHT) ๋ถ๋ถ์์ "์ง๊ณ ํจ์๋ ํ๊ฐ๋์ง ์๋๋ค"๋ ์๋ฌ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋์๋ค. ์ฆ WHERE ์ ์๋ AVG()๋ผ๋ ์ง๊ณ ํจ์๋ ์ฌ์ฉํ ์ ์๋ค. WHERE ์ ์ FROM ์ ์ ์ ์๋ ์งํฉ(์ฃผ๋ก ํ ์ด๋ธ)์ ๊ฐ๋ณ ํ์ WHERE ์ ์ ์กฐ๊ฑด์ ์ด ๋จผ์ ์ ์ฉ๋๊ณ , WHERE ์ ์ ์กฐ๊ฑด์ ๋ง๋ ํ์ด GROUP BY ์ ์ ๋์์ด ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฒฐ๊ณผ ์งํฉ์ ํ์ HAVING ์กฐ๊ฑด์ ์ด ์ ์ฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก HAVING ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ด์ฉ๋ง ์ถ๋ ฅ๋๋ค. ์ฆ HAVING ์ ์ WHERE ์ ๊ณผ ๋น์ทํ์ง๋ง ๊ทธ๋ฃน์ ๋ํ๋ด๋ ๊ฒฐ๊ณผ ์งํฉ์ ํ์ ์กฐ๊ฑด์ด ์ ์ฉ๋๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ์๋ค.
[์์ ] HAVING ์กฐ๊ฑด์ ์๋ GROUP BY ์ ์์ ์ ์ํ ์๊ทธ๋ฃน์ ์ง๊ณ ํจ์๋ฅผ ์ด์ฉํ ์กฐ๊ฑด์ ํ์ํ ์ ์์ผ๋ฏ๋ก, HAVING ์ ์ ์ด์ฉํด ํ๊ท ํค๊ฐ 180 ์ผํฐ๋ฏธํฐ ์ด์์ธ ์ ๋ณด๋ง ํ์ํ๋ค.
[์์ ]
[์คํ ๊ฒฐ๊ณผ]
GK
186.26
DF
180.21
2 ๊ฐ์ ํ์ด ์ ํ๋์์ต๋๋ค.
GROUP BY ์ ๊ณผ HAVING ์ ์ ์์๋ฅผ ๋ฐ๊พธ์ด์ ์ํํ๋๋ผ๋ ๋ฌธ๋ฒ ์๋ฌ๊ฐ ์๊ณ ๊ฒฐ๊ณผ๋ฌผ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค(SQL Server์์๋ ๋ฌธ๋ฒ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค). ์คํ ๊ฒฐ๊ณผ์์ ์ ์ฒด 4๊ฐ ํฌ์ง์ ์ค์์ ํ๊ท ํค๊ฐ 180cm๊ฐ ๋๋ 2๊ฐ์ ๋ฐ์ดํฐ๋ง ์ถ๋ ฅ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
[์์ ] SQL ๋ฌธ์ฅ์ GROUP BY ์ ๊ณผ HAVING ์ ์ ์์๋ฅผ ๋ฐ๊พธ์ด์ ์ํํ๋ค.
[์์ ]
[์คํ ๊ฒฐ๊ณผ]
GK
186.26
DF
180.21
2 ๊ฐ์ ํ์ด ์ ํ๋์์ต๋๋ค.
GROUP BY ์ ๊ณผ HAVING ์ ์ ์์๋ฅผ ๋ฐ๊พธ์ด์ ์ํํ๋๋ผ๋ ๋ฌธ๋ฒ ์๋ฌ๋ ์๊ณ ๊ฒฐ๊ณผ๋ฌผ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค. ๊ทธ๋ ์ง๋ง, SQL ๋ด์ฉ์ ๋ณด๋ฉด, ํฌ์ง์ ์ด๋ ์๊ทธ๋ฃน์ผ๋ก ๊ทธ๋ฃนํ(GROUPING)๋์ด ํต๊ณ ์ ๋ณด๊ฐ ๋ง๋ค์ด์ง๊ณ , ์ดํ ์ ์ฉ๋ ๊ฒฐ๊ณผ ๊ฐ์ ๋ํ HAVING ์ ์ ์ ํ ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ง์ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ฏ๋ก ๋ ผ๋ฆฌ์ ์ผ๋ก GROUP BY ์ ๊ณผ HAVING ์ ์ ์์๋ฅผ ์งํค๋ ๊ฒ์ ๊ถ๊ณ ํ๋ค.
[์์ ] K-๋ฆฌ๊ทธ์ ์ ์๋ค ์ค ์ผ์ฑ๋ธ๋ฃจ์์ฆ(K02)์ FC์์ธ(K09)์ ์ธ์์๋ ์ผ๋ง์ธ๊ฐ๋ ์๊ตฌ ์ฌํญ์ด ์ ์๋์๋ค. WHERE ์ ๊ณผ GROUP BY ์ ์ ์ฌ์ฉํ SQL๊ณผ GROUP BY ์ ๊ณผ HAVING ์ ์ ์ฌ์ฉํ SQL์ ๋ชจ๋ ์์ฑํ๋ค.
[์์ ]
[์์ ]
[์คํ ๊ฒฐ๊ณผ]
K02
49
K09
49
2 ๊ฐ์ ํ์ด ์ ํ๋์์ต๋๋ค.
GROUP BY ์๊ทธ๋ฃน์ ๋ฐ์ดํฐ ์ค ์ผ๋ถ๋ง ํ์ํ ๊ฒฝ์ฐ, GROUP BY ์ฐ์ฐ ์ WHERE ์ ์์ ์กฐ๊ฑด์ ์ ์ฉํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ง ์ถ์ถํ์ฌ GROUP BY ์ฐ์ฐ์ ํ๋ ๋ฐฉ๋ฒ๊ณผ, GROUP BY ์ฐ์ฐ ํ HAVING ์ ์์ ํ์ํ ๋ฐ์ดํฐ๋ง ํํฐ๋ง ํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค. ๊ฐ์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค HAVING ์ ์์ TEAM_ID ๊ฐ์ GROUP BY ๊ธฐ์ค ์นผ๋ผ์ ๋ํ ์กฐ๊ฑด์ ์ถ๊ฐํ ์๋ ์์ผ๋, ๊ฐ๋ฅํ๋ฉด WHERE ์ ์์ ์กฐ๊ฑด์ ์ ์ ์ฉํ์ฌ GROUP BY์ ๊ณ์ฐ ๋์์ ์ค์ด๋ ๊ฒ์ด ํจ์จ์ ์ธ ์์ ์ฌ์ฉ ์ธก๋ฉด์์ ๋ฐ๋์งํ๋ค.
[์์ ] ํฌ์ง์ ๋ณ ํ๊ท ํค๋ง ์ถ๋ ฅํ๋๋ฐ, ์ต๋ํค๊ฐ 190cm ์ด์์ธ ์ ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ํฌ์ง์ ์ ์ ๋ณด๋ง ์ถ๋ ฅํ๋ค.
[์์ ]
[์คํ ๊ฒฐ๊ณผ]
GK
186.26
DF
180.21
FW
179.91
3 ๊ฐ์ ํ์ด ์ ํ๋์์ต๋๋ค.
SQL์ ๋ณด๋ฉด SELECT ์ ์์ ์ฌ์ฉํ์ง ์๋ MAX ์ง๊ณ ํจ์๋ฅผ HAVING ์ ์์ ์กฐ๊ฑด์ ๋ก ์ฌ์ฉํ ์ฌ๋ก์ด๋ค. ์ฆ HAVING ์ ์ SELECT ์ ์ ์ฌ์ฉ๋์ง ์์ ์นผ๋ผ์ด๋ ์ง๊ณ ํจ์๊ฐ ์๋๋๋ผ๋ GROUP BY ์ ์ ๊ธฐ์ค ํญ๋ชฉ์ด๋ ์๊ทธ๋ฃน์ ์ง๊ณ ํจ์๋ฅผ ์ด์ฉํ ์กฐ๊ฑด์ ํ์ํ ์ ์๋ค. ์ด ๋ถ๋ถ์ 1์ฅ 8์ ์ SELECT ๋ฌธ์ฅ์ ์คํ ์์์์ ์ถ๊ฐ ์ค๋ช ํ๋ค. ์ฌ๊ธฐ์ ์ฃผ์ํ ๊ฒ์ WHERE ์ ์ ์กฐ๊ฑด ๋ณ๊ฒฝ์ ๋์ ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ ๋ณ๊ฒฝ๋๋ฏ๋ก ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ง๋ง, HAVING ์ ์ ์กฐ๊ฑด ๋ณ๊ฒฝ์ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์๊ณ ์ถ๋ ฅ๋๋ ๋ ์ฝ๋์ ๊ฐ์๋ง ๋ณ๊ฒฝ๋ ์ ์๋ค. ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๋ค๋ฅธ ๊ฒฐ๊ณผ ๊ฐ์ ๋ณ๊ฒฝ ์์ด MAX(HEIGHT)๊ฐ 189cm๋ก 190cm ๋ฏธ๋ง์ธ MF ํฌ์ง์ ์ ๋ฐ์ดํฐ๋ง HAVING ์กฐ๊ฑด์ ์ํด ๋๋ฝ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. (๋ค๋ฅธ ํฌ์ง์ ์ ๋ชจ๋ MAX(HEIGHT)๊ฐ 190์ด์์ด๋ค). ๋๋ฝ๋ ๋ฐ์ดํฐ์ ํต๊ณ ์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ๋ค.
3
0
MF
162
162
189
165
176.31
2 ๊ฐ์ ํ์ด ์ ํ๋์์ต๋๋ค.
4. CASE ํํ์ ํ์ฉํ ์๋ณ ๋ฐ์ดํฐ ์ง๊ณ
"์ง๊ณ ํจ์(CASE( ))~GROUP BY" ๊ธฐ๋ฅ์, ๋ชจ๋ธ๋ง์ ์ 1์ ๊ทํ๋ก ์ธํด ๋ฐ๋ณต๋๋ ์นผ๋ผ์ ๊ฒฝ์ฐ ๊ตฌ๋ถ ์นผ๋ผ์ ๋๊ณ ์ฌ๋ฌ ๊ฐ์ ๋ ์ฝ๋๋ก ๋ง๋ค์ด์ง ์งํฉ์, ์ ํด์ง ์นผ๋ผ ์๋งํผ ํ์ฅํด์ ์ง๊ณ ๋ณด๊ณ ์๋ฅผ ๋ง๋๋ ์ ์ฉํ ๊ธฐ๋ฒ์ด๋ค. ๋ถ์๋ณ๋ก ์๋ณ ์ ์ฌ์์ ํ๊ท ๊ธ์ฌ๋ฅผ ์๊ณ ์ถ๋ค๋ ๊ณ ๊ฐ์ ์๊ตฌ ์ฌํญ์ด ์๋๋ฐ, ์ ์ฌ ํ 1๋ ๋ง๋ค ๊ธ์ฌ ์ธ์์ด๋ ๋ณด๋์ค ์ง๊ธ๊ณผ ๊ฐ์ ์ผ์ ์ด ์ ๊ธฐ์ ์ผ๋ก ์กํ๋ค๋ฉด ์ ๋ฌด์ ์ผ๋ก ์ค์ํ ์ ๋ณด๊ฐ ๋ ์ ์๋ค.
STEP1. ๊ฐ๋ณ ๋ฐ์ดํฐ ํ์ธ
[์์ ] ๋จผ์ ๊ฐ๋ณ ์ ์ฌ์ ๋ณด์์ ์๋ณ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ์์ ์ ์งํํ๋ค. ์ด ๋จ๊ณ๋ ์๋ณ ์ ๋ณด๊ฐ ์๋ค๋ฉด ์๋ต ๊ฐ๋ฅํ๋ค.
[์์ ] Oracle
[์์ ] SQL Server
[์์ ] SQL Server
[์คํ ๊ฒฐ๊ณผ]
SMITH
20
12
800
ALLEN
30
2
1600
WARD
30
2
1250
JONES
20
4
2975
MARTIN
30
9
1250
BLAKE
30
5
2850
CLARK
10
6
2450
SCOTT
20
7
3000
KING
10
11
5000
TURNER
30
9
1500
ADAMS
20
7
1100
JAMES
30
12
950
FORD
20
12
3000
MILLER
10
1
1300
14 ๊ฐ์ ํ์ด ์ ํ๋์์ต๋๋ค.
STEP2. ์๋ณ ๋ฐ์ดํฐ ๊ตฌ๋ถ
[์์ ] ์ถ์ถ๋ MONTH ๋ฐ์ดํฐ๋ฅผ Simple Case Expression์ ์ด์ฉํด์ 12๊ฐ์ ์๋ณ ์นผ๋ผ์ผ๋ก ๊ตฌ๋ถํ๋ค. ์คํ ๊ฒฐ๊ณผ์์ ๋ณด์ฌ ์ฃผ๋ ENAME ์นผ๋ผ์ ์ต์ข ๋ฆฌํฌํธ์์ ์๊ตฌ๋๋ ๋ฐ์ดํฐ๋ ์๋์ง๋ง, ์ ๋ณด์ ํ๋ฆ์ ์ดํดํ๊ธฐ ์ํด ๋ถ๊ฐ์ ์ผ๋ก ๋ณด์ฌ ์ฃผ๋ ์์ ์ ๋ณด์ด๋ค. FROM ์ ์์ ์ฌ์ฉ๋ ์ธ๋ผ์ธ ๋ทฐ๋ 2์ฅ 1์ ์์ ์ค๋ช ํ๋ค.
[์์ ]
[์คํ ๊ฒฐ๊ณผ]
SMITH
20
800
ALLEN
30
1600
WARD
30
1250
JONES
20
2975
MARTIN
30
1250
BLAKE
30
2850
CLARK
10
2450
SCOTT
20
3000
KING
10
5000
TURNER
30
1500
ADAMS
20
1100
JAMES
30
950
FORD
20
3000
MILLER
10
1300
14 ๊ฐ์ ํ์ด ์ ํ๋์์ต๋๋ค.
STEP3. ๋ถ์๋ณ ๋ฐ์ดํฐ ์ง๊ณ
[์์ ] ์ต์ข ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ๋ฆฌํฌํธ๋ ๋ถ์๋ณ๋ก ์๋ณ ์ ์ฌ์์ ํ๊ท ๊ธ์ฌ๋ฅผ ์๊ณ ์ถ๋ค๋ ์๊ตฌ ์ฌํญ์ด๋ฏ๋ก ๋ถ์๋ณ ํ๊ท ๊ฐ์ ๊ตฌํ๊ธฐ ์ํด GROUP BY ์ ๊ณผ AVG ์ง๊ณ ํจ์๋ฅผ ์ฌ์ฉํ๋ค. ์ง์ ๊ฐ์ธ์ ๋ํ ์ ๋ณด๋ ๋ ์ด์ ํ์ ์์ผ๋ฏ๋ก ์ ์ธํ๋ค. ORDER BY ์ ์ ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ถ์๋ฒํธ๋ณ๋ก ์ ๋ ฌ์ด ๋์ง๋ ์์๋ค.
[์์ ]
[์คํ ๊ฒฐ๊ณผ]
10
1300
2450
5000
20
2988
1100
1900
30
1425
2850
1375
950
3 ๊ฐ์ ํ์ด ์ ํ๋์์ต๋๋ค.
ํ๋์ ๋ฐ์ดํฐ์ ์ฌ๋ฌ ๋ฒ CASE ํํ์ ์ฌ์ฉํ๊ณ ์ง๊ณํจ์๊ฐ ์ ์ฉ๋๋ฏ๋ก SQL ์ฒ๋ฆฌ ์ฑ๋ฅ ์ธก๋ฉด์์ ๋์ ๊ฒ์ด ์๋๋๊ณ ์๊ฐํ ์๋ ์๋ค. ๊ทธ๋ ์ง๋ง ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ ๋ฆฌํฌํธ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฅ๋ฌธ์ ํ๋ก๊ทธ๋จ์ ์ฝ๋ฉํ๋ ๊ฒ์ ๋นํด, ์ ๋ฐฉ๋ฒ์ ํ์ฉํ๋ฉด ๋ณต์กํ ํ๋ก๊ทธ๋จ์ด ์๋ ํ๋์ SQL ๋ฌธ์ฅ์ผ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ฏ๋ก DBMS ์์ ํ์ฉ์ด๋ ์ฒ๋ฆฌ ์๋์์ ํจ์ฌ ํจ์จ์ ์ด๋ค. ๋ฐ์ดํฐ ๊ฑด์๊ฐ ๋ง์์ง์๋ก ์ฒ๋ฆฌ ์๋ ์ฐจ์ธ๋ ๋ ๋ ์ ์๋ค. ๊ฐ๋ฐ์๋ค์ ๊ฐ๋ฅํ ํ๋์ SQL ๋ฌธ์ฅ์ผ๋ก ๋น์ฆ๋์ค์ ์ธ ์๊ตฌ ์ฌํญ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋ ธ๋ ฅํด์ผ ํ๋ค.
[์์ ] Simple Case Expression์ผ๋ก ํํ๋ ์์ SQL๊ณผ ๊ฐ์ ๋ด์ฉ์ผ๋ก Oracle์ DECODE ํจ์๋ฅผ ์ฌ์ฉํ SQL ๋ฌธ์ฅ์ ์์ฑํ๋ค.
[์์ ]
DECODE ํจ์๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ SQL ๋ฌธ์ฅ์ด ์กฐ๊ธ ๋ ์งง์์ก๋ค. CASE ํํ๊ณผ Oracle์ DECODE ํจ์๋ ํํ์ ์๋ก ์ฅ๋จ์ ์ด ์์ผ๋ฏ๋ก ์ด๋ค ๊ธฐ๋ฅ์ ์ ํํ ์ง๋ ์ฌ์ฉ์์ ๋ชซ์ด๋ค.
5. ์ง๊ณ ํจ์์ NULL ์ฒ๋ฆฌ
๋ฆฌํฌํธ์ ๋น์นธ์ NULL์ด ์๋ ZERO๋ก ํํํ๊ธฐ ์ํด NVL(Oracle)/ISNULL(SQL Server) ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ, ๋ค์ค ํ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์คํ๋ ค ๋ถํ์ํ ๋ถํ๊ฐ ๋ฐ์ํ๋ฏ๋ก ๊ตณ์ด NVL ํจ์๋ฅผ ๋ค์ค ํ ํจ์ ์์ ์ฌ์ฉํ ํ์๊ฐ ์๋ค. ๋ค์ค ํ ํจ์๋ ์ ๋ ฅ ๊ฐ์ผ๋ก ์ ์ฒด ๊ฑด์๊ฐ NULL ๊ฐ์ธ ๊ฒฝ์ฐ๋ง ํจ์์ ๊ฒฐ๊ณผ๊ฐ NULL์ด ๋์ค๊ณ ์ ์ฒด ๊ฑด์ ์ค์์ ์ผ๋ถ๋ง NULL์ธ ๊ฒฝ์ฐ๋ NULL์ธ ํ์ ๋ค์ค ํ ํจ์์ ๋์์์ ์ ์ธํ๋ค. ์๋ฅผ ๋ค๋ฉด 100๋ช ์ค 10๋ช ์ ์ฑ์ ์ด NULL ๊ฐ์ผ ๋ ํ๊ท ์ ๊ตฌํ๋ ๋ค์ค ํ ํจ์ AVG๋ฅผ ์ฌ์ฉํ๋ฉด NULL ๊ฐ์ด ์๋ 90๋ช ์ ์ฑ์ ์ ๋ํด์ ํ๊ท ๊ฐ์ ๊ตฌํ๊ฒ ๋๋ค. CASE ํํ ์ฌ์ฉ์ ELSE ์ ์ ์๋ตํ๊ฒ ๋๋ฉด Default ๊ฐ์ด NULL์ด๋ค. NULL์ ์ฐ์ฐ์ ๋์์ด ์๋ ๋ฐ๋ฉด, SUM(CASE MONTH WHEN 1 THEN SAL ELSE 0 END)์ฒ๋ผ ELSE ์ ์์ 0(Zero)์ ์ง์ ํ๋ฉด ๋ถํ์ํ๊ฒ 0์ด SUM ์ฐ์ฐ์ ์ฌ์ฉ๋๋ฏ๋ก ์์์ ์ฌ์ฉ์ด ๋ง์์ง๋ค. ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค๋ฉด ๊ฐ๋ฅํ ELSE ์ ์ ์์๊ฐ์ ์ง์ ํ์ง ์๊ฑฐ๋ ELSE ์ ์ ์์ฑํ์ง ์๋๋ก ํ๋ค. ๊ฐ์ ์ด์ ๋ก Oracle์ DECODE ํจ์๋ 4๋ฒ์งธ ์ธ์๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด NULL์ด Default๋ก ํ ๋น๋๋ค. ๋ง์ด ์ค์ํ๋ ๊ฒ ์ค์ ํ๋๊ฐ Oracle์ SUM(NVL(SAL,0)), SQL Server์ SUM(ISNULL (SAL,0)) ์ฐ์ฐ์ด๋ค. ๊ฐ๋ณ ๋ฐ์ดํฐ์ ๊ธ์ฌ(SAL)๊ฐ NULL์ธ ๊ฒฝ์ฐ๋ NULL์ ํน์ฑ์ผ๋ก ์๋์ ์ผ๋ก SUM ์ฐ์ฐ์์ ๋น ์ง๋ ๋ฐ, ๋ถํ์ํ๊ฒ NVL/ISNULL ํจ์๋ฅผ ์ฌ์ฉํด 0(Zero)์ผ๋ก ๋ณํ์์ผ ๋ฐ์ดํฐ ๊ฑด์๋งํผ์ ์ฐ์ฐ์ด ์ผ์ด๋๊ฒ ํ๋ ๊ฒ์ ์์คํ ์ ์์์ ๋ญ๋นํ๋ ์ผ์ด๋ค. ๋ฆฌํฌํธ ์ถ๋ ฅ ๋ NULL์ด ์๋ 0์ ํ์ํ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ NVL(SUM(SAL),0)์ด๋, ISNULL(SUM(SAL),0)์ฒ๋ผ ์ ์ฒด SUM์ ๊ฒฐ๊ณผ๊ฐ NULL์ธ ๊ฒฝ์ฐ(๋์ ๊ฑด์๊ฐ ๋ชจ๋ NULL์ธ ๊ฒฝ์ฐ)์๋ง ํ ๋ฒ NVL/ISNULL ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
[์์ ] ํ๋ณ ํฌ์ง์ ๋ณ FW, MF, DF, GK ํฌ์ง์ ์ ์ธ์์์ ํ๋ณ ์ ์ฒด ์ธ์์๋ฅผ ๊ตฌํ๋ SQL ๋ฌธ์ฅ์ ์์ฑํ๋ค. ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ๋ 0์ผ๋ก ํ์ํ๋ค.
[์์ ]
SIMPLE_CASE_EXPRESSION ์กฐ๊ฑด - Oracle
[์์ ]
SIMPLE_CASE_EXPRESSION ์กฐ๊ฑด - Oracle CASE ํํ์ ELSE 0, ELSE NULL ๋ฌธ๊ตฌ๋ ์๋ต ๊ฐ๋ฅํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์กฐ๊ธ ๋ ์งง๊ฒ SQL ๋ฌธ์ฅ์ ์์ฑํ ์ ์๋ค.
Default ๊ฐ์ธ NULL์ด ์ ์ฉ๋จ.
[์์ ]
SEARCHED_CASE_EXPRESSION ์กฐ๊ฑด - Oracle
[์์ ]
SEARCHED_CASE_EXPRESSION ์กฐ๊ฑด - SQL Server
[์คํ ๊ฒฐ๊ณผ]
K14
0
1
1
0
2
K06
11
11
20
4
46
K13
1
0
1
1
3
K15
1
1
1
0
3
K02
10
18
17
4
49
K12
1
0
1
0
2
K04
13
11
18
4
46
K03
6
15
23
5
49
K07
9
22
16
4
51
K05
10
19
17
5
51
K08
8
15
15
4
45
K11
1
1
1
0
3
K01
12
15
13
5
45
K10
5
15
13
3
36
K09
12
18
15
4
49
15 ๊ฐ์ ํ์ด ์ ํ๋์์ต๋๋ค.
4๊ฐ์ ์์ SQL ๋ฌธ์ฅ์ ๊ฐ์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค. ORDER BY ์ ์ด ์ ์ฉ๋์ง ์์์ผ๋ฏ๋ก TEAM_ID๋ณ๋ก ์ ๋ ฌ๋ผ ์์ง ์๋ค. TEAM_ID 'K08'์ ๊ฒฝ์ฐ POSITION์ด NULL์ธ 3๊ฑด์ด ํฌ์ง์ ๋ณ ๋ถ๋ฅ์๋ ๋น ์ ธ ์์ง๋ง SUM์๋ ์ถ๊ฐ๋์ด ์๋ค. ์ด๋ TEAM_ID 'K08'์ ๊ฐ POSITION์ ํฉ๊ณ(FW+MF+DF+GK)๊ฐ 42๊ฑด์ด๊ณ SUM๊ฐ์ด 45๊ฑด์ธ๊ฒ์ผ๋ก ๊ณ์ฐํ ์์๋ค(44-42=3).
[์์ ] GROUP BY ์ ์์ด ์ ์ฒด ์ ์๋ค์ ํฌ์ง์ ๋ณ ํ๊ท ํค ๋ฐ ์ ์ฒด ํ๊ท ํค๋ฅผ ์ถ๋ ฅํ ์๋ ์๋ค.
[์์ ]
[์คํ ๊ฒฐ๊ณผ]
176.31
179.91
180.21
186.26
179.31
1 ๊ฐ์ ํ์ด ์ ํ๋์์ต๋๋ค.
์ถ์ฒ : ๋ฐ์ดํฐ์จ์์ด โ ํ๊ตญ๋ฐ์ดํฐ์ฐ์ ์งํฅ์(https://dataonair.or.kr)
Last updated