DB/SQL

[SQL] 쿼리 결과의 개수를 제한하는 방법(TOP, ROWNUM, LIMIT)

Hyeri.dev 2023. 8. 10. 21:23

TOP절 (SQL Server)

SQL Server에서 쿼리 결과에서 가져올 레코드의 개수를 지정하는데 사용한다.

 

아래와 같이 작성하면 상위 N개의 레코드를 반환한다.

SELECT TOP N 컬럼명 FROM 테이블 명;
  • TOP절은 상위 레코드를 반환하기 때문에 결과의 순서를 보장하지 않는다. 따라서 어떤 기준으로 정렬된 결과를 얻기 위해서는 ORDER BY절과 함께 사용해야 한다.
  • TOP절로 가져온 결과 중에 동등한 값의 레코드가 있는 경우, 어떤 레코드가 선택될지 명시적으로 지정되지 않기 때문에 별도의 처리가 필요하다.
    • ORDER BY절 : 원하는 값을 가져올 수 있도록 추가 정렬을 명시한다.
    • WITH TIES 키워드 : TOP절에 명시한 상위 N개의 레코드 뿐만 아니라 동등한 값을 가진 레코드도 함께 반환된다.
SELECT TOP N WITH TIES 컬럼명
FROM 테이블명
ORDER BY 컬럼명;

ROWNUM절 (Oracle)

Oracle에서 사용되는 가상 열 중 하나로, 쿼리 결과의 각 레코드에 고유한 번호를 할당한다. 이를 통해 각 레코드의 순서를 식별할 수 있으며 원하는 범위의 레코드를 선택할 수 있다. 

 

아래와 같이 작성하면 상위 N개 이하의 레코드를 반환한다.

SELECT 컬럼명 FROM 테이블명 WHERE ROWNUM <= N;
  • ROWNUM절은 데이터가 반환되는 순서대로 번호를 할당하기 때문에 사용 시 주의해야 한다.  
💡SQL 문장 실행 순서
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
ROWNUM절은 WHERE절에 속하기 때문에 ORDER BY절이 실행되기 전에 번호를 할당한다.
  • 인라인 뷰(서브쿼리) 사용
SELECT 컬럼명
FROM (SELECT 컬럼명 FROM 테이블명 ORDER BY 컬럼명)
WHERE ROWNUM <= N;
  • FROM절에 인라인 뷰를 사용하여 데이터를 정렬한 후, 레코드 번호를 할당할 수 있도록 해야한다.
  • TOP절과 달리 동등한 값의 레코드를 함께 반환할 수 있는 키워드가 존재하지 않으므로 ORDER BY절을 사용하여 원하는 순서대로 값이 반환될 수 있도록 해야한다.

LIMIT절(MySQL)

MySQL, PostgreSQL, SQLite 등에서 사용되며 쿼리 결과에서 가져올 레코드의 개수를 지정하는데 사용한다. 

 

아래와 같이 작성하면 상위 N개의 레코드를 반환한다.

SELECT 컬럼명 FROM 테이블명 WHERE 조건 ORDER BY 컬럼명 LIMIT N;
  • LIMIT절은 결과의 순서를 보장하지 않기 때문에 원하는 순서로 결과를 정렬한 후 적용해야 한다.
  • ROWNUM절과 마찬가지로 동등한 값의 레코드 중 어떤 것을 선택할 지 명시되지 않기 때문에 주의해야 한다.
💡OFFSET
LIMIT절은 OFFSET과 함께 사용하면 특정 위치부터 시작하여 원하는 범위의 레코드를 선택할 수 있다. 이를 통해 페이징(paging)에 활용할 수 있다.
SELECT 컬럼명 FROM 테이블명
LIMIT 10 OFFSET 20; 

# 21번째부터 10개의 레코드를 반환한다.​

LIMIT 10 OFFSET 20은 LIMIT 20, 10와 같은 의미를 가진다.