개요
MySQL에서는 하나의 쿼리만으로 여러 테이블에 저장된 값의 개수를 동시에 조회할 수 있습니다. 핵심은 스칼라 서브쿼리(Scalar Subquery)를 활용하는 것입니다. 각 테이블에 대한 COUNT 집계를 SELECT 절 안에서 서브쿼리 형태로 작성하면, 결과를 한 번에 받아볼 수 있습니다.
기본 문법은 다음과 같습니다.
SELECT
(
SELECT COUNT(yourColumnName) FROM yourTableName1) AS anyAliasName1,
(
SELECT COUNT(yourColumnName) FROM yourTableName2) AS anyAliasName2;COUNT 함수는 기본적으로 NULL 값을 제외하고 계산하기 때문에, 이 방식을 사용하면 자연스럽게 NOT NULL 값의 개수만 구할 수 있다는 장점이 있습니다.
예제 테이블 생성
먼저 첫 번째 테이블을 생성해 보겠습니다.
mysql> CREATE TABLE DemoTable1
-> (
-> Id int
-> );
Query OK, 0 rows affected (1.06 sec)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)
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> SELECT * FROM DemoTable1;
실행 결과는 다음과 같습니다.
+------+ | Id | +------+ | 1 | | NULL | | 2 | | 3 | +------+ 4 rows in set (0.00 sec)
총 4개의 행이 있으며, 그중 1개는 NULL입니다.
두 번째 테이블 생성
이번에는 비교용 두 번째 테이블을 만듭니다.
mysql> CREATE TABLE DemoTable2
-> (
-> Id int
-> );
Query OK, 0 rows affected (0.65 sec)마찬가지로 레코드를 삽입합니다. 이번에는 NULL 값을 더 많이 넣어보겠습니다.
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)
테이블 내용을 확인합니다.
mysql> SELECT * FROM DemoTable2;
실행 결과는 다음과 같습니다.
+------+ | Id | +------+ | 10 | | NULL | | NULL | +------+ 3 rows in set (0.00 sec)
3개의 행 중 2개가 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개 있지만 그중 1개가 NULL이므로 COUNT 결과는 3이 되고, DemoTable2에는 값이 3개 있지만 그중 2개가 NULL이므로 COUNT 결과는 1이 됩니다. 이처럼 COUNT 함수는 NULL을 자동으로 제외하기 때문에 별도의 WHERE 조건 없이도 NOT NULL 값만 정확하게 집계할 수 있습니다.
정리
여러 테이블의 레코드 수를 하나의 쿼리로 확인하고 싶다면, SELECT 절 안에 테이블별 COUNT 서브쿼리를 나열하고 각각 별칭(Alias)을 지정하면 됩니다. 이 방법은 대시보드나 통계 화면처럼 여러 테이블의 요약 정보를 한 화면에 보여줘야 할 때 특히 유용합니다. 참고로 COUNT(*)와 달리 COUNT(컬럼명)은 해당 컬럼이 NULL인 행을 제외하므로, NOT NULL 값의 개수를 셀 때는 반드시 컬럼명을 명시해야 한다는 점을 기억해 두세요.