Często wymagaliśmy wykonania obliczeń w wielu wierszach, aby uzyskać dane do celów raportowych, statystycznych i analitycznych. W takich przypadkach funkcje agregacji dostępne w MySQL są przydatne i musimy być świadomi używania tych funkcji do pobierania żądanych danych. Funkcje te obejmują SUM, AVG, MAX, MIN, COUNT i DISTINCT.
Pozostała część tego samouczka wyjaśnia użycie tych funkcji agregacji.
Dane testowe
Poniższe zapytania można wykorzystać do przygotowania danych testowych do kolejnych rozdziałów. Utwórz szkolną bazę danych i tabele (użytkownik i wynik), aby zrozumieć funkcje agregacji.
# 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`));
Teraz dodaj dane testowe do tabeli użytkownika, jak pokazano poniżej.
# 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 );
Powyższe zapytanie wstawia 5 użytkowników w sekcjach 1 i 2. Wstaw również dane punktowe za pomocą zapytania, jak pokazano poniżej.
# 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');
Dodaliśmy wynik aktywnych uczniów. Należy również zauważyć, że punktacja dla ucznia o id 1 i 2 jest dodawana do sekcji 1 dla wszystkich 3 przedmiotów. Powyższe zapytanie wstawia również dane punktowe ucznia o id 3 dla sekcji 1 i 2. Uczeń mający id 4 otrzymał dane punktowe dla sekcji 2. Teraz mamy dobre dane testowe, aby rozpocząć naukę funkcji agregujących.
SUMA
W tej sekcji wyjaśniono użycie sumy funkcji zagregowanej w celu uzyskania wyniku sekcji dla użytkowników, aby uzyskać łączny wynik wszystkich przedmiotów dla wszystkich sekcji, jak pokazano poniżej.
# 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
Powyższe wyniki zapytania mogą być użyte do przedstawienia raportu pokazującego łączny wynik wszystkich użytkowników dla każdej sekcji, którą studiowali w szkole.
ŚREDNIA
Funkcji agregującej AVG można użyć do uzyskania średniej wartości kolumn zakwalifikowanych do agregacji na podstawie warunków WHERE i zastosowanego przez nas grupowania.
Możemy uzyskać średnią ocen przekrojowych z każdego przedmiotu, jak pokazano poniżej.
# 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
Teraz możemy wykorzystać powyższe dane do wygenerowania raportu pokazującego średni wynik uzyskany przez użytkowników dla każdej sekcji.
MAKS
Funkcji agregującej MAX można użyć do określenia maksymalnej wartości kolumn zakwalifikowanych do agregacji na podstawie warunków WHERE i zastosowanego przez nas grupowania.
Możemy uzyskać maksymalne oceny przekrojowe z każdego przedmiotu, jak pokazano poniżej.
# 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
MIN
Funkcji agregującej MIN można użyć do określenia minimalnej wartości kolumn zakwalifikowanych do agregacji na podstawie warunków WHERE i zastosowanego przez nas grupowania.
Możemy uzyskać minimalne oceny przekrojowe z każdego przedmiotu, jak pokazano poniżej.
# 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
LICZBA
Funkcji agregującej COUNT można użyć do uzyskania całkowitej liczby wartości w określonych kolumnach.
Korzystając z danych testowych, możemy uzyskać całkowitą liczbę aktywnych użytkowników w przekroju, jak pokazano poniżej.
# 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
ODRÓŻNE
Możemy użyć słowa kluczowego DISTINCT, aby pominąć zduplikowane rekordy. W naszym scenariuszu możemy uzyskać dane użytkownika, który uzyskał
# 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
Widzimy, że nieaktywny użytkownik, który nie zdobył ani jednej oceny, jest pomijany w wynikach zapytania.
W ten sposób możemy wykorzystać funkcje agregujące, aby uzyskać dane do celów raportowania i analizy. Funkcje te są również ważne dla działań kierowniczych, aby podejmować decyzje organizacyjne przy użyciu danych gromadzonych w czasie.