Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Đếm số giá trị NOT NULL trong cột MySQL (COUNT(column) vs COUNT(*))

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_cot KHÔ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ưng NumberOfSolution chỉ 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.