Top N 쿼리
쉽게 말하면
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 TIES | N번째와 정렬 값이 같은 행까지 함께 가져오기 |
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 ROWNUM | SELECT * FROM (SELECT ename, sal FROM emp ORDER BY sal DESC) WHERE ROWNUM <= 3 |
| SQL Server TOP | SELECT TOP (3) ename, sal FROM emp ORDER BY sal DESC (TOP은 ORDER BY 뒤에 적용) |
| TOP … WITH TIES | SELECT TOP (3) WITH TIES … ORDER BY sal DESC (3등과 동점도 포함) |
| 표준 FETCH | SELECT ename, sal FROM emp ORDER BY sal DESC FETCH FIRST 3 ROWS ONLY |
| OFFSET … FETCH | ORDER 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 |
시험에 이렇게 나와요
- ROWNUM은 ORDER BY보다 먼저 → 인라인 뷰에서 정렬 후 ROWNUM
- ROWNUM = 2, ROWNUM > 1 은 결과 없음
- SQL Server TOP, WITH TIES 결과 행 수
- FETCH FIRST / OFFSET 문법
- 같은 Top N 결과를 내는 SQL 고르기
출제 범위·공식 안내 기반
확인 문제
Q1. 급여가 가장 적은 3명을 구하려고 SELECT ename, sal FROM emp WHERE ROWNUM <= 3 ORDER BY sal을 실행했다. 결과는?
- 오류
- 결과 없음
- 급여가 가장 적은 3명
- 테이블에서 먼저 읽힌 3명을 급여 순으로 정렬한 것
정답 보기
4번 테이블에서 먼저 읽힌 3명을 급여 순으로 정렬한 것
ROWNUM은 WHERE를 통과하는 순간 매겨지고, ORDER BY는 그 뒤에 실행된다. 그래서 아무 3명을 먼저 뽑고 정렬만 한다. 정렬한 뒤 자르려면 인라인 뷰 안에서 ORDER BY하고 바깥에서 ROWNUM으로 자른다.
Q2. 급여 상위 3명을 올바르게 구하는 Oracle SQL은?
- SELECT ename FROM emp ORDER BY sal DESC WHERE ROWNUM <= 3
- SELECT ename FROM emp WHERE ROWNUM <= 3 ORDER BY sal DESC
- SELECT ename FROM (SELECT ename FROM emp ORDER BY sal DESC) WHERE ROWNUM <= 3
- 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. 결과 행이 나오지 않는 조건은?
- ROWNUM <= 5
- ROWNUM < 3
- ROWNUM > 2
- ROWNUM = 1
정답 보기
3번 ROWNUM > 2
1번이 탈락하면 다음 행이 다시 1번이라 2보다 큰 번호가 나올 수 없다.
Q4. 급여가 (900, 800, 800, 700)일 때 SELECT TOP (2) WITH TIES … ORDER BY sal DESC의 결과 행 수는?
- 1
- 2
- 3
- 4
정답 보기
3번 3
2번째(800)와 같은 값인 3번째 800까지 포함해 3행.
Q5. EMP 12행에서 WHERE ROWNUM <= 3 의 결과 행 수는?
- 0
- 1
- 3
- 12
정답 보기
3번 3
ROWNUM은 1부터 차례로 붙으므로 3 이하는 3행이다. 다만 정렬 전 순서다.
Q6. 표준 SQL로 앞의 5행만 가져오는 구문은?
- LIMIT ROWNUM 5
- ROWNUM = 5
- TOP (5)
- 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 조회할 때만 붙는 가상 열이다.