MySQL SELECT 문에서 LIMIT 0이 허용되는 이유
아시다시피 MySQL SELECT 문에서 LIMIT 0을 사용하면 빈 결과 집합(Empty Set)이 반환됩니다. 그렇다면 왜 이런 문법이 존재하고, 어떤 용도로 활용될까요?
LIMIT 절은 기본적으로 전체 행이 아니라 결과 중에서 원하는 개수의 행만 가져오고자 할 때 사용합니다. 하지만 LIMIT 0은 단순히 '결과 없음'을 의미하는 것 이상의 실용적인 목적을 가지고 있습니다.
LIMIT 0의 주요 활용 목적
첫째, 컬럼 정보 확인입니다. MySQL API를 사용할 때 LIMIT 0을 실행하면 실제 데이터를 조회하지 않고도 결과 집합의 컬럼 이름과 데이터 타입 등 메타데이터만 얻을 수 있습니다.
둘째, 쿼리 유효성 검사입니다. LIMIT 0을 붙여 실행하면 대량의 데이터를 스캔하지 않으면서도 쿼리의 문법 오류나 유효성을 빠르게 확인할 수 있습니다. 자세한 내용은 아래 MySQL 공식 문서를 참고하세요.
https://dev.mysql.com/doc/refman/8.0/en/limit-optimization.html
LIMIT 0 동작 예시
실제 동작을 확인하기 위해 먼저 테스트용 테이블을 생성하겠습니다. 테이블 생성 쿼리는 다음과 같습니다.
mysql> create table Limit0Demo
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Name varchar(20),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.61 sec)
이제 insert 명령을 사용해 테이블에 레코드를 삽입합니다.
mysql> insert into Limit0Demo(Name) values('David');
Query OK, 1 row affected (0.13 sec)
mysql> insert into Limit0Demo(Name) values('Larry');
Query OK, 1 row affected (0.24 sec)
mysql> insert into Limit0Demo(Name) values('Carol');
Query OK, 1 row affected (0.17 sec)
mysql> insert into Limit0Demo(Name) values('Bob');
Query OK, 1 row affected (0.12 sec)
mysql> insert into Limit0Demo(Name) values('John');
Query OK, 1 row affected (0.11 sec)
mysql> insert into Limit0Demo(Name) values('Sam');
Query OK, 1 row affected (0.11 sec)
mysql> insert into Limit0Demo(Name) values('James');
Query OK, 1 row affected (0.12 sec)
mysql> insert into Limit0Demo(Name) values('Maxwell');
Query OK, 1 row affected (0.13 sec)
mysql> insert into Limit0Demo(Name) values('Ricky');
Query OK, 1 row affected (0.09 sec)
mysql> insert into Limit0Demo(Name) values('Adam');
Query OK, 1 row affected (0.06 sec)
select 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from Limit0Demo;
실행 결과는 다음과 같습니다.
+----+---------+ | Id | Name | +----+---------+ | 1 | David | | 2 | Larry | | 3 | Carol | | 4 | Bob | | 5 | John | | 6 | Sam | | 7 | James | | 8 | Maxwell | | 9 | Ricky | | 10 | Adam | +----+---------+ 10 rows in set (0.00 sec)
사례 1: LIMIT 0 사용하기
쿼리는 다음과 같습니다.
mysql> select *from Limit0Demo limit 0; Empty set (0.00 sec)
위 결과에서 볼 수 있듯이 LIMIT 0을 지정하면 쿼리 자체는 정상적으로 실행되지만, 반환되는 행이 하나도 없기 때문에 'Empty set'이 출력됩니다. 즉, 에러가 발생하는 것이 아니라 의도적으로 빈 결과를 반환하도록 설계된 동작입니다.
사례 2: 특정 개수의 행만 가져오기
테이블에서 원하는 개수의 행만 조회하고 싶다면 LIMIT에 숫자를 지정하면 됩니다. 예를 들어 3개의 행만 가져오는 쿼리는 다음과 같습니다.
mysql> select *from Limit0Demo limit 3;
실행 결과는 다음과 같습니다.
+----+-------+ | Id | Name | +----+-------+ | 1 | David | | 2 | Larry | | 3 | Carol | +----+-------+ 3 rows in set (0.00 sec)
정리
MySQL에서 LIMIT 0이 허용되는 이유는 크게 두 가지입니다. 첫째, API 환경에서 결과 집합의 컬럼 구조와 데이터 타입을 데이터 조회 없이 확인할 수 있고, 둘째, 전체 데이터를 처리하지 않고도 쿼리의 유효성을 신속하게 검증할 수 있기 때문입니다. 따라서 LIMIT 0은 단순한 문법적 허용이 아니라 실무에서 유용하게 쓰이는 최적화 기법이라 할 수 있습니다.