개요
MySQL에서 대량의 데이터 중 원하는 범위의 행만 골라 조회해야 하는 경우가 자주 있습니다. 이럴 때 ORDER BY, LIMIT, OFFSET 절을 조합하면 손쉽게 해결할 수 있습니다. 이번 글에서는 실제 예제를 통해 특정 범위의 행을 선택하는 방법을 단계별로 살펴보겠습니다.
1단계: 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName varchar(20)
);
Query OK, 0 rows affected (1.23 sec)
2단계: 레코드 삽입
INSERT 명령을 사용해 테이블에 학생 데이터를 입력합니다.
mysql> insert into DemoTable(StudentName) values('John');
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable(StudentName) values('Carol');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable(StudentName) values('David');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable(StudentName) values('Bob');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(StudentName) values('Chris');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(StudentName) values('Robert');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(StudentName) values('Adam');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(StudentName) values('Mike');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(StudentName) values('Sam');
Query OK, 1 row affected (0.16 sec)3단계: 전체 레코드 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
출력 결과
+----+-------------+
| Id | StudentName |
+----+-------------+
| 1 | John |
| 2 | Carol |
| 3 | David |
| 4 | Bob |
| 5 | Chris |
| 6 | Robert |
| 7 | Adam |
| 8 | Mike |
| 9 | Sam |
+----+-------------+
9 rows in set (0.00 sec)
4단계: 특정 범위의 행 선택하기
이제 본론입니다. 아래 쿼리처럼 ORDER BY로 정렬 기준을 잡고, LIMIT과 OFFSET을 조합하면 원하는 위치의 행만 가져올 수 있습니다.
mysql> select *from DemoTable ORDER BY Id DESC LIMIT 4 OFFSET 2;
출력 결과
+----+-------------+
| Id | StudentName |
+----+-------------+
| 7 | Adam |
| 6 | Robert |
| 5 | Chris |
| 4 | Bob |
+----+-------------+
4 rows in set (0.00 sec)
쿼리 동작 원리
각 절이 어떤 역할을 하는지 자세히 살펴보겠습니다.
- ORDER BY Id DESC: Id 컬럼을 기준으로 내림차순(큰 값부터) 정렬합니다. 따라서 순서는 9, 8, 7, 6, 5, 4, 3, 2, 1이 됩니다.
- OFFSET 2: 정렬된 결과에서 앞의 2개 행(Id 9, 8)을 건너뜁니다.
- LIMIT 4: 건너뛴 후 남은 결과 중 최대 4개의 행만 반환합니다.
그 결과 Id가 7, 6, 5, 4인 네 개의 행이 출력되었습니다. 이처럼 LIMIT과 OFFSET을 활용하면 게시판 페이징 처리나 특정 구간 데이터 추출 등 다양한 상황에서 유용하게 사용할 수 있습니다.