* 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?
- rownum은 sql결과 셋에 순번을 부여하는 가상 컬럼으로, fetch 단계에서 추출하는 첫번째 row에 1을 부여
- 그런데 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;