MySQL UNION 결과에 COUNT(*) 적용하기
두 개 이상의 테이블을 UNION으로 합친 뒤 전체 행 개수를 구하려면, 서브쿼리로 감싸서 외부에서 COUNT(*)를 실행해야 합니다. 기본 문법은 다음과 같습니다.
SELECT COUNT(*)
FROM
(
SELECT yourColumName1 FROM yourTableName1
UNION
SELECT yourColumName1 FROM yourTableName2
) anyVariableName;핵심은 UNION 결과에 반드시 별칭(alias)을 붙여야 한다는 점입니다. MySQL에서 파생 테이블(서브쿼리 결과)에는 이름이 필요하기 때문입니다.
예제용 테이블 생성
문법을 실제로 확인하기 위해 두 개의 테이블을 만들어 보겠습니다.
mysql> CREATE TABLE union_Table1 -> ( -> UserId INT -> ); Query OK, 0 rows affected (0.47 sec)
첫 번째 테이블에 데이터를 삽입합니다.
mysql> INSERT INTO union_Table1 VALUES(1); Query OK, 1 row affected (0.18 sec) mysql> INSERT INTO union_Table1 VALUES(10); Query OK, 1 row affected (0.12 sec) mysql> INSERT INTO union_Table1 VALUES(20); Query OK, 1 row affected (0.09 sec)
저장된 데이터를 조회해 보겠습니다.
mysql> SELECT * FROM union_Table1;
실행 결과:
+--------+ | UserId | +--------+ | 1 | | 10 | | 20 | +--------+ 3 rows in set (0.00 sec)
같은 구조의 두 번째 테이블을 생성합니다.
mysql> CREATE TABLE union_Table2 -> ( -> UserId INT -> ); Query OK, 0 rows affected (0.69 sec)
두 번째 테이블에도 데이터를 넣어 줍니다.
mysql> INSERT INTO union_Table2 VALUES(1); Query OK, 1 row affected (0.12 sec) mysql> INSERT INTO union_Table2 VALUES(30); Query OK, 1 row affected (0.26 sec) mysql> INSERT INTO union_Table2 VALUES(50); Query OK, 1 row affected (0.13 sec)
조회 결과는 다음과 같습니다.
mysql> SELECT * FROM union_Table2;
+--------+ | UserId | +--------+ | 1 | | 30 | | 50 | +--------+ 3 rows in set (0.00 sec)
UNION 결과 개수 세기
두 테이블 모두 UserId = 1이라는 동일한 값을 가지고 있습니다. 일반 UNION은 중복된 값을 자동으로 제거하므로, 같은 값은 한 번만 계산됩니다. 아래 쿼리로 UNION 결과의 전체 개수를 구할 수 있습니다.
mysql> SELECT COUNT(*) AS UnionCount FROM -> ( -> SELECT DISTINCT UserId FROM union_Table1 -> UNION -> SELECT DISTINCT UserId FROM union_Table2 -> ) tbl1;
실행 결과:
+------------+ | UnionCount | +------------+ | 5 | +------------+ 1 row in set (0.00 sec)
결과 해석 및 참고 사항
각 테이블에는 3개씩 총 6개의 행이 있지만, 두 테이블에 공통으로 존재하는 1이 중복 제거되어 최종 개수는 5가 됩니다.
추가로 알아두면 좋은 점:
- UNION ALL을 사용하면 중복이 제거되지 않으므로, 위 예제에서는 개수가 6이 됩니다.
- 서브쿼리 내부의 DISTINCT는 이미 UNION이 중복을 제거해 주므로 생략해도 결과는 같습니다.
- 별칭(tbl1)은 필수이며, 원하는 이름으로 자유롭게 지정할 수 있습니다.