DAY-26. Oracle ์ธ๋ผ์ธ ๋ทฐ, rownum

4 minute read

๐Ÿ” 2022-04-06 -1

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

โ— ์ˆ˜์—…์„ ๋“ฃ๊ณ , ๊ฐœ์ธ์ด ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ ์€ ๊ฒƒ ์ด๊ธฐ์— ์˜ค๋ฅ˜๊ฐ€ ๋งŽ์„ ์ˆ˜๋„ ์žˆ์Œ

๐Ÿ”” ์ธ๋ผ์ธ ๋ทฐ (inline - view)

์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ย FROM ์ ˆ์—์„œ ์•ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ,ย ํ•ด๋‹น ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ โ€˜์ธ๋ผ์ธ๋ทฐโ€™ ๊ธฐ์กด์— ์•Œ๋˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” where ์ ˆ์—

  • ์ธ๋ผ์ธ๋ทฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ธ๋ผ์ธ๋ทฐ์—์„œ ์กฐํšŒํ•ด์˜จ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฉ”์ธ์ฟผ๋ฆฌ๋ฌธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ
  • from ์ ˆ์—์„œ ๋จผ์ € ์‹ค์‹œํ•˜๊ณ  ๊ฐ€์ƒํ…Œ์ด๋ธ”(emp_name, salary๋งŒ ์žˆ๋Š”)์„ ๋งŒ๋“ ๊ฒƒ์„ select ํ•œ๋‹ค๊ณ  ์ƒ๊ฐ
select
    emp_no  // ์˜ค๋ฅ˜ ๋ฐœ์ƒ
from (select emp_name, salary from employee);

select
*         // emp_name๊ณผ salary๋งŒ ๋ณด์—ฌ์ง
from (select emp_name, salary from employee);

๐Ÿ’ก ์‹คํ–‰์ˆœ์„œ : from โ†’ where โ†’ group by โ†’ having โ†’ select โ†’ order by


๐Ÿ”” Top N ๋ถ„์„ (Top N Query)

  • ์ปฌ๋Ÿผ์—์„œ ๊ฐ€์žฅ ํฐ n๊ฐœ์˜ ๊ฐ’์„ ํ˜น์€ ๊ฐ€์žฅ ์ž‘์€ n๊ฐœ์˜ ๊ฐ’์„ ์š”์ฒญํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ
  • ์ƒ์œ„/ํ•˜์œ„ n๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” ์ฟผ๋ฆฌ
  • ํšŒ์‚ฌ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ํŒ”๋ฆฐ ์ œํ’ˆ 10๊ฐœ๋Š” ๋ฌด์—‡์ธ๊ฐ€? ํšŒ์‚ฌ์—์„œ ์›”๊ธ‰์„ ์ œ์ผ ๋งŽ์ด ๋ฐ›๋Š” ์‚ฌ๋žŒ 3๋ช…์€ ๋ˆ„๊ตฌ์ธ๊ฐ€?
  • ๊ฒŒ์‹œํŒ ํŽ˜์ด์ง• / ์กฐํšŒ์ˆ˜๊ฐ€ ๋†’์€ ์ธ๊ธฐ๊ธ€
// emplyoee ํ…Œ์ด๋ธ”์—์„œ ๊ฐ€์žฅ ๋†’์€ ๊ธ‰์—ฌ๋ฅผ ๋ฐ›๋Š” ์‚ฌ๋žŒ 5๋ช…

select
    emp_name, salary
from employee
    order by 2 desc;


1๏ธโƒฃ rownum

  • ์ถœ๋ ฅ๋˜๋Š” select ๋ฌธ์˜ ํ–‰๋งˆ๋‹ค ์ž๋™์ ์œผ๋กœ ์ˆœ์œ„๋ฅผ ๋งค๊ฒจ์ฃผ๋Š”๊ฒƒ
  • default๋กœ๋Š” ์›๋ž˜ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๋Œ€๋กœ ์ˆœ์œ„๋ฅผ ๋งค๊ฒจ์คŒ

โ— ์˜ค๋ฅ˜

// ์›”๊ธ‰์ด ํฐ ์‚ฌ๋žŒ๋ถ€ํ„ฐ ์ˆœ์œ„๋ฅผ ๋งค๊ฒจ๋ณด์ž -> order by

select
    rownum,
    emp_name, salary
