์ฌ์ ์ ๋ณด๋ฅผ ์ ๋ ฅํ๋๋ฐ, ์ ์ฒด ๊ธ์ฌ ํ๊ท ๊ฐ๊ณผ ํจ๊ป ์ถ๋ ฅํ์์ค.
ORACLE SCOTT ๊ณ์ EMP ํ ์ด๋ธ๋ก ์ถ๋ ฅ๋ ๊ฒฐ๊ณผ์ ๋๋ค.
์ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด ์ด๋ป๊ฒ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ค๊ฑด๊ฐ์?
1
2
3
4
5
6
7
8
|
SELECT
DEPTNO
,EMPNO
,ENAME
,JOB
,SAL
,ROUND((SELECT AVG(SAL) FROM EMP)) AS AVG
FROM EMP;
|
SUBQUERY๋ฅผ ์ด์ฉํ ์๋ ์์ง๋ง... ANALYTIC FUNCTION ๋ถ์ํจ์๋ฅผ ์ฌ์ฉํด์ ์ข ๋ ํธํ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
1
2
3
4
5
6
7
8
|
SELECT
DEPTNO
,EMPNO
,ENAME
,JOB
,SAL
,ROUND(AVG(SAL) OVER()) AS AVG
FROM EMP;
|
๋ถ์ํจ์ OVER ์ ์ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ํ์ด๋ดค์ต๋๋ค.
๊ฐ๋จํ๊ฒ ์ ์ฒด ํ๊ท ๊ฐ์ ๊ตฌํ๋ ๋ฌธ์ ๋ผ ๋๊ฐ์ ์ฟผ๋ฆฌ์๋ ๋ณ ์ฐจ์ด๊ฐ ์์ด ๋ณด์ ๋๋ค. ๊ทธ๋ผ ๊ฐ ๋ถ์๋ณ ํ๊ท ์ ํ์ํ๋ฉด ์ด๋จ๊น์?
์ฌ์ ์ ๋ณด๋ฅผ ์ ๋ ฅํ๋๋ฐ, ๊ฐ๊ฐ ๋ถ์ ํ๊ท ๊ฐ๊ณผ ํจ๊ป ์ถ๋ ฅํ์์ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
SELECT
E1.DEPTNO
,EMPNO
,ENAME
,JOB
,SAL
,SUM_SAL
FROM EMP E1, (
SELECT
DEPTNO
,SUM(SAL) AS SUM_SAL
FROM EMP
GROUP BY DEPTNO
) E2
WHERE E1.DEPTNO = E2.DEPTNO
ORDER BY DEPTNO;
|
SUBQUERY๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๊ฐ์ด ํด๊ฒฐํ ์ ์์ต๋๋ค. ๊ทธ๋ผ ๋๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ถ์ํจ์๋ฅผ ์ด์ฉํด์ ํ๋ฉด ์ด๋จ๊น์?
1
2
3
4
5
6
7
8
|
SELECT
DEPTNO
,EMPNO
,ENAME
,JOB
,SAL
,SUM(SAL) OVER(PARTITION BY DEPTNO) AS SUM_SAL
FROM EMP;
|
๋์ผ๋ก๋ง ๋ด๋ ํ์คํ SUBQUERY๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋ณด๋ค ๊ฐ๋จํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ทธ๋ผ OVER ... PARTITION BY๋ฅผ ์ฌ์ฉํ๋ ๋ถ์ํจ์๋ ๋ฌด์์ผ๊น์?
๋ถ์ํจ์๋?
SELECT
๋ถ์ํจ์ OVER([PARTITION BY ์นผ๋ผ] [ORDER BY ์นผ๋ผ] [WINDOWING ์ ])
FROM ํ ์ด๋ธ;
๋ถ์ํจ์๋ ์ด๋ฏธ ์ฌ์ฉํด๋ณด์ จ์ ๊ฒ๋๋ค. COUNT(), AVG(), SUM() ๋ฑ๊ณผ ๊ฐ์ด GROUP BY ์ ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ ํจ์๋ค๋ ์๊ณ , RANK(), ROW_NUMBER(), DENSE_RANK(), LEAD(), LAG(), NTITLE() ๋ฑ ORACLE ๋ฒ์ ์ด ์ฌ๋ผ๊ฐ๋ฉด์ ๋ง์ด ์๊ฒจ๋๊ณ ์์ต๋๋ค. ์ด๋ฐ ๋ถ์ํจ์ ๋ค์ ANALYTIC CLAUSE( OVER ์ )์ ํตํด์ ํ ๊ทธ๋ฃน์ ์ ์๋ฅผ ์ง์ ํ๊ณ ๊ฐ ๊ทธ๋ฃน๋น ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ๋ณตํ์ฌ ์ถ๋ ฅํ๋ ๊ฒ ์ ๋๋ค. ์ฌ๊ธฐ์ ํ ๊ทธ๋ฃน์ ์นผ๋ผ์ ๋ํ ํ๋ค์ด๊ณ ํ ๊ทธ๋ฃน์ ๋ฒ์(WINDOW)๋ฅผ PARTITION BY, ORDER BY, WINDOWING์ผ๋ก ์กฐ์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
์์ ๋ฌธ์ ๋ฅผ ์์๋ก ๋ดค์๋,
SUM(SAL) --> ๋ถ์ํจ์ SUM์ ์ฌ์ฉํ๊ณ SAL ์นผ๋ผ์ ๋ํ ํ๋ค์ด ํ ๊ทธ๋ฃน์ ๋๋ค.
OVER --> ๋ถ์์ ์ด๋ผ๊ณ ํฉ๋๋ค. ๋ถ์ํจ์์ ๋ํ ์กฐ์ ์ OVER์ ์์์ ํฉ๋๋ค.
PARTITION BY --> GROUP BY์ ๋์ผํ๊ฒ ๊ทธ๋ฃน์ง์ด ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ ํฉ๋๋ค.
ORDER BY --> PARTITION BY๋ก ์ ์๋ WINDOW ๋ด์์ ํ๋ค์ ์ ๋ ฌ์์๋ฅผ ์ ์ํด์ค๋๋ค.
1
2
3
4
5
6
7
8
|
SELECT
DEPTNO
,EMPNO
,ENAME
,JOB
,SAL
,SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) AS SUM_SAL
FROM EMP;
|
์์ ๋ฌธ์ ์์ ORDER BY์ ์ ์ฌ์ฉํด์ ๊ฐ๊ฐ PARTITION ์์์ ์ ๋ ฌ์์ ์ ํ ์ ์์ต๋๋ค.
OVER ์ ์คํ ์์
OVER์ ์์๋ ORDER BY์ ์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋์ ๊ฐ์ฅ ๋ง์ง๋ง์ ์คํ๋ฉ๋๋ค.
๋๊ธ