OFFSET과 LIMIT을 사용한 SQL 페이징 예제
데이터베이스에서 많은 양의 데이터를 한 번에 가져오는 것은 비효율적일 수 있습니다. 이를 해결하기 위해 페이징(paging) 기법을 사용하여 필요한 만큼의 데이터만 가져오도록 할 수 있습니다. 이번 포스트에서는 OFFSET과 LIMIT을 사용하여 페이징을 구현하는 방법을 설명하겠습니다.
페이징의 기본 개념
페이징은 데이터를 여러 페이지로 나누어 한 페이지에 일정 개수의 데이터만 보여주는 방식입니다. 이를 통해 데이터베이스에 과부하를 줄이고, 사용자에게 더 나은 경험을 제공합니다.
OFFSET과 LIMIT의 역할
- LIMIT: 한 번에 가져올 데이터의 최대 개수를 설정합니다. 예를 들어, 한 페이지에 10개의 데이터를 보여주고 싶다면 LIMIT 10을 사용합니다.
- OFFSET: 가져올 데이터의 시작 위치를 설정합니다. 예를 들어, 첫 페이지는 처음 10개의 데이터를 가져오고, 두 번째 페이지는 그 다음 10개의 데이터를 가져와야 합니다. 이를 위해 OFFSET을 사용하여 시작 위치를 지정합니다.
SQL 페이징 예제
다음은 OFFSET과 LIMIT을 사용하여 페이징을 구현하는 예제입니다.
예제: 직원 목록 페이징
가정: 직원(employee) 테이블에서 직원 목록을 10개씩 페이지로 나누어 가져오고 싶습니다.
- 첫 번째 페이지:
- LIMIT 10 OFFSET 0: 처음 10개의 데이터를 가져옵니다.
sql코드 복사SELECT * FROM employee LIMIT 10 OFFSET 0; - 두 번째 페이지:
- LIMIT 10 OFFSET 10: 11번째 데이터부터 20번째 데이터까지 가져옵니다.
sql코드 복사SELECT * FROM employee LIMIT 10 OFFSET 10; - 세 번째 페이지:
- LIMIT 10 OFFSET 20: 21번째 데이터부터 30번째 데이터까지 가져옵니다.
sql코드 복사SELECT * FROM employee LIMIT 10 OFFSET 20;
PHP 코드에서의 페이징 구현
아래는 PHP 코드에서 페이지 번호와 한 페이지당 데이터 개수를 사용하여 OFFSET 값을 계산하고, 이를 SQL 쿼리에 적용하는 예제입니다.
<?php
// 데이터베이스 연결
$DB = new mysqli('localhost', 'username', 'password', 'database');
// 현재 페이지 번호와 페이지당 데이터 개수 설정
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$items_per_page = 10;
$offset = ($page - 1) * $items_per_page;
// 전체 직원 수 조회
$total_sql = "SELECT COUNT(*) as total FROM employee";
$total_result = $DB->query($total_sql);
$total_row = $total_result->fetch_assoc();
$total_count = $total_row['total'];
$total_pages = ceil($total_count / $items_per_page);
// 현재 페이지의 직원 목록 조회
$sql = "SELECT * FROM employee LIMIT $items_per_page OFFSET $offset";
$result = $DB->query($sql);
// 결과 출력
$employees = [];
while ($row = $result->fetch_assoc()) {
$employees[] = $row;
}
// JSON 형식으로 출력
$output = [
'current_page' => $page,
'total_pages' => $total_pages,
'employees' => $employees,
];
header('Content-Type: application/json');
echo json_encode($output);
?>
이제 이 PHP 코드는 page 파라미터에 따라 직원 목록을 페이지별로 잘라서 가져옵니다. 예를 들어, http://example.com/employees.php?page=2로 요청하면 두 번째 페이지의 직원 목록을 JSON 형식으로 반환합니다.
결론
OFFSET과 LIMIT을 사용하여 페이징을 구현하면 대용량 데이터를 효율적으로 처리하고, 사용자에게 필요한 만큼의 데이터만 제공할 수 있습니다
'백엔드 > DB' 카테고리의 다른 글
| [DB] AUTOCOMMIT (0) | 2024.04.26 |
|---|---|
| [MariaDB] MariaDB 학습 - 데이터 입력 (0) | 2023.07.10 |
| [MariaDB] MariaDB 학습 - 실습문제 - 서브쿼리 (0) | 2023.07.10 |
| [MariaDB] MariaDB 학습 - 실습문제 - 조인 (0) | 2023.07.10 |
| [MariaDB] MariaDB 학습 - 서브쿼리 (0) | 2023.07.10 |