Hàm COUNT() trong MySQL có hai hành vi khác biệt tùy đối số:
COUNT(*)/COUNT(1): Đếm tất cả hàng trong nhóm, kể cả hàng có cột NULL.COUNT(ten_cot): Chỉ đếm hàng màten_cotKHÔNG NULL.
Tạo bảng với giá trị NULL
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
NumberOfQuestion INT,
NumberOfSolution INT
);
mysql> INSERT INTO DemoTable (NumberOfQuestion, NumberOfSolution) VALUES
(20, 10), (20, 2), (20, NULL), (20, NULL), (30, 19), (30, 1);
Dữ liệu (có 2 hàng NumberOfSolution = NULL)
mysql> SELECT * FROM DemoTable;
+----+------------------+------------------+
| Id | NumberOfQuestion | NumberOfSolution |
+----+------------------+------------------+
| 1 | 20 | 10 |
| 2 | 20 | 2 |
| 3 | 20 | NULL |
| 4 | 20 | NULL |
| 5 | 30 | 19 |
| 6 | 30 | 1 |
+----+------------------+------------------+
Truy vấn: Đếm số giải pháp (NOT NULL) cho mỗi câu hỏi
mysql> SELECT NumberOfQuestion, COUNT(NumberOfSolution) AS NumberOfRows
FROM DemoTable
GROUP BY NumberOfQuestion;
Kết quả
+------------------+--------------+
| NumberOfQuestion | NumberOfRows |
+------------------+--------------+
| 20 | 2 |
| 30 | 2 |
+------------------+--------------+
Giải thích
- Nhóm
NumberOfQuestion = 20: 4 hàng, nhưngNumberOfSolutionchỉ 2 hàng không NULL (10, 2) ->COUNT(NumberOfSolution) = 2. - Nhóm
NumberOfQuestion = 30: 2 hàng, cả hai đều không NULL ->COUNT = 2. - Nếu dùng
COUNT(*): Nhóm 20 sẽ trả về 4, nhóm 30 trả về 2.
Ứng dụng thực tế
- Đếm số đơn hàng đã thanh toán (
paid_date NOT NULL). - Đếm số user đã xác thực email (
email_verified_at NOT NULL). - Thống kê độ hoàn chỉnh dữ liệu (completeness).
Mẹo: SUM(CASE WHEN column IS NOT NULL THEN 1 ELSE 0 END) tương đương COUNT(column) nhưng linh hoạt hơn cho logic phức tạp.