Cú pháp
Sử dụng hàm tổng hợp COUNT() kết hợp GROUP BY:
SELECT ten_cot, COUNT(*) AS so_lan FROM ten_bang GROUP BY ten_cot;
Ví dụ: Đếm số lần xuất hiện điểm số (Marks)
1. Tạo bảng
mysql> CREATE TABLE CountSameValue ( -> Id INT, -> Name VARCHAR(100), -> Marks INT -> ); Query OK, 0 rows affected (0.70 sec)
2. Chèn dữ liệu
mysql> INSERT INTO CountSameValue VALUES(1,'Sam',67); Query OK, 1 row affected (0.17 sec) mysql> INSERT INTO CountSameValue VALUES(2,'Mike',87); Query OK, 1 row affected (0.19 sec) mysql> INSERT INTO CountSameValue VALUES(3,'Carol',67); Query OK, 1 row affected (0.24 sec) mysql> INSERT INTO CountSameValue VALUES(4,'Bob',87); Query OK, 1 row affected (0.18 sec) mysql> INSERT INTO CountSameValue VALUES(5,'John',71); Query OK, 1 row affected (0.17 sec) mysql> INSERT INTO CountSameValue VALUES(6,'Adam',66); Query OK, 1 row affected (0.18 sec) mysql> INSERT INTO CountSameValue VALUES(7,'David',71); Query OK, 1 row affected (0.20 sec) mysql> INSERT INTO CountSameValue VALUES(8,'Maria',67); Query OK, 1 row affected (0.16 sec)
3. Dữ liệu gốc
mysql> SELECT * FROM CountSameValue;
+------+-------+-------+ | Id | Name | Marks | +------+-------+-------+ | 1 | Sam | 67 | | 2 | Mike | 87 | | 3 | Carol | 67 | | 4 | Bob | 87 | | 5 | John | 71 | | 6 | Adam | 66 | | 7 | David | 71 | | 8 | Maria | 67 | +------+-------+-------+ 8 rows in set (0.00 sec)
4. Đếm tần suất Marks
mysql> SELECT Marks, COUNT(*) AS Total FROM CountSameValue GROUP BY Marks;
+-------+-------+ | Marks | Total | +-------+-------+ | 67 | 3 | | 87 | 2 | | 71 | 2 | | 66 | 1 | +-------+-------+ 4 rows in set (0.00 sec)
Các biến thể hữu ích
Sắp xếp theo tần suất giảm dần
SELECT ten_cot, COUNT(*) AS so_lan FROM ten_bang GROUP BY ten_cot ORDER BY so_lan DESC;
Chỉ lấy giá trị xuất hiện > N lần (HAVING)
SELECT ten_cot, COUNT(*) AS so_lan FROM ten_bang GROUP BY ten_cot HAVING COUNT(*) > 1;
Đếm trên nhiều cột (kết hợp)
SELECT cot_a, cot_b, COUNT(*) AS so_lan FROM ten_bang GROUP BY cot_a, cot_b;
Đếm distinct (loại bỏ trùng lặp trước khi đếm)
SELECT ten_cot, COUNT(DISTINCT cot_khac) AS so_luong_khac FROM ten_bang GROUP BY ten_cot;
Ứng dụng thực tế
- Phân tích phân bố dữ liệu (data profiling)
- Tìm giá trị phổ biến nhất (mode)
- Phát hiện bất thường: Giá trị xuất hiện quá nhiều/ít
- Báo cáo thống kê: Top 10 giá trị, phân phối
Lưu ý hiệu năng
- Index trên cột GROUP BY tăng tốc đáng kể
- Tránh GROUP BY trên cột TEXT/BLOB lớn
- Sử dụng
SQL_CALC_FOUND_ROWSnếu cần tổng số nhóm