PostgreSQL / SQL Basics / 1.6 Sorting
1.6Sorting
데이터 정렬 및 페이지 단위로 나누어 제공하기
TL;DR
추억의 쪽지 시험
데이터 정렬과 페이지네이션
데이터가 많을수록 사용자가 보기 쉽게 정렬하고, 적절히 나눠서 보여주는 것이 중요하다. 이 포스트에선 ORDER BY
, LIMIT
, OFFSET
을 활용해 정렬하고 페이지 단위로 분할(pagination)하는 방법을 알아보자.
기본 정렬(ORDER BY
)
sqlSELECT * FROM products ORDER BY price;
- 이 쿼리는 products 테이블을 price 기준으로 오름차순(ascending, 낮은 값 → 높은 값) 정렬한다.
- Descending(높은 값 → 낮은 값) 순으로 정렬하려면
DESC
키워드를 사용한다.
sqlSELECT * FROM products ORDER BY price DESC;
복수 기준 정렬
정렬 기준은 여러 개 지정할 수 있다.
sqlSELECT * FROM products ORDER BY price, weight;
위 예시는
- 우선
price
기준으로 오름차순 정렬하고, - 가격이 같은 제품들끼리는
weight
기준 오름차순 정렬한다.
여러 기준이 겹칠 때 데이터를 어떻게 세밀하게 나눌지 지정할 수 있다.
결과를 나눠 보여주기: OFFSET
과 LIMIT
정렬된 데이터를 부분으로 나눠서 보여주는 기능이 필요할 때 OFFSET
과 LIMIT
을 활용한다.
OFFSET
result set에서 생략할 열이 있을 때(건너뛰기) 쓴다.
sqlSELECT * FROM users OFFSET 40;
- 앞에서 40개의 결과(1~40번 결과)는 건너뛰고, 그 다음부터 보여준다.
- 즉, 41번째 결과부터 시작해서 결과를 보여준다.
LIMIT
result set에서, 앞의 몇번째 열까지만 보여줄지(보여줄 개수 제한)를 지정한다.
sqlSELECT * FROM users LIMIT 5;
- 결과 중 앞에서부터 5개만 보여준다.
함께 사용하기 (정렬 + 분할)
정렬된 데이터 중 일부만 볼 때는 ORDER BY
, LIMIT
, OFFSET
을 함께 사용한다.
예: 가격이 가장 비싼 상위 5개 제품
sqlSELECT * FROM products ORDER BY price DESC limit 5;
예: 비싼 제품 6등 ~ 10등
sqlSELECT * FROM products ORDER BY price DESC LIMIT 5 OFFSET 5;
- 비싼 순으로 정렬한 후, 앞의 5개를 건너 뛰고 다음 5개를 가져온다.
Pagination(페이지 나누기)에 활용하기
LIMIT
과 OFFSET
은 사용자에게 데이터를 페이지 단위로 나눠 보여주는 데에도 필수적으로 활용된다.
예를 들어, 한 페이지에 20개씩 보여주는 경우:
- 1 페이지
sqlSELECT * FROM products ORDER BY price LIMIT 20 OFFSET 0;
- 2페이지
sqlSELECT * FROM products ORDER BY price LIMIT 20 OFFSET 20;
- 3페이지
sqlSELECT * FROM products ORDER BY price LIMIT 20 OFFSET 40;
대부분의 웹 페이지나 앱에서 다음 페이지 또는 무한 스크롤 구현 시 이런 방식이 사용된다.