Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: ความแตกต่างระหว่าง COUNT(*) และ COUNT(columnName)

ความแตกต่างของ 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)

สรุปความแตกต่าง

ค่าใน NameCOUNT(*)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) หากไม่มีเหตุผลเฉพาะ (สับสน)