개요
두 개의 테이블이 있고, 각각 PlayerId와 PlayerScore라는 두 개의 열을 가지고 있다고 가정해 보겠습니다. 이때 특정 PlayerId에 해당하는 값만 골라서 두 테이블의 PlayerScore를 모두 합산해야 하는 경우가 있습니다.
이런 경우 UNION 연산자를 활용하면 손쉽게 해결할 수 있습니다. 예제를 통해 단계별로 살펴보겠습니다.
1. 첫 번째 테이블 생성 및 데이터 삽입
먼저 첫 번째 테이블을 생성합니다.
mysql> create table DemoTable1(PlayerId int,PlayerScore int); Query OK, 0 rows affected (9.84 sec)
insert 명령을 사용하여 테이블에 레코드를 삽입합니다.
mysql> insert into DemoTable1 values(1000,87); Query OK, 1 row affected (3.12 sec) mysql> insert into DemoTable1 values(1000,65); Query OK, 1 row affected (1.29 sec) mysql> insert into DemoTable1 values(1001,10); Query OK, 1 row affected (1.76 sec) mysql> insert into DemoTable1 values(1000,45); Query OK, 1 row affected (2.23 sec)
select 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable1;
실행 결과는 다음과 같습니다.
+----------+-------------+ | PlayerId | PlayerScore | +----------+-------------+ | 1000 | 87 | | 1000 | 65 | | 1001 | 10 | | 1000 | 45 | +----------+-------------+ 4 rows in set (0.00 sec)
2. 두 번째 테이블 생성 및 데이터 삽입
다음은 두 번째 테이블을 생성하는 쿼리입니다.
mysql> create table DemoTable2(PlayerId int,PlayerScore int); Query OK, 0 rows affected (11.76 sec)
마찬가지로 insert 명령으로 레코드를 삽입합니다.
mysql> insert into DemoTable2 values(1000,67); Query OK, 1 row affected (0.71 sec) mysql> insert into DemoTable2 values(1001,58); Query OK, 1 row affected (1.08 sec) mysql> insert into DemoTable2 values(1000,32); Query OK, 1 row affected (0.19 sec)
select 문으로 테이블의 전체 레코드를 조회합니다.
mysql> select *from DemoTable2;
실행 결과는 다음과 같습니다.
+----------+-------------+ | PlayerId | PlayerScore | +----------+-------------+ | 1000 | 67 | | 1001 | 58 | | 1000 | 32 | +----------+-------------+ 3 rows in set (0.00 sec)
3. UNION을 이용한 합산 쿼리
이제 한 테이블의 열 값을 다른 테이블의 열 값과 합산하는 쿼리를 작성해 보겠습니다. 여기서는 PlayerId가 1000인 플레이어의 점수를 두 테이블에서 모두 더합니다.
mysql> select sum(firstSum) from
(select Sum(PlayerScore) firstSum from DemoTable1 where PlayerId=1000 union
select Sum(PlayerScore) firstSum from DemoTable2 where PlayerId=1000) tbl;실행 결과는 다음과 같습니다.
+---------------+ | sum(firstSum) | +---------------+ | 296 | +---------------+ 1 row in set (0.02 sec)
결과 분석
위 쿼리의 작동 원리를 살펴보면 다음과 같습니다.
- DemoTable1에서 PlayerId가 1000인 행들의 점수 합계는 87 + 65 + 45 = 197입니다.
- DemoTable2에서 PlayerId가 1000인 행들의 점수 합계는 67 + 32 = 99입니다.
- UNION으로 결합된 두 서브쿼리의 결과를 외부에서 SUM()으로 다시 합산하면 197 + 99 = 296이 됩니다.
이처럼 UNION과 서브쿼리, 그리고 SUM() 함수를 조합하면 서로 다른 테이블에 흩어져 있는 데이터도 특정 조건(ID)에 맞춰 간단하게 집계할 수 있습니다.