개발/sqld
[SQL/2과목] Top-N 쿼리
2ivii
2025. 8. 22. 20:54
이번에는 Top-N 쿼리를 다뤄보겠다. 12시간 뒤가 시험이다... 이제야 이걸 정리하다니 😢
Top-N 쿼리
특정 기준으로 정렬했을 때, 상위 N개의 행만 가져오는 쿼리다. 벤더마다 차이가 있어 이를 구분해야된다!!
ORACLE
오라클에서는 전통적으로 ROWNUM이라는 의사컬럼을 사용하거나, 최신 표준인 FETCH 구문을 사용한다.
ROWNUM을 사용한 방식
ROWNUM은 SELECT된 결과 행에 순서대로 붙는 임시 번호표이다. 근데, 이 번호는 ORDER BY가 실행 전에 부여되기때문에, 반드시 인라인 뷰를 사용해 정렬을 먼저 수행해야된다!
-- 인라인 뷰 사용했을 때
SELECT *
FROM (
SELECT emp_name, salary
FROM employees
ORDER BY salary DESC
)
WHERE ROWNUM <= 3;
-- 인라인 뷰 사용 안했을 때 (잘못됨)
SELECT emp_name, salary
FROM employees
WHERE ROWNUM <= 3
ORDER BY salary DESC;
위는 급여순으로 정렬한 가상테이블에서, 임시번호를 붙여서 위에 3개를 가져온다. 잘 수행한다. 다만 아래처럼 인라인뷰사용안하면, 일반 테이블(정렬안된상태)에서 위에 3개 가져오고 정렬을 하기때문에 원하는 상위컬럼들이 가져와지지 않을 것이다.
FETCH 구문을 사용한 방식
최신에는 FETCH구문을 통해 더 직관적으로 작성할 수 있다.
SELECT emp_name, salary
FROM employees
ORDER BY salary DESC
FETCH FIRST 3 ROWS ONLY;
위와같이, 테이블에서 컬럼 셀렉해서 정렬 후에, FETCH 구문을 통해 상위 3개의 행을 가져올 수 있는 것이다.
MSSQL
MSSQL은 SELECT 절에 TOP N 키워드를 사용하여 매우 직관적으로 Top-N쿼리를 작성한다.
문법은 아래와 같으며 WITH TIES라는 옵션이 있다.
SELECT TOP N [WITH TIES] ... ORDER BY ...
- WITH TIES : ORDER BY를 기준으로 N등과 같은 값을 가진 행이 더 있다면, 그 행들까지 모두 포함하여 결과를 반환한다.
SELECT TOP 3 emp_name, salary
FROM employees
ORDER BY salary DESC;
이는 MSSQL 구문 예시인데, 진짜 직관적인듯 하다.
와 이번포스팅 짧아서 행복하다 ~~