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

MySQL UNION(통합) 쿼리 결과의 행 수를 COUNT(*)로 계산하는 방법

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)은 필수이며, 원하는 이름으로 자유롭게 지정할 수 있습니다.