개요
MySQL에서 두 개의 테이블에 분산되어 있는 문자열 값들의 개수를 하나로 합쳐서 집계해야 하는 경우가 있습니다. 이럴 때는 COUNT(*) 함수와 UNION ALL을 함께 사용하면 됩니다. UNION ALL은 두 테이블의 결과를 중복 제거 없이 그대로 합쳐주기 때문에, 각 문자열이 두 테이블에 걸쳐 총 몇 번 등장했는지 정확하게 계산할 수 있습니다.
1. 첫 번째 테이블 생성 및 데이터 입력
먼저 첫 번째 테이블을 생성합니다.
mysql> create table DemoTable1
(
Name varchar(20)
);
Query OK, 0 rows affected (0.49 sec)
INSERT 명령으로 첫 번째 테이블에 문자열 값을 입력합니다.
mysql> insert into DemoTable1 values('Chris');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1 values('Robert');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1 values('Mike');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1 values('Robert');
Query OK, 1 row affected (0.10 sec)SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable1;
실행 결과는 다음과 같습니다.
+--------+
| Name |
+--------+
| Chris |
| Robert |
| Mike |
| Robert |
+--------+
4 rows in set (0.00 sec)
2. 두 번째 테이블 생성 및 데이터 입력
이어서 두 번째 테이블을 생성합니다.
mysql> create table DemoTable2
(
Name varchar(40)
);
Query OK, 0 rows affected (0.43 sec)
두 번째 테이블에도 INSERT 명령으로 문자열 값을 입력합니다.
mysql> insert into DemoTable2 values('Robert');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable2 values('Chris');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable2 values('Robert');
Query OK, 1 row affected (0.31 sec)
mysql> insert into DemoTable2 values('David');
Query OK, 1 row affected (0.13 sec)SELECT 문으로 두 번째 테이블의 레코드를 확인합니다.
mysql> select *from DemoTable2;
실행 결과는 다음과 같습니다.
+--------+
| Name |
+--------+
| Robert |
| Chris |
| Robert |
| David |
+--------+
4 rows in set (0.00 sec)
3. COUNT(*)와 UNION ALL로 결합 개수 구하기
다음은 서브쿼리에서 UNION ALL로 두 테이블의 Name 값을 모두 합친 뒤, GROUP BY와 COUNT(*)를 사용해 각 문자열별 결합 개수를 구하는 쿼리입니다.
mysql> select tbl.Name,count(*) as Total_Count from
(
select Name from DemoTable1
UNION ALL
select Name from DemoTable2
)tbl
group by tbl.Name;
실행 결과는 다음과 같습니다. 각 이름별 결합 개수가 새로운 컬럼 Total_Count에 표시됩니다.
+--------+-------------+
| Name | Total_Count |
+--------+-------------+
| Chris | 2 |
| Robert | 4 |
| Mike | 1 |
| David | 1 |
+--------+-------------+
4 rows in set (0.00 sec)
결과 해석
결과를 보면 'Chris'는 두 테이블에 걸쳐 2번(각 테이블에서 1번씩), 'Robert'는 4번(첫 번째 테이블에서 2번, 두 번째 테이블에서 2번), 'Mike'와 'David'는 각각 1번 등장한 것을 확인할 수 있습니다.
여기서 주의할 점은 UNION 대신 반드시 UNION ALL을 사용해야 한다는 것입니다. UNION은 중복된 행을 자동으로 제거하기 때문에, 정확한 전체 개수를 얻으려면 중복을 유지하는 UNION ALL을 사용해야 합니다.