UNION ALL과 SUM()으로 여러 테이블의 합계 구하기
동일한 구조의 여러 테이블에 데이터가 나눠져 있을 때, 모든 테이블의 값을 한 번에 합산해야 하는 경우가 종종 있습니다. 이럴 때는 UNION ALL과 SUM() 함수를 함께 사용하면 간단하게 해결할 수 있습니다.
먼저 예제를 위해 'UP'이라는 동일한 열을 가진 5개의 테이블을 생성하고 데이터를 삽입해 보겠습니다.
1. 예제 테이블 생성 및 데이터 삽입
mysql> create table DemoTable1977
(
UP int
);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into DemoTable1977 values(10);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1977 values(20);
Query OK, 1 row affected (0.00 sec)
mysql> select * from DemoTable1977;
+------+
| UP |
+------+
| 10 |
| 20 |
+------+
2 rows in set (0.00 sec)mysql> create table DemoTable1978
(
UP int
);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into DemoTable1978 values(30);
Query OK, 1 row affected (0.00 sec)
mysql> select * from DemoTable1978;
+------+
| UP |
+------+
| 30 |
+------+
1 row in set (0.00 sec)mysql> create table DemoTable1979
(
UP int
);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into DemoTable1979 values(40);
Query OK, 1 row affected (0.00 sec)
mysql> select * from DemoTable1979;
+------+
| UP |
+------+
| 40 |
+------+
1 row in set (0.00 sec)mysql> create table DemoTable1980
(
UP int
);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into DemoTable1980 values(50);
Query OK, 1 row affected (0.00 sec)
mysql> select * from DemoTable1980;
+------+
| UP |
+------+
| 50 |
+------+
1 row in set (0.00 sec)mysql> create table DemoTable1981
(
UP int
);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into DemoTable1981 values(60);
Query OK, 1 row affected (0.00 sec)
mysql> select * from DemoTable1981;
+------+
| UP |
+------+
| 60 |
+------+
1 row in set (0.00 sec)2. 5개 테이블의 합계를 계산하는 쿼리
'UP'이라는 단일 열을 가진 5개 테이블의 전체 합계를 구하는 쿼리는 다음과 같습니다. 각 테이블에서 SUM(UP)으로 합계를 구한 뒤 UNION ALL로 결과를 하나로 묶고, 외부 쿼리에서 다시 전체 합계를 계산하는 구조입니다.
mysql> select sum(TotalSum)
from (
select sum(UP) as TotalSum
from DemoTable1977
union all
select sum(UP)
from DemoTable1978
union all
select sum(UP)
from DemoTable1979
union all
select sum(UP)
from DemoTable1980
union all
select sum(UP)
from DemoTable1981
) tbl;3. 실행 결과
+---------------+ | sum(TotalSum) | +---------------+ | 210 | +---------------+ 1 row in set (0.00 sec)
실행 결과는 10 + 20 + 30 + 40 + 50 + 60 = 210으로, 5개 테이블의 모든 값이 정상적으로 합산된 것을 확인할 수 있습니다.
쿼리 동작 원리
- 내부 서브쿼리: 각 테이블별로 SUM(UP)을 계산해 테이블 단위 합계를 구합니다.
- UNION ALL: 각 테이블의 합계 결과를 중복 제거 없이 그대로 세로로 이어 붙입니다.
- 외부 쿼리: UNION ALL로 합쳐진 값들을 다시 SUM()으로 더해 최종 합계를 반환합니다.
여기서 UNION 대신 UNION ALL을 사용하는 것이 중요합니다. UNION은 결과 집합에서 중복된 값을 자동으로 제거하기 때문에, 서로 다른 테이블에서 우연히 같은 합계 값이 나올 경우 해당 행이 하나로 병합되어 잘못된 최종 합계가 계산될 수 있습니다. 반면 UNION ALL은 모든 행을 그대로 유지하므로 정확한 결과를 보장하며, 중복 검사 과정이 없어 성능 면에서도 더 유리합니다.