ความแตกต่างของ COUNT(*) vs COUNT(columnName) ใน MySQL
COUNT(*) นับจำนวนแถวทั้งหมด (รวมแถวที่มี NULL) ส่วน COUNT(columnName) นับเฉพาะแถวที่คอลัมน์นั้น ไม่ใช่ NULL
ตัวอย่างการใช้งาน
สร้างตารางและเพิ่มข้อมูลผสม NULL, Empty String, 0:
mysql> CREATE TABLE ifNotNullDemo (Name VARCHAR(20));
Query OK, 0 rows affected (0.54 sec)
mysql> INSERT INTO ifNotNullDemo VALUES('Chris'),(''),('Robert'),(NULL),(0);
Query OK, 5 rows affected (0.18 sec)
ข้อมูลทั้งหมด:
mysql> SELECT * FROM ifNotNullDemo;
+--------+
| Name |
+--------+
| Chris |
| | -- Empty string ''
| Robert |
| NULL | -- NULL
| 0 | -- String '0'
+--------+
5 rows in set (0.00 sec)
CASE 1: COUNT(*) นับทุกแถว
mysql> SELECT COUNT(*) FROM ifNotNullDemo;
+----------+
| COUNT(*) |
+----------+
| 5 |
+----------+
1 row in set (0.02 sec)
CASE 2: COUNT(Name) นับเฉพาะ Non-NULL
mysql> SELECT COUNT(Name) FROM ifNotNullDemo;
+-------------+
| COUNT(Name) |
+-------------+
| 4 |
+-------------+
1 row in set (0.00 sec)
สรุปความแตกต่าง
| ค่าใน Name | COUNT(*) | COUNT(Name) |
|---|---|---|
| 'Chris' | ✓ นับ | ✓ นับ |
| '' (Empty String) | ✓ นับ | ✓ นับ (ไม่ใช่ NULL) |
| 'Robert' | ✓ นับ | ✓ นับ |
| NULL | ✓ นับ | ✗ ไม่นับ |
| '0' | ✓ นับ | ✓ นับ (ไม่ใช่ NULL) |
ข้อสังเกตเพิ่มเติม
COUNT(DISTINCT column)นับค่าที่ไม่ซ้ำกัน (ยกเว้น NULL)COUNT(*)เร็วกว่าใน Engine บางตัว (MyISAM, Memory) เพราะเก็บ Row Count ไว้ แต่ InnoDB ต้อง Scan- หากต้องการนับเฉพาะเงื่อนไข:
SUM(CASE WHEN condition THEN 1 ELSE 0 END)หรือCOUNT(CASE WHEN condition THEN 1 END)(NULL ไม่นับ)
Best Practice
- ใช้
COUNT(*)เมื่อต้องการนับแถวทั้งหมด (ชัดเจน กำกับได้) - ใช้
COUNT(column)เมื่อต้องการนับแถวที่มีข้อมูลในคอลัมน์นั้น (Not NULL) - หลีกเลี่ยง
COUNT(1)หรือCOUNT(id)หากไม่มีเหตุผลเฉพาะ (สับสน)