Giải pháp: GROUP BY + ORDER BY
Kết hợp GROUP BY để gom nhóm đếm, và ORDER BY để sắp xếp.
Ví dụ minh họa
Tạo bảng điểm
mysql> CREATE TABLE DemoTable (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentGrade CHAR(1)
);
mysql> INSERT INTO DemoTable(StudentGrade) VALUES('A'), ('F'), ('C'), ('A'), ('F'), ('F'), ('B'), ('C');
Dữ liệu gốc
+-----------+--------------+ | StudentId | StudentGrade | +-----------+--------------+ | 1 | A | | 2 | F | | 3 | C | | 4 | A | | 5 | F | | 6 | F | | 7 | B | | 8 | C | +-----------+--------------+
Truy vấn: Sắp xếp A-Z và đếm
mysql> SELECT StudentGrade, COUNT(StudentId) AS Frequency
-> FROM DemoTable
-> GROUP BY StudentGrade
-> ORDER BY StudentGrade;
Kết quả
+--------------+-----------+ | StudentGrade | Frequency | +--------------+-----------+ | A | 2 | | B | 1 | | C | 2 | | F | 3 | +--------------+-----------+
Giải thích
GROUP BY StudentGrade: Gom các dòng cùng gradeCOUNT(StudentId): Đếm số dòng mỗi nhóm (PK không NULL)ORDER BY StudentGrade: Sắp xếp kết quả theo grade A-Z
Mở rộng: Sắp xếp theo tần suất
-- Giảm dần (nhiều nhất trước) ORDER BY Frequency DESC; -- Tăng dần (ít nhất trước) ORDER BY Frequency ASC;
Kết quả DESC
+--------------+-----------+ | StudentGrade | Frequency | +--------------+-----------+ | F | 3 | | A | 2 | | C | 2 | | B | 1 | +--------------+-----------+
Các biến thể COUNT
COUNT(*) -- Tất cả dòng COUNT(StudentId) -- Không NULL (PK thì giống COUNT(*)) COUNT(DISTINCT StudentGrade) -- Số grade duy nhất = 4
Ứng dụng: Thống kê phân phối
SELECT
StudentGrade,
COUNT(*) AS frequency,
ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM DemoTable), 2) AS percentage
FROM DemoTable
GROUP BY StudentGrade
ORDER BY frequency DESC;
Kết quả
+--------------+-----------+------------+ | StudentGrade | frequency | percentage | +--------------+-----------+------------+ | F | 3 | 37.50 | | A | 2 | 25.00 | | C | 2 | 25.00 | | B | 1 | 12.50 | +--------------+-----------+------------+