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

단일 MySQL 쿼리로 서로 다른 테이블의 NULL 값 무시하고 NOT NULL 레코드 수 조회하기

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(컬럼명) 형태로 작성해야 하며, 위 예제처럼 서브쿼리를 조합하면 여러 테이블의 통계를 하나의 쿼리로 손쉽게 얻을 수 있습니다.