MySQL에서 여러 테이블의 열을 합산하는 방법
MySQL에서 여러 테이블에 흩어져 있는 열의 합계를 구하려면 UNION ALL을 활용하면 됩니다. UNION ALL은 각 테이블의 데이터를 하나의 결과 집합으로 결합해 주기 때문에, 이를 서브쿼리로 감싼 뒤 SUM() 함수를 적용하면 전체 합계를 손쉽게 계산할 수 있습니다.
개념을 확실히 이해하기 위해 예제 테이블 두 개를 만들어 실습해 보겠습니다.
1단계: 첫 번째 테이블 생성하기
먼저 Products1이라는 이름의 첫 번째 테이블을 생성합니다. 사용할 쿼리는 다음과 같습니다.
mysql> create table Products1
-> (
-> ProductId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ProductName varchar(20),
-> ProductPrice int
-> );
Query OK, 0 rows affected (0.50 sec)2단계: 첫 번째 테이블에 데이터 삽입하기
INSERT 명령어를 사용해 첫 번째 테이블에 몇 개의 레코드를 추가합니다.
mysql> insert into Products1(ProductName,ProductPrice) values('Product-1',100);
Query OK, 1 row affected (0.22 sec)
mysql> insert into Products1(ProductName,ProductPrice) values('Product-2',200);
Query OK, 1 row affected (0.34 sec)
mysql> insert into Products1(ProductName,ProductPrice) values('Product-3',700);
Query OK, 1 row affected (0.15 sec)SELECT 문으로 첫 번째 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> select *from Products1;
실행 결과는 다음과 같습니다.
+-----------+-------------+--------------+ | ProductId | ProductName | ProductPrice | +-----------+-------------+--------------+ | 1 | Product-1 | 100 | | 2 | Product-2 | 200 | | 3 | Product-3 | 700 | +-----------+-------------+--------------+ 3 rows in set (0.00 sec)
3단계: 두 번째 테이블 생성하기
이번에는 구조가 동일한 두 번째 테이블 Products2를 생성합니다.
mysql> create table Products2
-> (
-> ProductId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ProductName varchar(20),
-> ProductPrice int
-> );
Query OK, 0 rows affected (0.63 sec)4단계: 두 번째 테이블에 데이터 삽입하기
INSERT 명령어로 두 번째 테이블에도 레코드를 추가합니다.
mysql> insert into Products2(ProductName,ProductPrice) values('Product-1',500);
Query OK, 1 row affected (0.24 sec)
mysql> insert into Products2(ProductName,ProductPrice) values('Product-4',100);
Query OK, 1 row affected (0.13 sec)
mysql> insert into Products2(ProductName,ProductPrice) values('Product-5',400);
Query OK, 1 row affected (0.10 sec)SELECT 문으로 두 번째 테이블의 데이터를 확인합니다.
mysql> select *from Products2;
실행 결과는 다음과 같습니다.
+-----------+-------------+--------------+ | ProductId | ProductName | ProductPrice | +-----------+-------------+--------------+ | 1 | Product-1 | 500 | | 2 | Product-4 | 100 | | 3 | Product-5 | 400 | +-----------+-------------+--------------+ 3 rows in set (0.00 sec)
5단계: UNION ALL로 두 테이블의 열 합계 구하기
이제 핵심 단계입니다. 아래 쿼리처럼 각 테이블의 ProductPrice 열을 UNION ALL로 결합한 서브쿼리를 만들고, 그 결과에 SUM() 함수를 적용하면 두 테이블 전체의 합계를 한 번에 구할 수 있습니다.
mysql> SELECT SUM(tbl.ProductPrice) AS TotalPrice
-> FROM (SELECT ProductPrice FROM Products1
-> UNION ALL
-> SELECT ProductPrice FROM Products2) tbl;실행 결과는 다음과 같습니다.
+------------+ | TotalPrice | +------------+ | 2000 | +------------+ 1 row in set (0.04 sec)
결과 해석 및 참고 사항
Products1의 합계(100 + 200 + 700 = 1,000)와 Products2의 합계(500 + 100 + 400 = 1,000)를 더한 값인 2,000이 정상적으로 출력되었습니다.
여기서 주의할 점은 UNION 대신 반드시 UNION ALL을 사용해야 한다는 것입니다. UNION은 중복된 값을 제거하기 때문에, 두 테이블에 동일한 가격 데이터가 있을 경우 잘못된 합계가 나올 수 있습니다. UNION ALL은 중복을 제거하지 않고 모든 행을 그대로 결합하므로 정확한 합계를 보장합니다.
또한 이 방식은 테이블이 세 개 이상일 때도 동일하게 적용할 수 있습니다. UNION ALL로 결합할 테이블 수를 늘리기만 하면 되므로, 여러 테이블에 분산된 데이터의 집계 작업에 매우 유용하게 활용됩니다.