์ค๋ผํด ํ์ด์ง
์ค๋ผํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ด์ง ์ฟผ๋ฆฌ๋ ์ด๋ป๊ฒ ์์ฑํ ๊น์? ํฌํธ ์ฌ์ดํธ์์ ๊ฒ์์ ํ์ ๋, ๊ฒ์ํ ํํ์ ์น์ฌ์ดํธ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ๋, ํ๋ฒ์ ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ์ฌ ํ๋ฉด์ ์ถ๋ ฅ๋๋ ๊ฒ์๋ฌผ์ ์ ํํฉ๋๋ค. ๊ทธ๋ผ ์ด๋ฐ ๋ณ๋์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ค๋ผํด ํ์ด์ง ์ฟผ๋ฆฌ๋ ์ด๋ป๊ฒ ์งค๊น์? Top-N Query๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง, ์ค๋ผํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ Row Limiting Clause๋ผ๋ Feature๋ฅผ ์ ๊ณตํฉ๋๋ค.
Oracle Database scott ๊ณ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์กด์ฌํ๋ EMP ํ ์ด๋ธ์ ๊ฐ๊ณ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค.
Top-N Query
Top-N Query๋ ์์ N๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ฟผ๋ฆฌ์ ๋๋ค. ํ์ด์ง์ ํ๊ธฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค ์์๋ก ์ ๋ ฌํด์ ๋ณด์ฌ์ค๊ฑด์ง ์ ํด์ผํฉ๋๋ค. ์ผ๋ฐ ๊ฒ์ํ์์๋ ์ฃผ๋ก ๋ ์ง์์ผ๋ก ์ ๋ ฌ์ ํด์ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ๊ณ , ๋ค์ด๋ฒ, ๋ค์, ๊ตฌ๊ธ๊ณผ ๊ฐ์ ๊ฒ์ ํฌํธ์ฌ์ดํธ์์๋ ์์ฌ์ ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ์ด๋ค ์์๋ก ๊ธ๋ค์ ๋ณด์ฌ์ค์ง ์ ํฉ๋๋ค.
๋ณด์ฌ์ค ๋ฐ์ดํฐ๊ฐ ์ ํด์ง๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ๋ณด์ฌ์ค ์ ์๊ธฐ ๋๋ฌธ์ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ๋ฉ๋๋ค. ์ ๋ ฌ๋ ๋ฐ์ดํฐ์์๋ ์์ N๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด Top-N Query๋ฅผ ์ฌ์ฉํฉ๋๋ค.
1
2
3
4
5
6
7
8
9
10
|
SELECT EMPNO ,ENAME ,SAL
FROM
(
SELECT
*
FROM
EMP
ORDER BY SAL DESC
)
WHERE ROWNUM <= 5;
|
์์ 5๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ ์ฟผ๋ฆฌ์ ๋๋ค. Top-N Query๋ Order By ์ ์ด ๋งจ ๋ง์ง๋ง์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์๋ธ์ฟผ๋ฆฌ๋ก ๋จผ์ ์ ๋ ฌ์ํจ ํ, ๋ฐ์์ WHERE ์ ๋ก ROWNUM์ ์กฐ๊ฑด์ ๊ฑธ์ด์ฃผ๋ Query์ ๋๋ค. ์ค๋ผํด ํ์ด์ง ์ฟผ๋ฆฌ์ ๊ธฐ๋ณธ์ TOP-N Query๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ์ง๋ง, ์ด๋ฌํ TOP-N Query์ ๋ฐฉ์์ ์ฌ์ฉํ๋๋ผ๋ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด์๋ ์ฟผ๋ฆฌ๋ด์ฉ์ด ์กฐ๊ธ ๋ณต์กํด์ง๋๋ค.
ํ์ด์ง ๋น 5๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ค๊ณ ํ์๋, ์ฒซ 5๊ฐ๋ ์ ์ฒ๋ผ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค. ํ์ง๋ง, 2๋ฒ์งธ ํ์ด์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ธฐ ์ํด์๋ 6๋ฒ์งธ ๋ถํฐ 10๋ฒ์งธ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ผํฉ๋๋ค. ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ฟผ๋ฆฌ ๋ด์ฉ์ด ์ข ๋ ๋ณต์กํด์ง๋๋ค.
Paging Query
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
SELECT EMPNO, ENAME, SAL
FROM
(
SELECT SEQ, EMPNO, ENAME, SAL
FROM
(
SELECT ROWNUM AS SEQ, EMPNO, ENAME, SAL
FROM
(
SELECT *
FROM EMP
ORDER BY SAL DESC
)
)
WHERE SEQ >= 6 -- START NO
)
WHERE ROWNUM <= 5; -- COUNT
|
Top-N Query๋ฅผ ์์ฉํ์ฌ ๋ง๋ ์ค๋ผํด ํ์ด์ง ์ฟผ๋ฆฌ์ ๋๋ค. ๋ด๋ถ์ ์ผ๋ก ์ ๋ ฌ์ํค๊ณ , START NO ๋ฒ์งธ ๋ฐ์ดํฐ ๋ถํฐ ๋ณด์ฌ์ง๋๋ก ํ๋ฒ ๊ฐ์๊ณ , ๋ง์ง๋ง์ผ๋ก ๋ณด์ฌ์ง ๊ฒ์๋ฌผ์ ๊ฐฏ์๋งํผ ์ง์ ํด์ค๋๋ค. ์ก์์ผ๋ก ํ์ธํ์ฌ ๋ฐ๋ก ๋ด์ฉ์ ์ดํดํ๊ธฐ ์กฐ๊ธ ํ๋ ์ฟผ๋ฆฌ์ ๋๋ค. ํ์ง๋ง, ์ค๋ผํด์์๋ Row Limiting Clause๋ฅผ ์ฌ์ฉํด์ ์ข ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
Row Limiting Clause
Row Limiting Clause๋ ์ค๋ผํด 12c ๋ฒ์ ๋ถํฐ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค. 11g๊น์ง๋ Top-N Query๋ฅผ ์ด์ฉํฉ๋๋ค. ORDER BY ์ ์ดํ์ ์คํ๋๋ ์ ๋ก ๋ช ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋์๋ถํฐ ๋ณผ์ง ์ค๋ณต์ฌ๋ถ์ ํจ๊ป ์ถ๋ ฅ์ด ๊ฐ๋ฅํฉ๋๋ค.
OFFSET : ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ก ๋ถํฐ ์ผ๋ง๋ ๋จ์ด์ ธ ์๋์ง
FETCH : ๋ช๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณผ๊ฑด์ง
Paging Query
1
2
3
4
|
SELECT EMPNO, ENAME, SAL
FROM EMP
ORDER BY SAL DESC
OFFSET 0 ROWS FETCH FIRST 5 ROWS ONLY;
|
Top-N Query๋ฅผ ์ฌ์ฉํ ํ์ด์ง ์ฒ๋ฆฌ ์ฟผ๋ฆฌ์ ๊ฐ์ ๋ด์ฉ์ ์ถ๋ ฅํด์ฃผ๋ ์ฟผ๋ฆฌ์ ๋๋ค.
1
2
3
4
|
SELECT EMPNO, ENAME, SAL
FROM EMP
ORDER BY SAL DESC
OFFSET 6 ROWS FETCH FIRST 5 ROWS ONLY;
|
Top-N Query๋ฅผ ์ฌ์ฉํ๋๊ฒ ๋ณด๋ค ํ์คํ ์ด๋ค ๋ด์ฉ์ ์ถ๋ ฅํด์ฃผ๋ ์ฟผ๋ฆฌ์ธ์ง ๋์ผ๋ก๋ ํ์ธ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ ์ธก๋ฉด์์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ ์ฟผ๋ฆฌ์ ๋๋ค.
Row Limiting Clause์ ์ค๋ผํด ํ์ด์ง ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋๋ฐ ๋ง์ ๋์์ ์ฃผ์ง๊ณ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ค๋ณต ์ฒ๋ฆฌ [ONLY | WITH TIES]
1
2
3
4
|
SELECT EMPNO, ENAME, SAL
FROM EMP
ORDER BY SAL DESC
FETCH FIRST 9 ROWS [ONLY | WITH TIES];
|
FETCH์ ๊ณผ ํจ๊ป ONLY์ WITH TIES๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ณต๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ค๊ฒ์ธ์ง ์ฌ๋ถ๋ฅผ ์ ํํ ์ ์์ต๋๋ค. MILLER์ WARD์ ์๊ธ์ ๊ฐ์๋ฐ 9๊ฐ์ ๋ฐ์ดํฐ๋ง ์ถ๋ ฅํ์๋ WITH TIES๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ค๋ณต๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ด ๋ณด์ฌ์ค ์ด 10๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํด์ค๋๋ค.
๋น์จ๋ก ์ถ๋ ฅ PERCENT
1
2
3
4
|
SELECT EMPNO, ENAME, SAL
FROM EMP
ORDER BY SAL DESC
FETCH FIRST 50 PERCENT ROWS ONLY;
|
cs |
PERCENT๋ฅผ ์ฌ์ฉํ๋ฉด ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ง์ ํ ๋น์จ๋งํผ ์ถ๋ ฅํ ์ ์์ต๋๋ค. ์ด 12๊ฐ์ ๋ฐ์ดํฐ ์ค ์ ๋ฐ์ธ 6๊ฐ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
๋๊ธ