본문 바로가기
CS/DataBase

데이터베이스 첫걸음 정리 - 11장. 결과행 제한하기

by yongckim 2022. 9. 1.
728x90
반응형

인터넷 쇼핑몰에서 물건을 구매하거나 커뮤니티 사이트의 게시판을 읽다 보면, 수많은 상품과 게시물을 전부 하나의 페이지에 표시하는 대신 몇 건식 나누어 표시하는 것을 알 수 있습니다.

이런 경우 LIMIT 구를 사용해 표시할 건 수를 제한할 수 있습니다.

행수 제한

LIMIT 구는 표준 SQL은 아닙니다.

MySQL과 PostgreSQL에서 사용할 수 있는 문법이라는 점을 기억해둡시다.

LIMIT구를 사용하기 위해서는 SELECT 명령의 마지막에 지정하는 것으로 WHERE 구나 ORDER BY 구의 뒤에 지정합니다.

 SELECT 열명 FROM 테이블명 WHERE 조건식 ORDER BY 열명 LIMIT 행수

LIMIT 다음에는 최대 행수를 수치로 지정합니다.

만약, LIMIT 10으로 지정하면 최대 10개의 행이 클라이언트로 반환됩니다.

다음은 LIMIT 사용 예시입니다.

SELECT * FROM Customers LIMIT 3;

여기서 알아두어야 할 것은 LIMIT로 지정하는 것은 최대 행수 라는 것입니다.

만약 LIMIT 3으로 지정했는데 테이블에 데이터가 1개밖에 없을 경우 출력되는 데이터는 1개의 행밖에 없습니다.

정렬한 후 제한하기

LIMIT 이전에 WHERE 구와 ORDER BY 구를 사용하여 조건 검색 및 정렬된 결과를 LIMIT로 특정 개수의 행만 반환하도록 처리할 수 있습니다.

여기서 주의해야할 점은 LIMIT는 WHERE과 ORDER BY가 처리된 후 마지막으로 처리된다는 사실을 기억해 두어야 합니다.

SELECT * FROM Customers WHERE CustomerId <= 2 ORDER BY CustomerId DESC LIMIT 3;

위의 결과를 보면 먼저 WHERE로 2 이하의 ID만 검색되고 이를 내림차순 정렬한 결과를 LIMIT로 제한 했다는 것을 알 수 있습니다.

LIMIT로 지정한 갯수보다 데이터의 개수가 적기 때문에 2개가 출력된 것을 확인할 수 있습니다.

LIMIT를 사용할 수 없는 데이터베이스에서 행 제한

앞서 말했듯이 LIMIT는 표준 SQL이 아니기 때문에 MySQL과 PostgreSQL 이외의 데이터베이스에서는 사용할 수 없습니다.

SQL Server에서는 LIMIT와 비슷한 기능을 하는 TOP을 사용할 수 있습니다.

다음과 같이 TOP 뒤에 최대 행수를 지정하면 됩니다.

SELECT TOP 3 * FROM test;

Oracle에는 LIMIT도 TOP도 없습니다. 대신 ROWNUM이라는 열을 사용해 WHERE 구로 조건을 지정하여 행을 제한할 수 있습니다.

SELECT * FROM test WHERE ROWNUM <= 3

ROWNUM은 클라이언트에게 결과가 반환될 때 각 행에 할당되는 행 번호입니다.

단, ROWNUM으로 행을 제한할 때는 WHERE 구로 지정하므로 정렬하기 전에 처리되어 LIMIT로 행을 제한한 경우와 결과값이 다르게 나올 수 있습니다.

오프셋 지정

웹 애플리케이션에서는 클라이언트 브라우저를 통해 페이지 단위로 화면에 표시할 내용을 처리합니다.

대량의 데이터를 하나의 페이지에 표시하는 것은 기능적으로도 속도 측면에서도 효율적이지 못하므로 일반적으로 페이지 나누기(pagination)기능을 사용합니다.

사이트에서 게시판 하단 부분에 “1 2 3 4 5 … 10 다음”와 같은 형식으로 제공되는 것이 그 예시입니다.

이 페이지 나누기 기능은 LIMIT를 사용해 간단히 구현할 수 있습니다.

한 페이지당 5건의 데이터를 표시하도록 한다면 첫 번째 페이지의 경우 LIMIT 5로 결과값을 표시하면 될 것입니다.

그 다음 페이지에서는 6번째 행부터 5건의 데이터를 표시하도록 합니다.

이때 6번째 행부터라는 표현은 결과값으로 부터 데이터를 취득할 위치를 가리키는 것으로 LIMIT 구에 OFFSET으로 지정할 수 있습니다.

SELECT 열명 FROM 테이블명 LIMIT 행수 OFFSET 행수

OFFSET에 의한 시작 위치는 LIMIT 뒤에 기술하며 위치 지정은 0부터 시작하는 컴퓨터 자료구조의 배열 인덱스를 떠올리면 쉽게 이해할 수 있습니다.

간단하게 이야기 하면 시작하고 싶은행 - 1을 하면 원하는 위치에서 시작할 수 있습니다.

예를들어 id가 4번인 데이터부터 시작하고 싶다면 OFFSET 3으로 지정하면 됩니다.

다음은 OFFSET 예시입니다.

SELECT * FROM Customers LIMIT 3 OFFSET 3;

정리

  • LIMIT 구를 사용하면 출력할 행의 개수를 제한할 수 있다
  • LIMIT는 WHERE 구와 ORDER BY 구가 처리된 가장 마지막에 실행된다.
  • LIMIT는 표준 SQL이 아니기 때문에 MySQL, PostgreSQL에서만 사용가능하며, OracleROWNUM, MSSQLTOP을 사용하여 출력할 행을 제한한다.
  • OFFSET을 사용하여 시작할 행의 위치를 지정할 수 있다.

LIMIT와 OFFSET은 데이터 조회시 페이지네이션을 적용할때 쓰이기 때문에 잘 알아 두어야 합니다.

반응형