Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 여러 테이블의 전체 결과 수 제한하기 – UNION ALL과 LIMIT 활용법

MySQL에서 여러 테이블을 조회할 때 전체 결과 수를 제한하려면 UNION ALLLIMIT 절을 함께 사용하면 됩니다. 이 글에서는 세 개의 테이블을 만들고, 각 테이블에서 상위 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를 적용하면, 여러 테이블에 걸친 전체 결과 수도 손쉽게 제한할 수 있습니다.