Khái niệm
Hàm tổng hợp COUNT() đếm số dòng. Kết hợp với GROUP BY để đếm theo nhóm.
Ví dụ minh họa
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(100),
Subject VARCHAR(100)
);
mysql> INSERT INTO DemoTable(Name, Subject) VALUES('John', 'MySQL');
mysql> INSERT INTO DemoTable(Name, Subject) VALUES('John', 'Java');
mysql> INSERT INTO DemoTable(Name, Subject) VALUES('Carol', 'MongoDB');
mysql> INSERT INTO DemoTable(Name, Subject) VALUES('Carol', 'Java');
mysql> INSERT INTO DemoTable(Name, Subject) VALUES('Carol', 'MySQL');
mysql> INSERT INTO DemoTable(Name, Subject) VALUES('John', 'MySQL');
mysql> INSERT INTO DemoTable(Name, Subject) VALUES('Carol', 'MongoDB');
Dữ liệu gốc
+----+-------+---------+ | Id | Name | Subject | +----+-------+---------+ | 1 | John | MySQL | | 2 | John | Java | | 3 | Carol | MongoDB | | 4 | Carol | Java | | 5 | Carol | MySQL | | 6 | John | MySQL | | 7 | Carol | MongoDB | +----+-------+---------+
Truy vấn COUNT với GROUP BY
mysql> SELECT Name, Subject, COUNT(Subject)
-> FROM DemoTable
-> GROUP BY Subject, Name;
Kết quả
+-------+---------+----------------+ | Name | Subject | count(Subject) | +-------+---------+----------------+ | John | MySQL | 2 | | John | Java | 1 | | Carol | MongoDB | 2 | | Carol | Java | 1 | | Carol | MySQL | 1 | +-------+---------+----------------+
Các biến thể COUNT()
| Cú pháp | Ý nghĩa |
|---|---|
COUNT(*) | Đếm tất cả dòng (kể cả NULL) |
COUNT(column) | Đếm dòng có column NOT NULL |
COUNT(DISTINCT column) | Đếm giá trị duy nhất |
COUNT(1) / COUNT(0) | Tương đương COUNT(*), tối ưu hơn chút |
Mở rộng: COUNT có điều kiện
SELECT
Name,
COUNT(*) AS total,
COUNT(CASE WHEN Subject = 'MySQL' THEN 1 END) AS mysql_count,
COUNT(CASE WHEN Subject = 'Java' THEN 1 END) AS java_count
FROM DemoTable
GROUP BY Name;
Lưu ý hiệu năng
- Index trên cột GROUP BY tăng tốc đáng kể
COUNT(*)nhanh hơnCOUNT(column)trên InnoDB (không check NULL)- Tránh
COUNT(DISTINCT)trên tập dữ liệu lớn nếu không cần thiết