MySQL에서 특정 개수의 행을 건너뛴 뒤 나머지 행만 조회하고 싶다면 OFFSET을 사용하면 됩니다. OFFSET은 LIMIT과 함께 사용되어 결과 집합의 앞부분을 제외한 행들을 반환해 주는 기능으로, 페이징 처리나 부분 조회에 매우 유용합니다.
이 글에서는 실제 예제를 통해 OFFSET으로 행을 건너뛰고 원하는 행만 선택하는 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 데모용 테이블을 생성합니다.
mysql> create table DemoTable617(Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, FirstName varchar(100));
Query OK, 0 rows affected (1.70 sec)
2. 샘플 데이터 삽입
INSERT 명령을 사용해 이름 데이터를 차례대로 입력합니다.
mysql> insert into DemoTable617(FirstName) values('John');
Query OK, 1 row affected (0.39 sec)
mysql> insert into DemoTable617(FirstName) values('Sam');
Query OK, 1 row affected (0.39 sec)
mysql> insert into DemoTable617(FirstName) values('Carol');
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable617(FirstName) values('Mike');
Query OK, 1 row affected (0.34 sec)
mysql> insert into DemoTable617(FirstName) values('David');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable617(FirstName) values('Bob');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable617(FirstName) values('Robert');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable617(FirstName) values('Chris');
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable617(FirstName) values('Mike');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable617(FirstName) values('Adam');
Query OK, 1 row affected (0.49 sec)3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable617;
실행 결과는 다음과 같습니다.
+----+-----------+
| Id | FirstName |
+----+-----------+
| 1 | John |
| 2 | Sam |
| 3 | Carol |
| 4 | Mike |
| 5 | David |
| 6 | Bob |
| 7 | Robert |
| 8 | Chris |
| 9 | Mike |
| 10 | Adam |
+----+-----------+
10 rows in set (0.00 sec)
4. OFFSET으로 2행 건너뛰고 5행 선택하기
이제 핵심 쿼리입니다. 먼저 FirstName을 내림차순(DESC)으로 정렬한 뒤, OFFSET 2로 앞의 두 행을 건너뛰고 LIMIT 5로 5개 행만 가져옵니다. 마지막으로 서브쿼리 결과를 다시 Id 기준 오름차순으로 정렬해 최종 결과를 출력합니다.
mysql> select tbl.* from (select * from DemoTable617 order by FirstName DESC LIMIT 5 OFFSET 2) AS tbl ORDER BY tbl.Id;
실행 결과는 다음과 같습니다.
+----+-----------+
| Id | FirstName |
+----+-----------+
| 1 | John |
| 4 | Mike |
| 5 | David |
| 8 | Chris |
| 9 | Mike |
+----+-----------+
5 rows in set (0.00 sec)
OFFSET의 동작 원리
OFFSET n은 결과 집합에서 앞의 n개 행을 무시하겠다는 의미입니다. 즉, OFFSET 2는 첫 번째와 두 번째 행을 건너뛰고 세 번째 행부터 결과를 반환합니다. 위 예제에서는 FirstName 내림차순 정렬 순서상 'Robert'와 'Sam'이 건너뛰어지고, 그다음 행들부터 5개가 선택된 것입니다.
이처럼 OFFSET은 게시판 목록의 페이지네이션 구현, 대량 데이터 중 일부 구간만 조회할 때 등 실무에서 폭넓게 활용되므로 LIMIT과 함께 반드시 익혀두는 것이 좋습니다.