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

MySQL에서 특정 ID 기준으로 두 테이블의 동일한 열 값을 합산하는 방법

개요

두 개의 테이블이 있고, 각각 PlayerIdPlayerScore라는 두 개의 열을 가지고 있다고 가정해 보겠습니다. 이때 특정 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)에 맞춰 간단하게 집계할 수 있습니다.