MySQL LIMIT와 ORDER BY의 적용 순서
MySQL에서 LIMIT 절은 ORDER BY 이후에 적용됩니다. 즉, MySQL은 먼저 ORDER BY 조건에 따라 결과 집합을 정렬한 다음, 정렬된 결과에서 지정한 개수만큼 행을 반환합니다.
이 동작 방식을 실제 예제를 통해 확인해 보겠습니다.
1단계: 테이블 생성
먼저 예제에 사용할 테이블을 만들어 보겠습니다.
mysql> create table LimitAfterOrderBy
−> (
−> Id int,
−> Name varchar(100)
−> );
Query OK, 0 rows affected (0.50 sec)
2단계: 데이터 삽입
INSERT 명령을 사용하여 테이블에 레코드를 추가합니다.
mysql> insert into LimitAfterOrderBy values(101,'John');
Query OK, 1 row affected (0.18 sec)
mysql> insert into LimitAfterOrderBy values(102,'Carol');
Query OK, 1 row affected (0.15 sec)
mysql> insert into LimitAfterOrderBy values(103,'Bob');
Query OK, 1 row affected (0.21 sec)
mysql> insert into LimitAfterOrderBy values(104,'Sam');
Query OK, 1 row affected (0.15 sec)
3단계: 전체 데이터 조회
SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> select *from LimitAfterOrderBy;
실행 결과는 다음과 같습니다.
+------+-------+
| Id | Name |
+------+-------+
| 101 | John |
| 102 | Carol |
| 103 | Bob |
| 104 | Sam |
+------+-------+
4 rows in set (0.00 sec)
4단계: ORDER BY 이후 LIMIT 적용 확인
이제 ORDER BY 뒤에 LIMIT를 붙여 쿼리를 실행해 보겠습니다. Name 컬럼을 기준으로 오름차순 정렬한 후 상위 4개 행을 가져오는 쿼리입니다.
mysql> select *from LimitAfterOrderBy order by Name limit 4;
실행 결과는 다음과 같습니다.
+------+-------+
| Id | Name |
+------+-------+
| 103 | Bob |
| 102 | Carol |
| 101 | John |
| 104 | Sam |
+------+-------+
4 rows in set (0.00 sec)
결과 분석
출력 결과를 보면 데이터가 Name 기준으로 알파벳 순(Bob → Carol → John → Sam)으로 먼저 정렬된 것을 확인할 수 있습니다. 원본 테이블에는 Id 순서대로 John, Carol, Bob, Sam이 저장되어 있었지만, 쿼리 결과는 정렬된 순서로 반환되었습니다.
이것은 MySQL이 ORDER BY로 정렬을 완료한 후에 LIMIT를 적용한다는 사실을 명확히 보여줍니다. 만약 LIMIT가 ORDER BY보다 먼저 적용된다면, 정렬되지 않은 상태의 첫 4개 행(Id 101~104)이 그대로 반환되어 John, Carol, Bob, Sam 순서로 출력되었을 것입니다.
정리
- MySQL의 논리적 처리 순서는 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT 순입니다.
- 따라서 LIMIT는 항상 정렬이 완료된 최종 결과 집합에서 상위 N개의 행을 잘라내어 반환합니다.
- 이러한 특성 때문에 페이지네이션(페이징) 처리 시 ORDER BY와 LIMIT를 함께 사용하면 일관된 순서의 결과를 얻을 수 있습니다.