from employee
    order by 3 desc;
  • โ— rownum์€ order by์ ์šฉ ์ด์ „์— ๋งค๊ฒจ์ง„๋‹ค. ์ˆœ์„œ๊ฐ€ ๋จผ์ € ๋งค๊ฒจ์ง€๊ณ  ๋‚˜์„œ ORDER BY๋กœ ์ •๋ ฌ๋˜๋ฏ€๋กœ, rownum๊ณผ order by์˜ ๋™์‹œ์‚ฌ์šฉ์€ ๊ฒฐ๊ณผ ์ˆœ์„œ๋ฅผ ๋’ค์ฃฝ๋ฐ•์ฃฝ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋งŒ๋“ ๋‹ค
  • select ์ ˆ์ด order by ์ ˆ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜๋ฉด์„œ ์ด๋ฏธ rownum์ด ๋งค๊ฒจ์ง„ ํ›„์— ๋‹ค์‹œ ์žฌ์ •๋ ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์„œ๊ฐ€ ๋’ค์ฃฝ๋ฐ•์ฃฝ

๐Ÿ’ก ํ•ด๊ฒฐ

// ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ์ค€์— ๋งž์ถฐ ์ด๋ฏธ ์ •๋ ฌ์ด ๋œ ์ƒํƒœ์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด rownum -> ์ˆœ์„œ๋ฅผ ๋งค๊ฒจ์•ผ ํ•จ
// ์ธ๋ผ์ธ๋ทฐ -> ์„œ๋ธŒ์ฟผ๋ฆฌ ์•ˆ์—์„œ ์›”๊ธ‰์ด ์ œ์ผ ํฐ ์ˆœ์„œ๋Œ€๋กœ ์ผ๋‹จ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌ
// -> ์‹ค์ œ ๋ฉ”์ธ์ฟผ๋ฆฌ rownum ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ˆœ์„œ๊ฐ€ ๋งค๊ฒจ์ง

select * from employee order by salary desc;

select
    rownum , emp_name, salary
from (select * from employee order by salary desc);
// rownum์€ ์›๋ž˜ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ํ…Œ์ด๋ธ”์„ 1,2,3,4,5 ์‹์œผ๋กœ ์ˆœ๋ฒˆ์„ ์ •ํ•ด์ค€๋‹ค
// ๋จผ์ € salary๋กœ ์ˆœ์„œ๋ฅผ ์ •ํ•ด์ฃผ๊ณ  ๊ทธ ํ…Œ์ด๋ธ”์„ rownum์„ ํ•ด์ค€๋‹ค

// ์ƒ์œ„ 5๋ช… ์—ฐ๋ด‰ ์ˆœ์„œ
select rownum,
       emp_name,
       salary
from (select * from employee order by salary desc)
where rownum <= 5;
  • select๋ณด๋‹ค from ์ ˆ์ด ๋จผ์ € ์‹คํ–‰ ๋œ๋‹ค.
  • from์ ˆ ๋กœ๋ถ€ํ„ฐ ๋จผ์ € ๊ฐ€์ƒ์˜ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋œํ›„ rownum๊ณผ emp_name, salary๋ฅผ ๋ฝ‘๋Š”๋‹ค
  • from ์‹คํ–‰ โ†’ where ์‹คํ–‰ โ†’ select ์‹คํ–‰

2๏ธโƒฃ row_number() over()

  • row_number() over (order by ์ปฌ๋Ÿผ..); over() ์•ˆ์ชฝ์˜ ์ปฌ๋Ÿผ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ผ๋‹จ ์ •๋ ฌ์€ ํ•œ ํ›„์— ์ˆœ์œ„๋ฅผ ๋งค๊ฒจ์คŒ
  • row_number()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ™์€ ๊ฐ’(์ค‘๋ณต ๋ฐ์ดํ„ฐ)์ด์—ฌ๋„ ์ˆœ์œ„๊ฐ€ ๋‚˜๋ˆ„์–ด์ง„๋‹ค โ†’ ๊ฐ™์€ 200์ด์—ฌ๋„ ํ•˜๋‚˜๋Š” 19์œ„ ํ•˜๋‚˜๋Š” 20์œ„

1.png

select
   row_number() over(order by salary desc)"์ˆœ์œ„", emp_name, salary
from employee;

โ— ์˜ค๋ฅ˜

๐Ÿ”Ž
// ---- ์›”๊ธ‰์„ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐ›๋Š” top5

select
    row_number() over(order by salary desc) "์ˆœ์œ„",
    emp_name,
    salary
