MySQL에서 특정 개수(LIMIT)를 건너뛴 후 나머지 레코드를 원하는 순서대로 정렬하여 조회하려면 서브쿼리(subquery)를 활용하는 것이 효과적입니다. 이 글에서는 예제 테이블을 만들고, 서브쿼리를 사용해 특정 지점 이후의 데이터를 내림차순으로 정렬하여 가져오는 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 학생 정보를 저장할 테이블을 생성합니다.
mysql> create table DemoTable618 (
StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentFirstName varchar(100)
);
Query OK, 0 rows affected (1.45 sec)
2. 샘플 데이터 삽입
INSERT 명령어를 사용해 여러 학생 이름을 입력합니다.
mysql> insert into DemoTable618(StudentFirstName) values('David');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable618(StudentFirstName) values('Chris');
Query OK, 1 row affected (0.44 sec)
mysql> insert into DemoTable618(StudentFirstName) values('Robert');
Query OK, 1 row affected (0.54 sec)
mysql> insert into DemoTable618(StudentFirstName) values('Sam');
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable618(StudentFirstName) values('Mike');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable618(StudentFirstName) values('Carol');
Query OK, 1 row affected (0.28 sec)
mysql> insert into DemoTable618(StudentFirstName) values('Bob');
Query OK, 1 row affected (3.66 sec)
mysql> insert into DemoTable618(StudentFirstName) values('John');
Query OK, 1 row affected (0.17 sec)
3. 전체 데이터 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 확인합니다.
mysql> select *from DemoTable618;
실행 결과는 다음과 같습니다.
+-----------+------------------+ | StudentId | StudentFirstName | +-----------+------------------+ | 1 | David | | 2 | Chris | | 3 | Robert | | 4 | Sam | | 5 | Mike | | 6 | Carol | | 7 | Bob | | 8 | John | +-----------+------------------+ 8 rows in set (0.00 sec)
4. 특정 LIMIT 이후의 레코드를 정렬하여 조회하기
이제 핵심 쿼리입니다. 아래 쿼리는 StudentId가 5 이상인 레코드 중 최대 4개를 먼저 선택한 뒤(내부 서브쿼리), 그 결과를 다시 내림차순(DESC)으로 정렬하여 반환합니다.
mysql> select *from (select StudentId, StudentFirstName from DemoTable618 where StudentId >= 5 order by StudentId limit 4) tbl order by tbl.StudentId desc;
쿼리 동작 원리
- 내부 서브쿼리: WHERE 절로 StudentId가 5 이상인 행만 필터링하고, ORDER BY와 LIMIT 4로 오름차순 기준 상위 4개(5~8번)를 선택합니다.
- 외부 쿼리: 서브쿼리의 결과에 별칭(tbl)을 붙인 후, 다시 내림차순으로 정렬해 최종 결과를 만듭니다.
실행 결과는 다음과 같습니다.
+-----------+------------------+ | StudentId | StudentFirstName | +-----------+------------------+ | 8 | John | | 7 | Bob | | 6 | Carol | | 5 | Mike | +-----------+------------------+ 4 rows in set (0.00 sec)
마무리
이처럼 서브쿼리를 감싸는 방식을 사용하면, 조건 필터링 → 제한(LIMIT) → 재정렬의 흐름을 자유롭게 구성할 수 있습니다. 게시판 페이징이나 최근 데이터 역순 조회 등 실무에서 자주 활용되는 패턴이므로 꼭 익혀두시기 바랍니다.