MySQL의 COUNT() 함수는 기본적으로 NULL 값을 제외한 레코드만 집계합니다. 이 특성을 활용하면 단일 쿼리에서 여러 테이블의 NOT NULL 레코드 개수를 동시에 확인할 수 있습니다. 아래 예제를 통해 두 개의 테이블에서 NULL 값을 무시하고 각각의 유효한 레코드 수를 한 번에 조회하는 방법을 살펴보겠습니다.
1. 첫 번째 테이블 생성
먼저 DemoTable1이라는 이름의 테이블을 생성합니다.
mysql> create table DemoTable1
-> (
-> Id int
-> );
Query OK, 0 rows affected (1.06 sec)
2. 첫 번째 테이블에 데이터 삽입
insert 문을 사용해 레코드를 삽입합니다. 이때 NULL 값도 함께 넣어줍니다.
mysql> insert into DemoTable1 values(1);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable1 values(NULL);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1 values(2);
Query OK, 1 row affected (0.34 sec)
mysql> insert into DemoTable1 values(3);
Query OK, 1 row affected (0.13 sec)
3. 첫 번째 테이블 데이터 확인
select 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1;
실행 결과는 다음과 같습니다.
+------+
| Id |
+------+
| 1 |
| NULL |
| 2 |
| 3 |
+------+
4 rows in set (0.00 sec)
4. 두 번째 테이블 생성
같은 방식으로 두 번째 테이블인 DemoTable2를 생성합니다.
mysql> create table DemoTable2
-> (
-> Id int
-> );
Query OK, 0 rows affected (0.65 sec)
5. 두 번째 테이블에 데이터 삽입
두 번째 테이블에도 레코드를 삽입합니다.
mysql> insert into DemoTable2 values(10);
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable2 values(NULL);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable2 values(NULL);
Query OK, 1 row affected (0.08 sec)
6. 두 번째 테이블 데이터 확인
select 문으로 두 번째 테이블의 전체 레코드를 조회합니다.
mysql> select * from DemoTable2;
실행 결과는 다음과 같습니다.
+------+
| Id |
+------+
| 10 |
| NULL |
| NULL |
+------+
3 rows in set (0.00 sec)
7. NULL 값을 무시하고 NOT NULL 레코드 수 조회하기
이제 핵심 쿼리입니다. 서브쿼리를 활용하면 단일 쿼리로 두 테이블의 NOT NULL 레코드 수를 동시에 구할 수 있습니다.
mysql> select
-> (
-> select count(Id) from DemoTable1) as CountFirstTableId,
-> (
-> select count(Id) from DemoTable2) as CountSecondTableId
-> ;
실행 결과는 다음과 같습니다.
+-------------------+--------------------+
| CountFirstTableId | CountSecondTableId |
+-------------------+--------------------+
| 3 | 1 |
+-------------------+--------------------+
1 row in set (0.00 sec)
결과 분석 및 원리
DemoTable1에는 총 4개의 레코드가 있지만 결과는 3이고, DemoTable2에는 총 3개의 레코드가 있지만 결과는 1입니다. 그 이유는 MySQL의 COUNT(컬럼명) 함수가 해당 컬럼의 값이 NULL이 아닌 행만 집계하기 때문입니다.
반면 COUNT(*)를 사용하면 NULL 값을 포함한 모든 행이 집계되므로 주의해야 합니다. 따라서 NULL 값을 제외한 유효한 레코드 수를 구하려면 반드시 COUNT(컬럼명) 형태로 작성해야 하며, 위 예제처럼 서브쿼리를 조합하면 여러 테이블의 통계를 하나의 쿼리로 손쉽게 얻을 수 있습니다.