from employee
   where rownum <= 5 // ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด employee ํ…Œ์ด๋ธ”์•ˆ์—์„œ ๊ทธ๋ƒฅ 5๋ช…์„ ์ž๋ฅธ๊ฑฐ์ž„
  • where ์ ˆ ์•ˆ์—์„œ rownum <=5 ๋ฅผ ํ•ด๋ฒ„๋ฆฌ๋ฉด employee ํ…Œ์ด๋ธ”์•ˆ์—์„œ ๊ทธ๋ƒฅ 5๋ช…์„ ์ž๋ฅด๊ณ  โ†’ ๊ทธ ๋‹ค์Œ ๊ทธ ์•ˆ์—์„œ salary ์ˆœ์œ„๋ฅผ ์ •ํ•œ๊ฑฐ์ž„ โ†’ ์ž˜๋ชป๋œ ์ฟผ๋ฆฌ๋ฌธ
  • 5๋ช… ์•ˆ์—์„œ ์ˆœ์„œ๋ฅผ ๋‚˜๋ˆ„๋Š”๊ฒŒ ์•„๋‹Œ โ†’ ์ „์ฒด ์ธ์›์ค‘ ์›”๊ธ‰ top5๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—

๐Ÿ’ก ํ•ด๊ฒฐ

๐Ÿ”Ž // 1๋ฒˆ
select
    ์ˆœ์œ„, emp_name, salary  // ์—ฌ๊ธฐ์„œ ์ˆœ์œ„(rownum)๋Š” row_number์—์„œ ๊ฐ€์ ธ์˜จ๊ฒƒ, emp_name,salary๋Š” employee *์—์„œ ์˜จ ๋ฐ์ดํ„ฐ
from (select row_number() over(order by salary desc)"์ˆœ์œ„" , employee.* from employee)
	where "์ˆœ์œ„" <= 5;
// employee.* : ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋‚˜ ์ปฌ๋Ÿผ๊ณผ ํ•จ๊ป˜ *์„ ์จ์ฃผ๊ณ  ์‹ถ์œผ๋ฉด ํ…Œ์ด๋ธ”๋ช…. *์˜ ํ˜•์‹
// salary๋ฅผ desc๋กœ ํ•˜๊ณ  rownum์„ ๋งค๊ฒจ์ฃผ๊ณ  , employee๋กœ ๋ถ€ํ„ฐ ๋ชจ๋“ ๊ฑธ ์–ป์–ด ์˜จ ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ
// ์ˆœ์œ„, emp_name, salary๋ฅผ ์ถœ๋ ฅ ํ•˜๋Š”๊ฒƒ

๐Ÿ”Ž // 2๋ฒˆ
select
    *
from (select row_number() over(order by salary desc)"์ˆœ์œ„" ,
           emp_name "์‚ฌ์›๋ช…", salary "์›”๊ธ‰" from employee);

// 1๋ฒˆ๊ณผ 2๋ฒˆ์€ ๊ฐ™์€ ์ฝ”๋“œ
๐Ÿ”Ž
// -- 5์œ„ ๋ถ€ํ„ฐ 10์œ„ ์ถœ๋ ฅ
select
    *
from (select row_number() over(order by salary desc)"์ˆœ์œ„" ,
        emp_name "์‚ฌ์›๋ช…", salary "์›”๊ธ‰" from employee)
    where "์ˆœ์œ„" between 5 and 10;
๐Ÿ”Ž
// ์—ฐ๋ด‰ (๋ณด๋„ˆ์Šค ํฌํ•จ -> (salary + (salary * bonus)) * 12 )์ด ๊ฐ€์žฅ ๋†’์€ ์ˆœ์„œ๋Œ€๋กœ ์ˆœ์œ„ ๋งค๊น€
//10 ~ 15์œ„ ์‚ฌ์ด์ธ ์ง์›๋“ค์˜ ์ˆœ์œ„, ์‚ฌ์›๋ช…, ์—ฐ๋ด‰, ์ง๊ธ‰์ฝ”๋“œ, ๋ถ€์„œ์ฝ”๋“œ

select
    *
from (select row_number() over(order by (salary + (salary * nvl(bonus,0))) * 12 desc) "์ˆœ์œ„",
    emp_name "์‚ฌ์›๋ช…",
    (salary + (salary * nvl(bonus,0))) * 12  "์—ฐ๋ด‰",
    job_code "์ง๊ธ‰์ฝ”๋“œ",
    nvl(dept_code,'์ธํ„ด') "๋ถ€์„œ์ฝ”๋“œ" from employee)
    where "์ˆœ์œ„" between 10 and 15;

