MySQL에서 서로 다른 여러 테이블의 레코드 개수(COUNT)를 각각 조회한 뒤 그 합계를 구하려면 UNION ALL을 활용하면 됩니다. UNION ALL은 각 SELECT 문의 결과를 중복 제거 없이 그대로 합쳐주기 때문에, 개별 테이블의 COUNT 값을 하나의 결과 집합으로 모은 후 SUM() 함수로 더할 수 있습니다.
먼저 예제에 사용할 첫 번째 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1
-> (
-> Id int,
-> Name varchar(30)
-> );
Query OK, 0 rows affected (1.55 sec)
INSERT 명령으로 테이블에 레코드를 몇 개 삽입합니다.
mysql> insert into DemoTable1 values(10,'Chris Brown');
Query OK, 1 row affected (0.83 sec)
mysql> insert into DemoTable1 values(20,'David Miller');
Query OK, 1 row affected (0.50 sec)
mysql> insert into DemoTable1 values(30,'John Adam');
Query OK, 1 row affected (0.83 sec)
SELECT 문으로 테이블의 전체 레코드를 확인합니다.
mysql> select *from DemoTable1;
출력 결과
+------+--------------+
| Id | Name |
+------+--------------+
| 10 | Chris Brown |
| 20 | David Miller |
| 30 | John Adam |
+------+--------------+
3 rows in set (0.00 sec)
이어서 두 번째 테이블을 생성합니다.
mysql> create table DemoTable2
-> (
-> Amount int
-> );
Query OK, 0 rows affected (1.17 sec)
두 번째 테이블에도 레코드를 삽입합니다.
mysql> insert into DemoTable2 values(100);
Query OK, 1 row affected (0.30 sec)
mysql> insert into DemoTable2 values(200);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable2 values(300);
Query OK, 1 row affected (0.54 sec)
SELECT 문으로 전체 레코드를 확인합니다.
mysql> select *from DemoTable2;
출력 결과
+--------+
| Amount |
+--------+
| 100 |
| 200 |
| 300 |
+--------+
3 rows in set (0.00 sec)
단일 쿼리로 두 테이블의 COUNT 합계 구하기
이제 서브쿼리 안에서 각 테이블의 COUNT(*) 값을 UNION ALL로 결합한 뒤, 외부 쿼리에서 SUM()으로 합산하면 단일 쿼리로 전체 개수의 합계를 얻을 수 있습니다.
mysql> select sum(AllCount) AS Total_Count
-> from
-> (
-> (select count(*) AS AllCount from DemoTable1)
-> union all
-> (select count(*) AS AllCount from DemoTable2)
-> )t;
출력 결과
+-------------+
| Total_Count |
+-------------+
| 6 |
+-------------+
1 row in set (0.03 sec)
DemoTable1에는 3개, DemoTable2에는 3개의 레코드가 있으므로 최종 결과는 6입니다.
참고: UNION 대신 반드시 UNION ALL을 사용해야 합니다. 일반 UNION은 중복된 행을 제거하기 때문에, 두 테이블의 COUNT 값이 같을 경우(예: 둘 다 3) 하나의 행만 남아 잘못된 합계가 계산될 수 있습니다. UNION ALL은 모든 행을 유지하므로 정확한 합계를 보장합니다. 이 방식은 세 개 이상의 테이블로도 손쉽게 확장할 수 있습니다.