09. SQL syntax(7) - Rownum

     select rownum from ~~~~ order by -> rownum먼저 수행되므로 order by하면 rownum은 섞일 수 있다.

     where -> group by -> having -> order by 순서로 진행

     rownum은 항상 추출된  1부터 부여된다.


     where rownum >= 3 (X) 조건절에 만족하지 아니하면 

     매번 1부터 넘버링이되고 매번 조건에 만족하지 않으므로 결과가 나오지 않는다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/* Ex 1 : */
select   rownum, id, name, salary 
from     emp_test 
order by salary desc nulls last;
 
/* Ex 2 : */
select   rownum, id, name, salary 
from     emp_test 
where    rownum <=7 
order by salary desc nulls last; 
/* (쓰레기, order by가 나중에 적용) */
 
/* Ex 3 : */
select rownum, vt.rnum, vt.id, vt.name, vt.salary
from (select   rownum rnum, id, name, salary 
      from     emp_test 
      order by salary desc nulls last) vt 
where rownum <= 7;
 
/* Ex 4 : */
select rownum, vt.rnum, vt.id, vt.name, vt.salary
from (select rownum rnum, id, name, salary 
      from emp_test 
      order by salary desc nulls last) vt 
where rownum > 7;
/* (X) */
 
cs

     rownum은 항상 추출된 1부터 부여된다. 조건절에 만족하지 아니하면 

     매번 첫행부터 1씩 넘버링이되고 매번 조건에 만족하지 않으므로 결과가 나오지 않는다

     ROWNUM은 FROM WHERE절에 대한 순번으로서 1부터 시작해야된다. 

     다음 ROW가 추출 될 때마다 ROWNUM의 값을 순차적으로 증가, 

     그런데 1이 존재하지 않는다면 다시 1부터 숫자가 부여된다.

     다음 순번을 증가부여 할 수 없으므로 아무런 데이터가 추출되지 않는다.


1
2
3
4
5
6
7
select vt1.rrnum, vt1.rnum, vt1.id, vt1.name, vt1.salary
from (select rownum rrnum, vt.rnum vt.id, vt.name, vt.salary 
      from(select   Rownum rnum, id, name, salary 
           from     emp_test 
           order by salary desc nulls last) vt
      ) vvt 
where rownum > 7;
cs


+ Recent posts