조회 행 수 제한
ROWNUM 의사 컬럼과 FETCH FIRST로 결과 행 수를 제한하는 방법, ROWNUM과 ORDER BY의 순서 문제, N번째 행을 고르는 방법
#핵심 요약
ROWNUM은 조회된 행에 1부터 붙는 감춰진 번호임
전체를 다 가져오지 않고 일부만 볼 때 유용함
같은 쿼리에서 ROWNUM 조건 뒤에 ORDER BY가 오면, 행을 먼저 고른 뒤 정렬함
정렬한 결과에서 위 N건을 자르려면 정렬을 서브쿼리에 넣고 바깥에서 ROWNUM을 걺
ROWNUM > 1, ROWNUM = 2 같은 조건은 행을 돌려주지 않음
N번째 행은 서브쿼리에서 번호를 컬럼으로 만든 뒤 바깥에서 고름
실습에서는 ORDER BY ... FETCH FIRST 1 ROWS ONLY로 맨 위 한 건만 출력했음
#개념과 동작 원리
쿼리가 돌려주는 각 행에 대해 ROWNUM은 테이블이나 조인 결과에서 그 행을 선택한 순서를 나타냄
첫 행이 1, 둘째가 2임
WHERE ROWNUM < 11 ORDER BY last_name은 먼저 10행을 고른 뒤 정렬함
어느 10행이 고를지는 접근 방식(인덱스 사용 여부)에 따라 달라질 수 있음
SELECT * FROM (SELECT ... ORDER BY...) WHERE ROWNUM < 11처럼 쓰면 정렬 뒤 위 10행을 얻음(Top-N)
ROWNUM > 1은 첫 번째로 가져온 행이 1을 받아 조건이 거짓이 되고, 다음 행도 다시 1을 받아 거짓이 되므로 결과가 없음
#필수 명령어 또는 SQL
SELECT ROWNUM, empno, ename, sal
FROM emp
WHERE ROWNUM <= 5;
SELECT *
FROM emp
WHERE ROWNUM = 1;결과 해석:
두 번째 행만 출력:
SELECT *
FROM (
SELECT ROWNUM 번호, e.*
FROM emp e
)
WHERE 번호 = 2;결과 해석:
실습에서는 먼저 WHERE ROWNUM <= 2를 시도했지만 이 문장은 두 행을 돌려줌
위 문장처럼 안쪽에서 번호를 컬럼으로 만들어야 함
안쪽에 ORDER BY가 없으므로 "두 번째 행"은 정렬 기준이 없는 임의의 행임
정렬 기준이 있는 N번째: SALESMAN 중 월급이 두 번째로 높은 사원
SELECT ename, sal, job
FROM (
SELECT ename, sal, job, RANK() OVER (ORDER BY sal DESC) 순위
FROM emp
WHERE job = 'SALESMAN'
)
WHERE 순위 = 2;결과 해석:
RANK는 같은 값에 같은 순위를 주므로 결과가 여러 행일 수 있음
순위 함수는 순위와 구간 분석에서 다룸
맨 위 한 건:
SELECT ename, sal
FROM emp
ORDER BY sal DESC
FETCH FIRST 1 ROWS ONLY;결과 해석:
실습에서는 PostgreSQL에서는 LIMIT 1을 쓴다고 적었음FETCH FIRST 구문의 공식 문서 대조는 하지 않았음
#사용 조건과 주의사항
ROWNUM으로 Top-N을 구할 때 같은 쿼리에 ORDER BY를 같이 쓰면 원하는 결과가 아닐 수 있음