sungyup's.

PostgreSQL / SQL Basics / 1.6 Sorting

1.6Sorting

데이터 정렬 및 페이지 단위로 나누어 제공하기

TL;DR

추억의 쪽지 시험

데이터 정렬과 페이지네이션

데이터가 많을수록 사용자가 보기 쉽게 정렬하고, 적절히 나눠서 보여주는 것이 중요하다. 이 포스트에선 ORDER BY, LIMIT, OFFSET을 활용해 정렬하고 페이지 단위로 분할(pagination)하는 방법을 알아보자.

기본 정렬(ORDER BY)

sql
SELECT * FROM products ORDER BY price;
  • 이 쿼리는 products 테이블을 price 기준으로 오름차순(ascending, 낮은 값 → 높은 값) 정렬한다.
  • Descending(높은 값 → 낮은 값) 순으로 정렬하려면 DESC 키워드를 사용한다.
sql
SELECT * FROM products ORDER BY price DESC;

복수 기준 정렬

정렬 기준은 여러 개 지정할 수 있다.

sql
SELECT * FROM products ORDER BY price, weight;

위 예시는

  1. 우선 price 기준으로 오름차순 정렬하고,
  2. 가격이 같은 제품들끼리는 weight 기준 오름차순 정렬한다.

여러 기준이 겹칠 때 데이터를 어떻게 세밀하게 나눌지 지정할 수 있다.

결과를 나눠 보여주기: OFFSETLIMIT

정렬된 데이터를 부분으로 나눠서 보여주는 기능이 필요할 때 OFFSETLIMIT을 활용한다.

OFFSET

result set에서 생략할 열이 있을 때(건너뛰기) 쓴다.

sql
SELECT * FROM users OFFSET 40;
  • 앞에서 40개의 결과(1~40번 결과)는 건너뛰고, 그 다음부터 보여준다.
    • 즉, 41번째 결과부터 시작해서 결과를 보여준다.

LIMIT

result set에서, 앞의 몇번째 열까지만 보여줄지(보여줄 개수 제한)를 지정한다.

sql
SELECT * FROM users LIMIT 5;
  • 결과 중 앞에서부터 5개만 보여준다.

함께 사용하기 (정렬 + 분할)

정렬된 데이터 중 일부만 볼 때는 ORDER BY, LIMIT, OFFSET을 함께 사용한다.

예: 가격이 가장 비싼 상위 5개 제품

sql
SELECT * FROM products ORDER BY price DESC limit 5;

예: 비싼 제품 6등 ~ 10등

sql
SELECT * FROM products ORDER BY price DESC LIMIT 5 OFFSET 5;
  • 비싼 순으로 정렬한 후, 앞의 5개를 건너 뛰고 다음 5개를 가져온다.

Pagination(페이지 나누기)에 활용하기

LIMITOFFSET은 사용자에게 데이터를 페이지 단위로 나눠 보여주는 데에도 필수적으로 활용된다.

예를 들어, 한 페이지에 20개씩 보여주는 경우:

  • 1 페이지
sql
SELECT * FROM products ORDER BY price LIMIT 20 OFFSET 0;
  • 2페이지
sql
SELECT * FROM products ORDER BY price LIMIT 20 OFFSET 20;
  • 3페이지
sql
SELECT * FROM products ORDER BY price LIMIT 20 OFFSET 40;

대부분의 웹 페이지나 앱에서 다음 페이지 또는 무한 스크롤 구현 시 이런 방식이 사용된다.