728x90
1. Top N Query(ROWID / ROWNUM)
Top N Query는 테이블을 만들 때 만들지 않아도 오라클에서 자체적으로 만들어주며 식별자로 사용합니다.
또한 수정할 수 없습니다.
CREATE TABLE ROWTEST(NO NUMBER);
INSERT INTO ROWTEST VALUES(111);
INSERT INTO ROWTEST VALUES(222);
INSERT INTO ROWTEST VALUES(333);
먼저 테스트를 위해 ROWTEST 테이블을 만들고 값을 넣어주겠습니다.
ROWTEST 테이블에는 NUMBER형의 NO라는 이름을 가진 컬럼이 있습니다.
SELECT ROWID, ROWNUM, NO FROM ROWTEST;
DELETE FROM ROWTEST WHERE NO=222;
SELECT ROWID, ROWNUM, NO FROM ROWTEST;
222를 DELETE 하고 다시 ROWTEST를 출력해 보았을 때 ROWID는 변하지 않습니다.
하지만 ROWNUM은 변하였습니다.
따라서 ROWID는 테이블이 생성될 때 컬럼에게 주어지는 고유 ID라고 할 수 있습니다.
ROWNUM의 경우 순서를 나타내주기 때문에 값의 갯수에 따라 변합니다.
--연습)
SELECT ENAME, SAL, ROWNUM FROM EMP ORDER BY SAL DESC;
SELECT A.ENAME, A.SAL, ROWNUM FROM (SELECT ENAME, SAL FROM EMP ORDER BY SAL DESC) A;
해당 코드는 SAL컬럼을 내림차순으로 정렬하여 ENAME컬럼과 SAL컬럼을 출력한 것을 묶어주고 A라는 가상테이블로 만듭니다.
이와 같이 출력한 이유를 보겠습니다.
정렬하지 않은 EMP 테이블의 ENAME과 SAL을 출력하면 입력된 순서대로 ROWNUM이 출력이 됩니다.
이를 SAL컬럼의 내림차순으로 정렬을 하게 되면 ROWNUM은 생성된 순서대로 값이 나오기 때문에 뒤죽박죽으로 출력이 됩니다.
따라서 SELECT ENAME, SAL FROM EMP ORDER BY SAL DESC;를 A라는 가상테이블로 만들어 준 다음 SELECT A.ENAME, A.SAL, ROWNUM FROM EMP; 를 출력하게 된다면 SAL이 내림차순으로 정리된 채로 ROWNUM을 출력하게 됩니다.
SELECT * FROM
(SELECT A.ENAME, A.SAL, ROWNUM AS R
FROM (SELECT ENAME, SAL FROM EMP ORDER BY SAL DESC) A) B
WHERE B.R > 2 AND B.R <= 5;
--*) 가장 안에 있는 ( )부터 천천히 해석해보기!
728x90
'RDB > Oracle' 카테고리의 다른 글
[ORACLE] 서브쿼리(SUBQUERY) (0) | 2022.01.05 |
---|---|
[ORACLE] 순위함수(RANK), 계층형함수 (0) | 2022.01.04 |
[ORACLE] 정렬 - ORDER BY (0) | 2022.01.02 |
[ORACLE] 그룹함수 - ROLLUP, CUBE, GROUPING SET (0) | 2022.01.01 |
[ORACLE] UNION, UNION ALL, INTERSECT, MINUS (0) | 2021.12.31 |