Post

PostgreSQL 페이징

1. 개념

PostgreSQL에서 OFFSET, LIMIT 및 선택적으로 FETCH NEXT 연산자를 사용하여 페이징을 수행한다.

2. 페이징 처리

1) 샘플 데이터

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE customer
(
    customer_id INT NOT NULL,
    first_name VARCHAR(40) NOT NULL,
    last_name VARCHAR(20) NOT NULL,
    company VARCHAR(80),
    address VARCHAR(70),
    city VARCHAR(40),
    state VARCHAR(40),
    country VARCHAR(40),
    postal_code VARCHAR(10),
    phone VARCHAR(24),
    fax VARCHAR(24),
    email VARCHAR(60) NOT NULL,
    support_rep_id INT,
    CONSTRAINT pk_customer PRIMARY KEY (customer_id)
);

2) LIMIT

LIMIT는 원하는 레코드 수를 쿼리에 알려준다.

LIMIT를 사용할 때 결과 행을 고유한 순서로 제한하는 ORDER BY 절을 사용하는 것이 중요하다. 그렇지 않으면 쿼리 행의 예측할 수 없는 하위 집합이 생성된다.

10번째에서 20번째 행을 요구할 수 있지만 10번째에서 20번째 행의 순서는 알 수 없다. 즉, ORDER BY를 지정하지 않으면 순서를 알 수 없다.

처음 5개의 레코드를 가져오는 쿼리 이다.

1
2
3
select * from public.customer
order by customer_id
limit 5;

3) OFFSET

OFFSET은 쿼리를 시작할 위치를 알려준다.

OFFSET으로 처음 5개 레코드를 가져오는 쿼리 이다. 처음부터 쿼리를 시작하도록 명시적으로 지시하고 있다.

1
2
3
4
select * from public.customer
order by customer_id
limit 5
offset 0;

OFFSET은 0을 기준으로 하기 때문에 1에서 시작하지 않는다.

6~10 명의 레코드를 가져오는 쿼리 이다.

1
2
3
4
select * from public.customer
order by customer_id
limit 5
offset 5;

OFFSET을 사용하여 쿼리를 시작할 위치를 알려준다. 0이 기준이기 때문에 6이 아닌 5를 사용한다.

3. 활용

  • 5개의 레코드를 보여주는 1번 페이지 쿼리
1
2
3
4
select * from public.customer
order by customer_id
limit 5
offset (1 - 1) * 5;
  • 10개의 레코드를 보여주는 2번 페이지 쿼리
1
2
3
4
select * from public.customer
order by customer_id
limit 10
offset (2 - 1) * 10;

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.