Đếm số lần xuất hiện của giá trị trong cột MySQL
Sử dụng COUNT(*) kết hợp với mệnh đề WHERE để đếm số bản ghi có giá trị cụ thể trong một cột.
Ví dụ minh họa
Tạo bảng DemoTable:
mysql> CREATE TABLE DemoTable (
Id INT,
Name VARCHAR(100)
);
Query OK, 0 rows affected (1.40 sec)
Chèn dữ liệu (có nhiều bản ghi trùng 'Chris'):
mysql> INSERT INTO DemoTable VALUES(100, 'John'); Query OK, 1 row affected (0.44 sec) mysql> INSERT INTO DemoTable VALUES(101, 'Chris'); Query OK, 1 row affected (0.10 sec) mysql> INSERT INTO DemoTable VALUES(102, 'Chris'); Query OK, 1 row affected (0.19 sec) mysql> INSERT INTO DemoTable VALUES(103, 'Chris'); Query OK, 1 row affected (1.05 sec) mysql> INSERT INTO DemoTable VALUES(104, 'David'); Query OK, 1 row affected (0.19 sec) mysql> INSERT INTO DemoTable VALUES(105, 'Chris'); Query OK, 1 row affected (0.14 sec) mysql> INSERT INTO DemoTable VALUES(106, 'Carol'); Query OK, 1 row affected (0.24 sec) mysql> INSERT INTO DemoTable VALUES(107, 'Bob'); Query OK, 1 row affected (0.18 sec)
Xem tất cả bản ghi:
mysql> SELECT * FROM DemoTable;
+------+-------+ | Id | Name | +------+-------+ | 100 | John | | 101 | Chris | | 102 | Chris | | 103 | Chris | | 104 | David | | 105 | Chris | | 106 | Carol | | 107 | Bob | +------+-------+ 8 rows in set (0.00 sec)
Đếm số lần xuất hiện của 'Chris':
mysql> SELECT COUNT(*) FROM DemoTable WHERE Name = 'Chris';
Kết quả:
+----------+ | count(*) | +----------+ | 4 | +----------+ 1 row in set (0.00 sec)
Mở rộng: Đếm tất cả giá trị cùng lúc (Phân phối tần suất)
SELECT Name, COUNT(*) AS Frequency FROM DemoTable GROUP BY Name ORDER BY Frequency DESC;
+-------+-----------+ | Name | Frequency | +-------+-----------+ | Chris | 4 | | John | 1 | | David | 1 | | Carol | 1 | | Bob | 1 | +-------+-----------+
Các biến thể hữu ích
| Yêu cầu | Cú pháp |
|---|---|
| Đếm giá trị khác NULL | COUNT(ten_cot) (bỏ qua NULL) |
| Đếm giá trị duy nhất | COUNT(DISTINCT ten_cot) |
| Đếm với nhiều điều kiện | SUM(CASE WHEN Name='Chris' THEN 1 ELSE 0 END) |
| Đếm % tỷ lệ | COUNT(*) * 100.0 / (SELECT COUNT(*) FROM DemoTable) |
Lưu ý hiệu suất
- Tạo INDEX cho cột thường xuyên lọc (
Name) để tăng tốc COUNT - Với bảng lớn, cân nhắc
COUNT(*)vsCOUNT(1)(tương đương trong MySQL) - Tránh
COUNT(DISTINCT ...)trên cột không có index nếu bảng lớn