-
ROWNUM / TOP N / ROW LIMITING 의 사용
1. ROWNUM
ORACLE 에서 가져오고자하는 행 수를 제한할 때 ROWNUM < 2 와 같이 사용할 수 있다.
그런데 ORDER BY 로 정렬된 순의 데이터를 출력하고자 하는 의도는 ROWNUM을 잘못 사용 하는 것이다.
아래 ORDER BY 는 급여 순으로 정렬하고 위에 3개 행을 결과로 출력하는 것을 원했다면 원하는 결과가 나오지 않는다.
랜덤으로 데이터롤 3개 뽑은 후 그 데이터를 정렬해서 출력한다.
ORDER BY 는 결과에 영향을 주지 않는다.
SELECT ENAME, SAM FROM EMP WHERE ROWNUM < 4 ORDER BY SAL DESC;
ORDER BY 가 없다면 ORACLE 의 ROWNUM 조건과 SQL SERVER 의 TOP 절은 같은 결과를 보인다.
ORDER BY 절이 사용되는 경우 ORACLE 은 ROWNUM 조건을 ORDER BY 절보다 먼저 처리되는 WHERE 절에서
처리하므로, 정렬 후 원하는 데이터를 얻기 위해 인라인 뷰에서 먼저 데이터를 정렬한 후 메인 쿼리에서 ROWNUM 을 사용해야한다.
SELECT ENAME, SAL FROM ( SELECT ENAME, SAL FROM EMP ORDER BY SAL DESC ) WHERE ROWNUM <=3;
2. TOP 절
결과 집합으로 나오는 행의 수를 제한할 수 있다.
TOP (N) WITH TIES 로 동일 수치의 데이터는 추가로 더 추출할 수 있다.
SELECT TOP(2) WITH TIES ENAME,SAL FROM EMP ORDER BY SAL DESC;
3. ROW LIMITING 절
ORDER BY 절 다음에 기술하며, ORDER BY 와 함께 수행된다.
ROW와 ROWS 의 구분은 없다.
[ FETCH { FIRST | NEXT } [ { rowcount | percent PERCENT } ] { ROW | ROWS } { ONLY | WITH TIES } ]
FETCH : 반환할 행의 개수나 백분율을 지정한다.
ONLY : 지정된 행의 개수나 백분율만큼 행을 반환한다.
WITH TIES : 마지막 행에 대한 동순위를 포함해서 반환한다.
SELECT EMPNO, SAL FROM EMP ORDER BY SAL, EMPNO FETCH FIRST 5 ROWS ONLY;
[ OFFSET offset { ROW | ROWS } ]
OFFSET offset : 건너뛸 행의 개수를 지정한다.
SELECT EMPNO, SAL FROM EMP ORDER BY SAL, EMPNO OFFSET 5 ROWS;
출처
SQL 전문가 가이드 - 한국데이터산업진흥원
반응형