Tổng hợp điểm theo môn học với GROUP BY và SUM()
Sử dụng GROUP BY Subject để chia dữ liệu thành các nhóm theo môn học, sau đó SUM(Marks) tính tổng điểm của mỗi nhóm.
1. Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
Name VARCHAR(40),
Subject VARCHAR(40),
Marks INT
);
mysql> INSERT INTO DemoTable VALUES
('Chris', 'MySQL', 76), ('Sam', 'MongoDB', 86), ('Mike', 'MySQL', 98),
('David', 'Java', 93), ('Bob', 'MySQL', 57), ('John', 'MongoDB', 77);
2. Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+-------+---------+-------+ | Name | Subject | Marks | +-------+---------+-------+ | Chris | MySQL | 76 | | Sam | MongoDB | 86 | | Mike | MySQL | 98 | | David | Java | 93 | | Bob | MySQL | 57 | | John | MongoDB | 77 | +-------+---------+-------+
3. Truy vấn: Nhóm theo Subject, tính tổng Marks
mysql> SELECT Subject, SUM(Marks) FROM DemoTable GROUP BY Subject;
4. Kết quả
+---------+------------+ | Subject | SUM(Marks) | +---------+------------+ | MySQL | 231 | | MongoDB | 163 | | Java | 93 | +---------+------------+
Phân tích:
- MySQL: 76 + 98 + 57 = 231 (3 sinh viên)
- MongoDB: 86 + 77 = 163 (2 sinh viên)
- Java: 93 (1 sinh viên)
Mở rộng - Thêm COUNT, AVG, MIN, MAX:
SELECT Subject,
COUNT(*) AS StudentCount,
SUM(Marks) AS TotalMarks,
AVG(Marks) AS AvgMarks,
MIN(Marks) AS MinMarks,
MAX(Marks) AS MaxMarks
FROM DemoTable
GROUP BY Subject;
+---------+--------------+------------+----------+----------+----------+ | Subject | StudentCount | TotalMarks | AvgMarks | MinMarks | MaxMarks | +---------+--------------+------------+----------+----------+----------+ | MySQL | 3 | 231 | 77.0000 | 57 | 98 | | MongoDB | 2 | 163 | 81.5000 | 77 | 86 | | Java | 1 | 93 | 93.0000 | 93 | 93 | +---------+--------------+------------+----------+----------+----------+
Lưu ý: Cột trong SELECT phải là cột GROUP BY hoặc hàm tổng hợp. MySQL (sql_mode=ONLY_FULL_GROUP_BY) bắt buộc tuân thủ quy tắc này.