* ROWNUM은 Oracle에서 제공하는 가상컬럼, Select절에서 추출하는 데이터의 순번을 부여하는 용도로 사용.

ROWNUM 데이터를 먼저 추출한 이후 조회하자.

 
--test table 생성
CREATE TABLE ROWNUM_T1
(
C1 NUMBER,
C2 VARCHAR2(10),
C3 NUMBER
);

INSERT INTO ROWNUM_T1 VALUES(1,'C',101);

INSERT INTO ROWNUM_T1 VALUES(2,'D',102);

INSERT INTO ROWNUM_T1 VALUES(3,'E',103);

INSERT INTO ROWNUM_T1 VALUES(4,'F',104);

INSERT INTO ROWNUM_T1 VALUES(5,'G',105);

INSERT INTO ROWNUM_T1 VALUES(6,'H',106);

INSERT INTO ROWNUM_T1 VALUES(7,'I',107);

INSERT INTO ROWNUM_T1 VALUES(8,'J',108);

INSERT INTO ROWNUM_T1 VALUES(9,'K',109);

INSERT INTO ROWNUM_T1 VALUES(10,'L',110);

commit;

 
 
--SQL[1]
SELECT *
  FROM ( SELECT * 
           FROM ROWNUM_T1
         ORDER BY C1)
WHERE ROWNUM >= 1
  AND ROWNUM <= 5;

--결과 
        C1 C2                           C3
---------- -------------------- ----------
         1 C                           101
         2 D                           102
         3 E                           103
         4 F                           104
         5 G                           105
  
--SQL[2]
SELECT *
  FROM ( SELECT * 
           FROM ROWNUM_T1
         ORDER BY C1)
WHERE ROWNUM >= 6
  AND ROWNUM <= 10;

--결과
no rows selected

 
* why?
  1. rownum은 sql결과 셋에 순번을 부여하는 가상 컬럼으로, fetch 단계에서 추출하는 첫번째 row에 1을 부여
  2. 그런데 1이 존재하지 않는다면, 다음 순번을 부여할 수 없으므로 데이터 출력되지 않음
=> rownum을 이용하여 단 한건 또는 1부터 시작하여 순서대로 N개를 추출하는 것은 가능하지만, rownum의 시작을 1이 아닌 다른 값부터 할 경우에는 추출되지 않는다.
 
--SQL[2]
SELECT *
  FROM ( SELECT * 
           FROM ROWNUM_T1
         ORDER BY C1)
WHERE ROWNUM >= 6
  AND ROWNUM <= 10;

--결과
no rows selected

--SQL[2-1] : SQL[2]를 작성한 의도
SELECT C1,C2,C3,RNUM
  FROM (
         SELECT ROWNUM RNUM, t1.*
           FROM (SELECT * FROM ROWNUM_T1 ORDER BY C1) t1
        )
WHERE RNUM >= 6 AND RNUM <= 10;


---------------------------------------
--SQL[2-2] : SQL[2-1]과 결과가 다를까?
SELECT C1,C2,C3,RNUM
  FROM (
         SELECT ROWNUM RNUM, ROWNUM_T1.*
           FROM ROWNUM_T1
        )
WHERE RNUM >= 6 AND RNUM <= 10;