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

Lấy giá trị khác nhau và đếm số lượng với GROUP BY trong MySQL

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;