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

Thực hiện SELECT với COUNT trong MySQL?

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ơn COUNT(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