데이터베이스 연구실.log

조회 행 수 제한

ROWNUM 의사 컬럼과 FETCH FIRST로 결과 행 수를 제한하는 방법, ROWNUM과 ORDER BY의 순서 문제, N번째 행을 고르는 방법

ROWNUMTop-NFETCH FIRST인라인 뷰RANK

#핵심 요약

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

SQL Developer 또는 SQL*Plus조회만 함
SELECT ROWNUM, empno, ename, sal
  FROM emp
 WHERE ROWNUM <= 5;

SELECT *
  FROM emp
 WHERE ROWNUM = 1;

결과 해석:

두 번째 행만 출력:

SQL Developer 또는 SQL*Plus조회만 함
SELECT *
  FROM (
        SELECT ROWNUM 번호, e.*
          FROM emp e
       )
 WHERE 번호 = 2;

결과 해석:

실습에서는 먼저 WHERE ROWNUM <= 2를 시도했지만 이 문장은 두 행을 돌려줌
위 문장처럼 안쪽에서 번호를 컬럼으로 만들어야 함
안쪽에 ORDER BY가 없으므로 "두 번째 행"은 정렬 기준이 없는 임의의 행임

정렬 기준이 있는 N번째: SALESMAN 중 월급이 두 번째로 높은 사원

SQL Developer 또는 SQL*Plus조회만 함
SELECT ename, sal, job
  FROM (
        SELECT ename, sal, job, RANK() OVER (ORDER BY sal DESC) 순위
          FROM emp
         WHERE job = 'SALESMAN'
       )
 WHERE 순위 = 2;

결과 해석:

RANK는 같은 값에 같은 순위를 주므로 결과가 여러 행일 수 있음
순위 함수는 순위와 구간 분석에서 다룸

맨 위 한 건:

SQL Developer 또는 SQL*Plus조회만 함
SELECT ename, sal
  FROM emp
 ORDER BY sal DESC
 FETCH FIRST 1 ROWS ONLY;

결과 해석:

실습에서는 PostgreSQL에서는 LIMIT 1을 쓴다고 적었음
FETCH FIRST 구문의 공식 문서 대조는 하지 않았음

#사용 조건과 주의사항

ROWNUM으로 Top-N을 구할 때 같은 쿼리에 ORDER BY를 같이 쓰면 원하는 결과가 아닐 수 있음

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기