Khi cần đếm dữ liệu trong SQL, nhiều bạn thường dùng COUNT() theo thói quen mà không để ý bên trong đang đếm dòng hay giá trị khác NULL.
Đây là một khác biệt nhỏ nhưng rất dễ xuất hiện trong câu hỏi phỏng vấn SQL.
1. COUNT(*) và COUNT(column) khác nhau thế nào?
Giả sử có bảng employees:
| id | name | department |
|---|---|---|
| 1 | An | IT |
| 2 | Bình | IT |
| 3 | Cường | NULL |
| 4 | Dũng | HR |
COUNT(*)
SELECT COUNT(*)
FROM employees;
Kết quả:
| COUNT(*) |
|---|
| 4 |
COUNT(*) đếm tất cả các dòng trong kết quả truy vấn, kể cả những dòng có giá trị NULL.
COUNT(column)
SELECT COUNT(department)
FROM employees;
Kết quả:
| COUNT(department) |
|---|
| 3 |
Ở đây department của Cường là NULL, nên dòng này không được tính.
Có thể nhớ đơn giản:
COUNT(*) → đếm dòng
COUNT(column) → đếm giá trị khác NULL của column
2. Điểm dễ nhầm lẫn khi dùng với GROUP BY
Ví dụ muốn thống kê số nhân viên theo phòng ban:
SELECT department, COUNT(*)
FROM employees
GROUP BY department;
Kết quả:
| department | COUNT(*) |
|---|---|
| IT | 2 |
| HR | 1 |
| NULL | 1 |
Nếu sử dụng:
SELECT department, COUNT(department)
FROM employees
GROUP BY department;
Kết quả sẽ là:
| department | COUNT(department) |
|---|---|
| IT | 2 |
| HR | 1 |
| NULL | 0 |
Tại sao nhóm NULL có 1 dòng nhưng COUNT(department) lại bằng 0?
Bởi vì COUNT(department) không đếm số dòng của nhóm. Nó chỉ đếm những giá trị department khác NULL.
Đây là lý do trong các bài thống kê dữ liệu, COUNT(*) thường là lựa chọn dễ hiểu hơn khi mục tiêu thực sự là đếm số dòng.
3. Khi nào nên dùng COUNT(*) và COUNT(column)?
Có thể áp dụng quy tắc khá đơn giản:
| Bạn muốn biết | Nên dùng |
|---|---|
| Có bao nhiêu dòng? | COUNT(*) |
| Có bao nhiêu giá trị không NULL? | COUNT(column) |
| Đếm số nhân viên trong mỗi phòng ban | COUNT(*) |
| Đếm số nhân viên đã có email | COUNT(email) |
| Đếm số giá trị khác NULL của một cột | COUNT(column) |
Ví dụ:
SELECT COUNT(*)
FROM employees;
→ Có bao nhiêu nhân viên trong bảng?
Còn:
SELECT COUNT(email)
FROM employees;
→ Có bao nhiêu nhân viên đã có email?
Hai câu hỏi khác nhau nên kết quả hoàn toàn có thể khác nhau.
Tóm lại
COUNT(*) → Đếm dòng
COUNT(column) → Đếm giá trị khác NULL
Nếu mục tiêu của bạn là đếm số dòng, hãy nghĩ đến COUNT(*).
Nếu mục tiêu là đếm số giá trị thực sự tồn tại trong một cột, hãy dùng COUNT(column).


