Sử dụng GROUP BY kết hợp COUNT(*) để lấy danh sách giá trị duy nhất và số lần xuất hiện của mỗi giá trị.
Cú pháp
SELECT tên_cột, COUNT(*) AS tên_alias FROM tên_bảng GROUP BY tên_cột;
Ví dụ minh họa
Tạo bảng khách hàng:
mysql> CREATE TABLE GroupByAndCountDemo (
-> ClientId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ClientName VARCHAR(100)
-> );
Query OK, 0 rows affected (0.64 sec)
Chèn dữ liệu (có nhiều trùng lặp):
mysql> INSERT INTO GroupByAndCountDemo(ClientName) VALUES
-> ('John'), ('Carol'), ('Sam'), ('Sam'), ('John'), ('John'), ('John'),
-> ('Sam'), ('Sam'), ('Sam'), ('John'), ('John'), ('John'), ('David'), ('Maxwell'), ('Maxwell');
Xem dữ liệu gốc (16 hàng):
mysql> SELECT * FROM GroupByAndCountDemo;
+----------+------------+ | ClientId | ClientName | +----------+------------+ | 1 | John | | 2 | Carol | | 3 | Sam | | 4 | Sam | | 5 | John | | 6 | John | | 7 | John | | 8 | Sam | | 9 | Sam | | 10 | Sam | | 11 | John | | 12 | John | | 13 | John | | 14 | David | | 15 | Maxwell | | 16 | Maxwell | +----------+------------+
Đếm số lần xuất hiện mỗi tên:
mysql> SELECT ClientName, COUNT(*) AS TotalCount
-> FROM GroupByAndCountDemo
-> GROUP BY ClientName;
+------------+------------+ | ClientName | TotalCount | +------------+------------+ | John | 7 | | Carol | 1 | | Sam | 5 | | David | 1 | | Maxwell | 2 | +------------+------------+
Mở rộng: Sắp xếp theo số lượng
SELECT ClientName, COUNT(*) AS cnt FROM GroupByAndCountDemo GROUP BY ClientName ORDER BY cnt DESC;
+------------+-----+ | ClientName | cnt | +------------+-----+ | John | 7 | | Sam | 5 | | Maxwell | 2 | | Carol | 1 | | David | 1 | +------------+-----+
Lọc nhóm có số lượng lớn (HAVING)
SELECT ClientName, COUNT(*) AS cnt FROM GroupByAndCountDemo GROUP BY ClientName HAVING COUNT(*) > 2;
+------------+-----+ | ClientName | cnt | +------------+-----+ | John | 7 | | Sam | 5 | +------------+-----+
Đếm DISTINCT trong nhóm
SELECT category, COUNT(DISTINCT product_id) AS unique_products FROM sales GROUP BY category;