MySQL에서 여러 테이블을 조회할 때 전체 결과 수를 제한하려면 UNION ALL과 LIMIT 절을 함께 사용하면 됩니다. 이 글에서는 세 개의 테이블을 만들고, 각 테이블에서 상위 2개씩 데이터를 가져온 뒤 최종적으로 2개의 행만 출력하는 방법을 단계별로 살펴봅니다.
1. 첫 번째 테이블 생성 (demo3)
먼저 정수 값을 저장할 첫 번째 테이블을 생성합니다.
mysql> create table demo3 -> ( -> value int -> ); Query OK, 0 rows affected (1.39 sec)
INSERT 명령으로 샘플 데이터를 입력합니다.
mysql> insert into demo3 values(10); Query OK, 1 row affected (0.13 sec) mysql> insert into demo3 values(20); Query OK, 1 row affected (0.08 sec) mysql> insert into demo3 values(30); Query OK, 1 row affected (0.08 sec)
SELECT 문으로 저장된 데이터를 확인합니다.
mysql> select *from demo3;
+-------+ | value | +-------+ | 10 | | 20 | | 30 | +-------+ 3 rows in set (0.00 sec)
2. 두 번째 테이블 생성 (demo4)
같은 방식으로 두 번째 테이블을 생성합니다.
mysql> create table demo4 -> ( -> value1 int -> ); Query OK, 0 rows affected (2.10 sec)
샘플 데이터를 삽입합니다.
mysql> insert into demo4 values(40); Query OK, 1 row affected (0.10 sec) mysql> insert into demo4 values(10); Query OK, 1 row affected (0.09 sec) mysql> insert into demo4 values(60); Query OK, 1 row affected (0.17 sec)
저장된 데이터를 조회합니다.
mysql> select *from demo4;
+--------+ | value1 | +--------+ | 40 | | 10 | | 60 | +--------+ 3 rows in set (0.00 sec)
3. 세 번째 테이블 생성 (demo5)
마지막으로 세 번째 테이블을 생성합니다.
mysql> create table demo5 -> ( -> value2 int -> ); Query OK, 0 rows affected (2.13 sec)
샘플 데이터를 삽입합니다.
mysql> insert into demo5 values(100); Query OK, 1 row affected (0.09 sec) mysql> insert into demo5 values(60); Query OK, 1 row affected (0.14 sec) mysql> insert into demo5 values(50); Query OK, 1 row affected (0.10 sec)
저장된 데이터를 조회합니다.
mysql> select *from demo5;
+--------+ | value2 | +--------+ | 100 | | 60 | | 50 | +--------+ 3 rows in set (0.00 sec)
4. UNION ALL과 LIMIT로 전체 결과 수 제한하기
이제 각 테이블에서 내림차순(DESC)으로 정렬한 상위 2개의 행을 가져오고, 서브쿼리 전체에 다시 LIMIT 2를 적용해 최종 결과를 2개로 제한합니다.
mysql> select tbl.* -> from ((select * from demo3 ORDER BY value DESC LIMIT 2 -> ) UNION ALL -> (select * from demo4 ORDER BY value1 DESC LIMIT 2 -> ) UNION ALL -> (select * from demo5 ORDER BY value2 DESC LIMIT 2 -> ) -> ) tbl -> -> LIMIT 2;
실행 결과는 다음과 같습니다.
+-------+ | value | +-------+ | 30 | | 20 | +-------+ 2 rows in set (0.00 sec)
동작 원리 정리
- 내부 쿼리: 각 테이블(demo3, demo4, demo5)에서 ORDER BY ... DESC와 LIMIT 2를 사용해 가장 큰 값 2개씩 추출합니다.
- UNION ALL: 중복을 제거하지 않고 세 결과 집합을 그대로 합치므로 총 6개의 행이 만들어집니다.
- 외부 LIMIT 2: 합쳐진 전체 결과에서 상위 2개 행만 반환합니다. 이때 결과 열 이름은 첫 번째 서브쿼리의 'value'를 따릅니다.
이처럼 UNION ALL로 여러 테이블의 결과를 하나로 묶은 뒤 외부 쿼리에서 LIMIT를 적용하면, 여러 테이블에 걸친 전체 결과 수도 손쉽게 제한할 수 있습니다.