공든탑앱 열기

Top N 쿼리

SQLD (SQL 개발자) · Top N·계층형 질의·PIVOT·정규 표현식 · 약 13분

쉽게 말하면

Top N 쿼리는 '상위 몇 개만' 가져오는 방법이에요. Oracle의 ROWNUM은 줄에 번호를 붙이는데, 정렬보다 먼저 번호가 붙는 게 함정이에요. 그래서 먼저 안쪽에서 정렬한 뒤 바깥에서 '번호 N 이하'로 잘라야 해요. SQL Server는 TOP, 최신 표준 문법은 FETCH FIRST를 써요.

시험용 정의

Top N 쿼리는 정렬한 결과에서 위에서 N개만 가져오는 쿼리다. Oracle은 결과 행에 1부터 번호를 붙이는 가상 열 ROWNUM을 쓰는데, 번호가 ORDER BY보다 먼저 붙으므로 인라인 뷰에서 정렬 → 바깥 WHERE ROWNUM <= N 모양으로 쓴다. SQL Server는 TOP (N), 표준 문법(Oracle 12c 이상)은 FETCH FIRST N ROWS ONLY를 쓴다.

비유로 이해하기

번호표 기계다. ROWNUM 번호표는 창구에 들어오는 순서(WHERE 통과)대로 나간다. 키 순서로 줄 세우는 건 번호표를 다 받은 다음이라, '키 작은 3명'을 원하면 먼저 키 순서로 줄을 세운 방(인라인 뷰)에서 나오게 해야 한다.

자세히

먼저 알아 둘 말

말뜻
가상 열(Pseudo Column)테이블에 실제로 없지만 조회할 때 쓸 수 있는 열. ROWNUM, LEVEL, ROWID
인라인 뷰FROM 절의 서브쿼리. 그 안에서 ORDER BY를 할 수 있다
WITH TIESN번째와 정렬 값이 같은 행까지 함께 가져오기

ROWNUM 규칙

  • WHERE 조건을 통과한 행에 1, 2, 3… 순서로 붙는다
  • ROWNUM = 1, ROWNUM <= N, ROWNUM < N은 된다
  • ROWNUM = 2나 ROWNUM > 1은 결과가 없다. 첫 행이 1번을 받아야 조건을 통과하는데, 1번은 조건에서 탈락해 다음 행이 다시 1번을 받기 때문이다
  • ORDER BY보다 먼저 붙으므로 정렬된 Top N은 인라인 뷰로

DBMS별 Top N

방법예 (급여 상위 3명)
Oracle ROWNUMSELECT * FROM (SELECT ename, sal FROM emp ORDER BY sal DESC) WHERE ROWNUM <= 3
SQL Server TOPSELECT TOP (3) ename, sal FROM emp ORDER BY sal DESC (TOP은 ORDER BY 뒤에 적용)
TOP … WITH TIESSELECT TOP (3) WITH TIES … ORDER BY sal DESC (3등과 동점도 포함)
표준 FETCHSELECT ename, sal FROM emp ORDER BY sal DESC FETCH FIRST 3 ROWS ONLY
OFFSET … FETCHORDER BY sal DESC OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY (4~6등, 페이지 나누기)
윈도우 함수SELECT * FROM (SELECT ename, RANK() OVER (ORDER BY sal DESC) rk FROM emp) WHERE rk <= 3

시험에 이렇게 나와요

출제 범위·공식 안내 기반

확인 문제

Q1. 급여가 가장 적은 3명을 구하려고 SELECT ename, sal FROM emp WHERE ROWNUM <= 3 ORDER BY sal을 실행했다. 결과는?

  1. 오류
  2. 결과 없음
  3. 급여가 가장 적은 3명
  4. 테이블에서 먼저 읽힌 3명을 급여 순으로 정렬한 것
정답 보기

4번 테이블에서 먼저 읽힌 3명을 급여 순으로 정렬한 것

ROWNUM은 WHERE를 통과하는 순간 매겨지고, ORDER BY는 그 뒤에 실행된다. 그래서 아무 3명을 먼저 뽑고 정렬만 한다. 정렬한 뒤 자르려면 인라인 뷰 안에서 ORDER BY하고 바깥에서 ROWNUM으로 자른다.

Q2. 급여 상위 3명을 올바르게 구하는 Oracle SQL은?

  1. SELECT ename FROM emp ORDER BY sal DESC WHERE ROWNUM <= 3
  2. SELECT ename FROM emp WHERE ROWNUM <= 3 ORDER BY sal DESC
  3. SELECT ename FROM (SELECT ename FROM emp ORDER BY sal DESC) WHERE ROWNUM <= 3
  4. SELECT ename FROM emp WHERE ROWNUM BETWEEN 1 AND 3 ORDER BY sal
정답 보기

3번 SELECT ename FROM (SELECT ename FROM emp ORDER BY sal DESC) WHERE ROWNUM <= 3

인라인 뷰에서 정렬한 뒤 ROWNUM으로 자른다.

Q3. 결과 행이 나오지 않는 조건은?

  1. ROWNUM <= 5
  2. ROWNUM < 3
  3. ROWNUM > 2
  4. ROWNUM = 1
정답 보기

3번 ROWNUM > 2

1번이 탈락하면 다음 행이 다시 1번이라 2보다 큰 번호가 나올 수 없다.

Q4. 급여가 (900, 800, 800, 700)일 때 SELECT TOP (2) WITH TIES … ORDER BY sal DESC의 결과 행 수는?

  1. 1
  2. 2
  3. 3
  4. 4
정답 보기

3번 3

2번째(800)와 같은 값인 3번째 800까지 포함해 3행.

Q5. EMP 12행에서 WHERE ROWNUM <= 3 의 결과 행 수는?

  1. 0
  2. 1
  3. 3
  4. 12
정답 보기

3번 3

ROWNUM은 1부터 차례로 붙으므로 3 이하는 3행이다. 다만 정렬 전 순서다.

Q6. 표준 SQL로 앞의 5행만 가져오는 구문은?

  1. LIMIT ROWNUM 5
  2. ROWNUM = 5
  3. TOP (5)
  4. FETCH FIRST 5 ROWS ONLY
정답 보기

4번 FETCH FIRST 5 ROWS ONLY

TOP은 SQL Server 문법이다.

헷갈리기 쉬운 O·X

SQL Server의 TOP은 ORDER BY로 정렬한 다음에 행을 자른다.

정답 보기

O Oracle ROWNUM과 다른 점이다.

Oracle에서 WHERE ROWNUM <= 3 ORDER BY sal은 급여가 가장 낮은 3명을 돌려준다.

정답 보기

X ROWNUM이 정렬 전에 붙어 먼저 읽힌 3명이 나온다.

ROWNUM은 테이블에 실제로 저장된 열이다.

정답 보기

X 조회할 때만 붙는 가상 열이다.

함께 보면 좋은 개념