3๏ธโƒฃ rank() over()

  • ์ˆœ์œ„๋ฅผ ๋งค๊ธธ ๋•Œ ์ค‘๋ณต๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฐ™์€ ์ˆœ์œ„๋ฅผ ๋งค๊ธฐ๊ณ , ๊ฐ™์€ ์ˆœ์œ„๋ฅผ ๋งค๊ธด ๋ฐ์ดํ„ฐ๋งŒํผ ๊ฑด๋„ˆ๋›ฐ์–ด ๋‹ค์Œ ์ˆœ์œ„๋ฅผ ๋งค๊น€

2.png

4๏ธโƒฃ dense_rank() over()

  • ์ค‘๋ณต ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๊ฐ™์€ ์ˆœ์œ„๋ฅผ ๋งค๊ธฐ๊ณ  ๊ทธ ๋‹ค์Œ ์ˆœ์œ„๋ถ€ํ„ฐ๋Š” ๊ฑด๋„ˆ๋œ€ ์—†์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆœ์œ„๋ฅผ ๋งค๊น€ โ†’ ์ด ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜์™€ ๋์ˆœ์œ„ ๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ

3.png

๐Ÿ”Ž // 1๋ฒˆ
select
    ์ˆœ์œ„, emp_name, salary  // ์—ฌ๊ธฐ์„œ ์ˆœ์œ„(rownum)๋Š” row_number์—์„œ ๊ฐ€์ ธ์˜จ๊ฒƒ, emp_name,salary๋Š” employee *์—์„œ ์˜จ ๋ฐ์ดํ„ฐ
from (select row_number() over(order by salary desc)"์ˆœ์œ„" , employee.* from employee)
	where "์ˆœ์œ„" <= 5;
// employee.* : ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋‚˜ ์ปฌ๋Ÿผ๊ณผ ํ•จ๊ป˜ *์„ ์จ์ฃผ๊ณ  ์‹ถ์œผ๋ฉด ํ…Œ์ด๋ธ”๋ช…. *์˜ ํ˜•์‹
// salary๋ฅผ desc๋กœ ํ•˜๊ณ  rownum์„ ๋งค๊ฒจ์ฃผ๊ณ  , employee๋กœ ๋ถ€ํ„ฐ ๋ชจ๋“ ๊ฑธ ์–ป์–ด ์˜จ ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ
// ์ˆœ์œ„, emp_name, salary๋ฅผ ์ถœ๋ ฅ ํ•˜๋Š”๊ฒƒ

๐Ÿ”Ž // 2๋ฒˆ
select
    *
from (select row_number() over(order by salary desc)"์ˆœ์œ„" ,
           emp_name "์‚ฌ์›๋ช…", salary "์›”๊ธ‰" from employee);

// 1๋ฒˆ๊ณผ 2๋ฒˆ์€ ๊ฐ™์€ ์ฝ”๋“œ

๐Ÿš€ ์‹ค์Šต

๋ฌธ์ œ)

  1. ๊ฐ€์žฅ ๋ณด๋„ˆ์Šค๋ฅผ ๋งŽ์ด ๋ฐ›๋Š” ์ˆœ์œผ๋กœ ์ˆœ์œ„๋ฅผ ๋งค๊น€
  2. 4~8์œ„ ์‚ฌ์›๋“ค์˜ ์ˆœ์œ„,์ด๋ฆ„, ๊ธ‰์—ฌ, ๋ณด๋„ˆ์Šค๋ฅผ ์ถœ๋ ฅ

1) row_number

select
    *
from(select
        row_number() over(order by nvl(bonus,0) desc)"์ˆœ์œ„",
        emp_name "์ด๋ฆ„",
        salary "๊ธ‰์—ฌ",
        nvl(bonus,0)"๋ณด๋„ˆ์Šค" from employee)
    where "์ˆœ์œ„" between 4 and 8;
  • order by์—์„œ null์ด ๊ฐ€์žฅ ํฐ ๊ฐ’์œผ๋กœ ์ธ์‹

2) rank() over()

select
    *
from(select
        rank() over(order by nvl(bonus,0) desc)"์ˆœ์œ„",
        emp_name "์ด๋ฆ„",
        salary "๊ธ‰์—ฌ",
        nvl(bonus,0)"๋ณด๋„ˆ์Šค" from employee)
    where "์ˆœ์œ„" between 4 and 8;

3) dense_rank() over()

select
    *
from(select
        dense_rank() over(order by nvl(bonus,0) desc)"์ˆœ์œ„",
        emp_name "์ด๋ฆ„",
        salary "๊ธ‰์—ฌ",
        nvl(bonus,0)"๋ณด๋„ˆ์Šค" from employee)
    where "์ˆœ์œ„" between 4 and 8;

Categories:

Updated:

Leave a comment