๋ค์คํ ํจ์๋ ์ง์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ์ฌ ํ๋์ ๊ฒฐ๊ณผ ๊ฐ๋ง ์ถ๋ ฅํฉ๋๋ค.
๊ทธ๋ ๊ธฐ์ ๋ถ์๋ฅผ ์๋ฏธํ๋ ๋ถ์ ๋ฒํธ(DEPTNO)์ ๊ฐ๋ณ๋ก ๊ธ์ฌ์ ํ๊ท ๊ฐ์ ๊ตฌํ๋ ค๋ฉด ๊ฐ ๋ถ์ ํ๊ท ๊ฐ์ ๊ตฌํ๊ธฐ ์ํด SELECT ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ๋ฌ๋ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 10;
UNION ALL
SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 20;
UNION ALL
SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 30;
(๊ฒฐ๊ณผ ๊ฐ์ ํ๋๋ก ํตํฉํ๊ธฐ ์ํด ์งํฉ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ต๋๋ค.)
ํ์ง๋ง ์์ ๊ฐ์ ๋ฐฉ์์ ์ดํ ํน์ ๋ถ์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ๋๋ง๋ค SQL๋ฌธ์ ์์ ํด์ผ ํ๋ฏ๋ก ๋ฐ๋์งํ์ง ์์ต๋๋ค.
GROUP BY
์์ ์์์ ๊ฐ์ด ์ฌ๋ฌ ๋ฐ์ดํฐ์์ ์๋ฏธ ์๋ ํ๋์ ๊ฒฐ๊ณผ๋ฅผ ํน์ ์ด ๊ฐ๋ณ๋ก ๋ฌถ์ด์ ์ถ๋ ฅํ ๋ ๋ฐ์ดํฐ๋ฅผ '๊ทธ๋ฃนํ'ํ๋ค๊ณ ํํํฉ๋๋ค.
SELECT๋ฌธ์์๋ GROUP BY์ ์ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ ์ ์๋๋ฐ, ๋ค์์ ๊ธฐ๋ณธ ํ์์ ๋๋ค.
SELECT [์กฐํํ ์ด1 ์ด๋ฆ], [์กฐํํ ์ด2 ์ด๋ฆ], ...
FROM [์กฐํํ ํ ์ด๋ธ ์ด๋ฆ]
WHERE [์กฐํํ ํ์ ์ ๋ณํ๋ ์กฐ๊ฑด์]
GROUP BY [๊ทธ๋ฃนํํ ์ด์ ์ง์ (์ฌ๋ฌ๊ฐ ์ง์ ๊ฐ๋ฅ)]
ORDER BY [์ ๋ ฌํ๋ ค๋ ์ด ์ง์ ]
GROUP BY์ ์ ๋ช ์ํ๋ ์ด์ ์ฌ๋ฌ ๊ฐ ์ง์ ํ ์ ์์ต๋๋ค.
๋จผ์ ์ง์ ํ ์ด๋ก ๋๊ทธ๋ฃน์ ๋๋๊ณ ๊ทธ ๋ค์ ์ง์ ํ ์ด๋ก ์๊ทธ๋ฃน์ ๋๋๋๋ค.
์ฌ์ฉ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
SELECT DEPTNO, JOB, AVG(SAL)
FROM EMP
GROUP BY DEPTNO, JOB
ORDER BY DEPTNO, JOB;
์๋ ๊ฐ ๋ถ์์ ์ง์ฑ ๋ณ ํ๊ท ๊ธ์ฌ๋ฅผ ๊ตฌํ๋ SQL ์ฟผ๋ฆฌ์ ๋๋ค.
์ฃผ์์
GROUP BY์ ์ ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผ ํ ์ ์ด ์์ต๋๋ค.
๋ฐ๋ก ๋ค์คํ ํจ์๋ฅผ ์ฌ์ฉํ์ง ์์ ์ผ๋ฐ ์ด์ GROUP BY์ ์ ๋ช ์ํ์ง ์์ผ๋ฉด SELECT ์ ์์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
SELECT ENAME, DEPTNO, AVG(SAL)
FROM EMP
GROUP BY DEPTNO;
์๋ ์คํํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ฐ, DEPTNO๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํ๋์ด DEPTNO์, AVG๋ ํ ํ์ผ๋ก ์ถ๋ ฅ๋์ง๋ง, ENAME์ ์ฌ๋ฌ ํ์ผ๋ก ๊ตฌ์ฑ๋๋ฏ๋ก ๊ฐ ์ด๋ณ ๋ฐ์ดํฐ ์๊ฐ ๋ฌ๋ ค์ ์ ์ถ๋ ฅ์ด ๋ถ๊ฐ๋ฅํด์ง๋๋ค.
HAVING์
HAVING์ ์ SELECT๋ฌธ์ GROUP BY์ ์ด ์กด์ฌํ ๋๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
GROUP BY์ ์ ํตํด ๊ทธ๋ฃนํ๋ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฒ์๋ฅผ ์ ํํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
๋ค์์ ๊ฐ ๋ถ์์ ์ง์ฑ ๋ณ ํ๊ท ๊ธ์ฌ๋ฅผ ๊ตฌํ๋ ๊ทธ ๊ฐ์ด 2000 ์ด์์ธ ๊ทธ๋ฃน๋ง ์ถ๋ ฅํ๋ ์์์ ๋๋ค.
SELECT DEPTNO, JOB, AVG(SAL)
FROM EMP
GROUP BY DEPTNO, JOB
HAVING AVG(SAL) >= 2000
ORDER BY DEPTNO, JOB;
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
SELECT [์กฐํํ ์ด1 ์ด๋ฆ], [์กฐํํ ์ด2 ์ด๋ฆ], ...
FROM [์กฐํํ ํ ์ด๋ธ ์ด๋ฆ]
WHERE [์กฐํํ ํ์ ์ ๋ณํ๋ ์กฐ๊ฑด์]
GROUP BY [๊ทธ๋ฃนํํ ์ด์ ์ง์ (์ฌ๋ฌ๊ฐ ์ง์ ๊ฐ๋ฅ)]
HAVING [์ถ๋ ฅ ๊ทธ๋ฃน์ ์ ํํ๋ ์กฐ๊ฑด์]
ORDER BY [์ ๋ ฌํ๋ ค๋ ์ด ์ง์ ]
์ฃผ์์
์กฐ๊ฑด์์ ์ง์ ํ๋ ์ ์์ HAVING๊ณผ WHERE์ด ๋น์ทํ๋ค๊ณ ์๊ฐํ์ค ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ WHERE์ ์ ์ถ๋ ฅ ๋์์ ์ ํํ๋ ๊ฒ์ด๊ณ , HAVING์ ์ ๊ทธ๋ฃนํ๋ ๋์์ ์ถ๋ ฅ์์ ์ ์ธํ๋ ๊ฒ์ด๋ฏ๋ก ์ฐ์์๊ฐ ์ ํ ๋ค๋ฆ ๋๋ค.
๋ค์์ HAVING์ ์ ์ฌ์ฉํ์ง ์๊ณ ์กฐ๊ฑด์์ WHERE์ ์ ๋ช ์ํ, ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์์์ ๋๋ค.
SELECT DEPTNO, JOB, AVG(SAL)
FROM EMP
WHERE AVG(SAL) >= 2000
GROUP BY DEPTNO, JOB
ORDER BY DEPTNO, JOB;
์ถ๋ ฅ ํ์ ์ ํํ๋ WHERE ์ ์์๋ ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๋ ์กฐ๊ฑด์์ ์ง์ ํ ์ ์์ต๋๋ค.
WHERE์ ๊ณผ HAVING์ ์ ์ฌ์ฉ
WHERE์ ๊ณผ HAVING์ ์ ๊ฐ์ด ์ฌ์ฉํ๋ค๋ฉด, WHERE์ ์ด GROUP BY์ HAVING์ด ์ ์ฉ๋๊ธฐ ์ ์ ๋จผ์ ์ ์ฉ๋๋ค๋ ์ฌ์ค์ ์ธ์งํด์ผ ํฉ๋๋ค.
์ฆ WHERE์ ์ ๋์์ด ๋๋ ํ์ ๋ํด์๋ฉด GROUP BY์ HAVING์ด ์ ์ฉ๋๋ค๋ ๊ฒ์ ๋๋ค. (๊ทธ๋ฃน์ด ์๊ธฐ๊ธฐ ์ ์ ๊ฑธ๋ฌ์ง ๋ฐ์ดํฐ๋ ๊ทธ๋ฃนํ๊ฐ ์งํ๋์ง ์์ต๋๋ค.)
๋ฐ์
์์ง ์ด ๋ด์ฉ์ ์ ๊ฐ ๋ฉ์ฒญํ๊ธฐ์,, ๊ณต๋ถํด๋ณด๋ ค ํ์ง๋ง ์กฐ๊ธ ์ด๋ ค์์ ๊ฑด๋๋ฐ๊ณ ๋์ค์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ธ๊ธ๋ง ํด ๋๋ฆดํ ๋ ๊ถ๊ธํ๋ฉด ๊ณต๋ถํด๋ณด์๋ ๊ฒ๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค.
ROLLUP, CUBE, GROUPING ํจ์, LISTAGG ํจ์, PIVOT & UNPIVOT ํจ์
'๐พ DataBase > Oracle DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Oracle DB] ์กฐ์ธ (2) (0) | 2022.01.28 |
---|---|
[Oracle DB] ์กฐ์ธ (1) (0) | 2022.01.26 |
[Oracle DB] ์ค๋ผํด ํจ์ (7) - ๋ค์คํ ํจ์ (SUM, COUNT, MAX, MIN, SUM) (0) | 2022.01.25 |
[Oracle DB] ์ค๋ผํด ํจ์ (6) - ๋จ์ผํ ํจ์ - DECODEํจ์์ CASE๋ฌธ (0) | 2022.01.23 |
[Oracle DB] ์ค๋ผํด ํจ์ (5) - ๋จ์ผํ NULL ์ฒ๋ฆฌ ํจ์ (0) | 2022.01.23 |