๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ORACLE/SQL

[Oracle] ์˜ค๋ผํด ํŽ˜์ด์ง• ์ฟผ๋ฆฌ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ Row Limiting Clause ์‚ฌ์šฉ :: ๋งˆ์ด์ž๋ชฝ

by ๐ŸŒปโ™š 2020. 3. 15.

์˜ค๋ผํด ํŽ˜์ด์ง•

์˜ค๋ผํด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŽ˜์ด์ง• ์ฟผ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ• ๊นŒ์š”? ํฌํ„ธ ์‚ฌ์ดํŠธ์—์„œ ๊ฒ€์ƒ‰์„ ํ–ˆ์„ ๋•Œ, ๊ฒŒ์‹œํŒ ํ˜•ํƒœ์˜ ์›น์‚ฌ์ดํŠธ์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ๋•Œ, ํ•œ๋ฒˆ์— ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์—ฌ ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜๋Š” ๊ฒŒ์‹œ๋ฌผ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด๋Ÿฐ ๋ณ€๋™์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์˜ค๋ผํด ํŽ˜์ด์ง• ์ฟผ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ์งค๊นŒ์š”? 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]

์ขŒ์ธก : 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๊ฐœ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 

๋Œ“๊ธ€