Chúng tôi thường yêu cầu thực hiện các phép tính trên nhiều hàng để lấy dữ liệu cho mục đích báo cáo, thống kê và phân tích. Trong những trường hợp như vậy, các hàm tổng hợp có sẵn trong MySQL rất tiện dụng và chúng ta phải lưu ý sử dụng các hàm này để tìm nạp dữ liệu mong muốn. Các hàm này bao gồm SUM, AVG, MAX, MIN, COUNT và DISTINCT.
Phần còn lại của phần hướng dẫn này giải thích cách sử dụng các hàm tổng hợp này.
Dữ liệu thử nghiệm
Bạn có thể sử dụng các truy vấn được đề cập bên dưới để chuẩn bị dữ liệu thử nghiệm để theo dõi các phần tiếp theo. Tạo cơ sở dữ liệu trường học và bảng (người dùng và điểm số) để hiểu các chức năng tổng hợp.
# Create the database
CREATE SCHEMA `school` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
# Create the user table
CREATE TABLE `school`.`user` (
`user_id` BIGINT NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(45) NOT NULL,
`last_name` VARCHAR(45) NULL,
`section` SMALLINT(6) NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`user_id`));
# Create the score table
CREATE TABLE `school`.`score` (
`score_id` BIGINT NOT NULL AUTO_INCREMENT,
`user_id` BIGINT NOT NULL,
`section` SMALLINT(6) NOT NULL DEFAULT 1,
`subject` VARCHAR(45) NOT NULL,
`score` SMALLINT(6) NOT NULL DEFAULT 0,
PRIMARY KEY (`score_id`));
Bây giờ, hãy thêm dữ liệu thử nghiệm vào bảng người dùng như được hiển thị bên dưới.
# User data
INSERT INTO `user` ( `user_id`, `first_name`, `last_name`, `section`, `active` ) VALUES
( 1, 'John', 'Smith', 1, 1 ),
( 2, 'Rick', 'Jones', 1, 1 ),
( 3, 'Catherine', 'Ponting', 2, 1 ),
( 4, 'Harsh', 'Upadhyay', 2, 1 ),
( 5, 'Tajwinder', 'Singh', 2, 0 );
Truy vấn trên sẽ chèn 5 người dùng cho phần 1 và 2. Ngoài ra, hãy chèn dữ liệu điểm bằng truy vấn như hình dưới đây.
# Score data
INSERT INTO `school`.`score` (`score_id`, `user_id`, `section`, `subject`, `score`) VALUES
('1', '1', '1', 'Maths', '86'),
('2', '1', '1', 'Physics', '75'),
('3', '1', '1', 'Chemistry', '90'),
('4', '2', '1', 'Maths', '64'),
('5', '2', '1', 'Physics', '98'),
('6', '2', '1', 'Chemistry', '56'),
('7', '3', '1', 'Maths', '48'),
('8', '3', '1', 'Physics', '69'),
('9', '3', '1', 'Chemistry', '54'),
('10', '3', '2', 'Maths', '82'),
('11', '3', '2', 'Physics', '85'),
('12', '3', '2', 'Chemistry', '91'),
('13', '4', '2', 'Maths', '65'),
('14', '4', '2', 'Physics', '74'),
('15', '4', '2', 'Chemistry', '84');
Chúng tôi đã chèn số điểm của những học sinh tích cực. Ngoài ra, lưu ý rằng điểm của học sinh có id 1 và 2 được cộng cho phần 1 cho cả 3 môn học. Truy vấn trên cũng chèn dữ liệu điểm của học sinh có id 3 cho phần 1 và 2. Học sinh có id 4 nhận dữ liệu điểm cho phần 2. Bây giờ chúng ta đã có dữ liệu kiểm tra tốt để bắt đầu học các hàm tổng hợp.
SUM
Phần này giải thích cách sử dụng hàm tổng hợp để lấy điểm theo từng phần của người dùng để có được tổng điểm của tất cả các môn học cho tất cả các phần như được hiển thị bên dưới.
# SUM - Total Score of the Users for each section
SELECT `user`.`first_name`, `user`.`last_name`, `score`.`section`, SUM(`score`) AS total_score FROM `user`, `score`
WHERE `user`.`user_id` = `score`.`user_id`
GROUP BY `score`.`user_id`, `score`.`section`;
# Result
first_name last_name section total_score
----------------------------------------------------
John Smith 1 251
Rick Jones 1 218
Catherine Ponting 1 171
Catherine Ponting 2 258
Harsh Upadhyay 2 223
Kết quả truy vấn trên có thể được sử dụng để trình bày báo cáo cho biết tổng điểm của tất cả những người dùng cho mỗi phần mà họ đã học trong trường.
AVG
Hàm tổng hợp AVG có thể được sử dụng để lấy giá trị trung bình của các cột đủ điều kiện cho tổng hợp dựa trên các điều kiện WHERE và nhóm được chúng tôi áp dụng.
Chúng ta có thể lấy điểm trung bình từng phần trong mỗi môn học như hình dưới đây.
# AVG - Section wise average score in each subject
SELECT `score`.`section`, `score`.`subject`, AVG(`score`) AS avg_score FROM `score`
GROUP BY `score`.`section`, `score`.`subject`;
# Result
section subject avg_score
--------------------------------------------
1 Maths 66.0000
1 Physics 80.6667
1 Chemistry 66.6667
2 Maths 73.5000
2 Physics 79.5000
2 Chemistry 87.5000
Giờ đây, chúng tôi có thể sử dụng dữ liệu trên để tạo báo cáo hiển thị điểm trung bình mà người dùng thu được cho mỗi phần.
TỐI ĐA
Hàm tổng hợp MAX có thể được sử dụng để tìm ra giá trị lớn nhất của các cột đủ điều kiện cho việc tổng hợp dựa trên các điều kiện WHERE và nhóm được chúng tôi áp dụng.
Chúng tôi có thể đạt được điểm tối đa của từng phần trong mỗi môn học như được hiển thị bên dưới.
# MAX - Section wise maximum score in each subject
SELECT `score`.`section`, `score`.`subject`, MAX(`score`) AS max_score FROM `score`
GROUP BY `score`.`section`, `score`.`subject`;
# Result
section subject max_score
--------------------------------------------
1 Maths 86
1 Physics 98
1 Chemistry 90
2 Maths 82
2 Physics 85
2 Chemistry 91
PHÚT
Hàm tổng hợp MIN có thể được sử dụng để tìm ra giá trị tối thiểu của các cột đủ điều kiện cho việc tổng hợp dựa trên các điều kiện WHERE và nhóm được chúng tôi áp dụng.
Chúng ta có thể lấy điểm tối thiểu theo từng phần trong mỗi môn học như hình dưới đây.
# MIN - Section wise minimum score in each subject
SELECT `score`.`section`, `score`.`subject`, MIN(`score`) AS min_score FROM `score`
GROUP BY `score`.`section`, `score`.`subject`;
# Result
section subject max_score
--------------------------------------------
1 Maths 48
1 Physics 69
1 Chemistry 54
2 Maths 65
2 Physics 74
2 Chemistry 84
COUNT
Hàm tổng hợp COUNT có thể được sử dụng để nhận tổng số giá trị trong các cột được chỉ định.
Sử dụng dữ liệu thử nghiệm, chúng tôi có thể có được tổng số người dùng đang hoạt động theo từng phần như được hiển thị bên dưới.
# COUNT - Total active users in each section
SELECT `user`.`section`, COUNT(`user_id`) AS active_users FROM `user`
WHERE `user`.`active` = 1
GROUP BY `user`.`section`;
# Result
section active_user
--------------------
1 2
2 2
DISTINCT
Chúng ta có thể sử dụng từ khóa DISTINCT để bỏ qua các bản ghi trùng lặp. Trong trường hợp của chúng tôi, chúng tôi có thể lấy dữ liệu người dùng đã lấy được
# DISTINCT - Get list of users who got score
SELECT DISTINCT `user`.`user_id`, `user`.`first_name`, `user`.`last_name` FROM `user`, `score`
WHERE `user`.`user_id` = `score`.`user_id`;
# Result
user_id first_name last_name
--------------------------------------------
1 John Smith
2 Rick Jones
3 Catherine Ponting
4 Harsh Upadhyay
Chúng ta có thể thấy rằng người dùng không hoạt động không đạt điểm dù chỉ một lần sẽ bị bỏ qua khỏi kết quả truy vấn.
Đây là cách chúng tôi có thể sử dụng các hàm tổng hợp để lấy dữ liệu cho mục đích báo cáo và phân tích. Các chức năng này cũng rất quan trọng đối với các hoạt động của nhà quản lý để đưa ra các quyết định của tổ chức bằng cách sử dụng dữ liệu được tích lũy theo thời gian.