결과 제한 문법

상위 N개를 가져오는 의도는 같고, DBMS마다 붙는 꼬리가 다릅니다.

중요한 기준은 먼저 정렬 기준을 고정한 뒤 결과를 자르는 것입니다. 문법은 엔진별로 다르지만 TOP-N의 사고방식은 같습니다.

SQL 표준형

Oracle 12c+ / PostgreSQL
ORDER BY price DESC
FETCH FIRST 10 ROWS ONLY

OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY

이식성을 의식할 때 읽기 좋은 형태입니다. Oracle 최신 버전과 PostgreSQL에서 사용할 수 있습니다.

LIMIT형

MySQL / PostgreSQL
ORDER BY price DESC
LIMIT 10

LIMIT 10 OFFSET 10
LIMIT 10, 10

가장 짧고 자주 보이는 형태입니다. MySQL의 콤마 문법은 첫 숫자가 OFFSET, 둘째 숫자가 개수입니다.

SQL Server형

TOP / OFFSET
SELECT TOP (10) *
FROM products
ORDER BY price DESC

OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY

단순 상위 N은 TOP이 짧고, 페이지네이션은 ORDER BY와 함께 OFFSET FETCH를 사용합니다.

Oracle 전통 방식

ROWNUM
SELECT * FROM (
  SELECT * FROM products
  ORDER BY price DESC
) WHERE ROWNUM <= 10

정렬 후 상위 N을 얻으려면 서브쿼리로 먼저 정렬한 결과를 만든 뒤 ROWNUM을 적용합니다.

정렬 필수

TOP-N은 어떤 기준의 상위인지 ORDER BY로 먼저 계약합니다.

페이지

OFFSET은 잘라낼 앞 행 수, FETCH/LIMIT은 가져올 행 수입니다.

동점

WITH TIES는 마지막 순위와 같은 값을 가진 행까지 함께 반환합니다.