COUNT(*)와 COUNT(컬럼명), 무엇이 다를까?
MySQL에서 테이블의 전체 레코드 수를 확인하려면 COUNT(*)를 사용하는 것이 좋습니다. COUNT(*)는 NULL 값을 포함한 모든 행을 세는 반면, COUNT(컬럼명)은 해당 컬럼의 값이 NULL인 행을 제외하고 개수를 계산하기 때문입니다. 즉, 컬럼에 NULL 값이 존재한다면 두 함수의 결과는 서로 달라집니다.
COUNT(*)의 기본 문법은 다음과 같습니다.
select count(*) as anyVariableName from yourTableName;
예제용 테이블 생성하기
개념을 이해하기 위해 먼저 간단한 테이블을 만들어 보겠습니다.
mysql> create table CountingDemo
-> (
-> BookId int
-> );
Query OK, 0 rows affected (0.60 sec)
INSERT 명령으로 몇 개의 레코드를 삽입합니다. 이때 일부 레코드에는 의도적으로 값 없이(NULL) 삽입합니다.
mysql> insert into CountingDemo values(100);
Query OK, 1 row affected (0.13 sec)
mysql> insert into CountingDemo values();
Query OK, 1 row affected (0.17 sec)
mysql> insert into CountingDemo values(200);
Query OK, 1 row affected (0.12 sec)
mysql> insert into CountingDemo values(300);
Query OK, 1 row affected (0.16 sec)
mysql> insert into CountingDemo values();
Query OK, 1 row affected (0.12 sec)
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from CountingDemo;
출력 결과
+--------+
| BookId |
+--------+
| 100 |
| NULL |
| 200 |
| 300 |
| NULL |
+--------+
5 rows in set (0.00 sec)
NULL 값이 없다면 두 함수의 결과는 동일합니다
컬럼에 NULL 값이 하나도 없다면 COUNT(*)와 COUNT(컬럼명)은 같은 결과를 반환합니다. 하지만 위 예제의 BookId 컬럼에는 NULL 값이 두 개 포함되어 있기 때문에, 두 함수의 결과가 서로 다르게 나타납니다.
COUNT(*) 사용 예시
COUNT(*)를 사용하면 NULL 값을 포함한 전체 레코드 수가 반환됩니다.
mysql> select count(*) as AllValue from CountingDemo;
출력 결과
+----------+
| AllValue |
+----------+
| 5 |
+----------+
1 row in set (0.00 sec)
COUNT(컬럼명) 사용 예시
반면 COUNT(컬럼명)은 NULL 값을 개수에서 제외하므로 다른 결과가 나옵니다.
mysql> select count(BookId) as AllvalueWhichisNotnull from CountingDemo;
출력 결과
+------------------------+
| AllvalueWhichisNotnull |
+------------------------+
| 3 |
+------------------------+
1 row in set (0.00 sec)
정리
· 전체 레코드 수(NULL 포함)를 구할 때 → COUNT(*)
· NULL을 제외한 실제 값의 개수를 구할 때 → COUNT(컬럼명)
따라서 목적에 맞게 두 함수를 구분하여 사용하는 것이 중요합니다. 참고로 MySQL의 InnoDB 스토리지 엔진에서 COUNT(*)는 내부적으로 최적화되어 있어, WHERE 조건 없이 전체 행 개수를 조회할 때 일반적으로 가장 효율적인 방법으로 알려져 있습니다.