Vi krævede ofte at udføre beregninger på flere rækker for at få data til rapportering, statistiske og analytiske formål. I sådanne tilfælde er de tilgængelige aggregeringsfunktioner i MySQL praktiske, og vi skal være opmærksomme på at bruge disse funktioner til at hente de ønskede data. Disse funktioner omfatter SUM, AVG, MAX, MIN, COUNT og DISTINCT.
Resten af afsnittet i denne øvelse forklarer brugen af disse aggregeringsfunktioner.
Testdata
Du kan bruge nedenstående forespørgsler til at forberede testdataene til at følge de efterfølgende afsnit. Opret skolens database og tabeller (bruger og score) for at forstå aggregeringsfunktionerne.
# 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`));
Tilføj nu testdataene til brugertabellen som vist nedenfor.
# 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 );
Ovenstående forespørgsel indsætter 5 brugere for sektion 1 og 2. Indsæt også scoredata ved hjælp af forespørgslen som vist nedenfor.
# 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');
Vi har indsat de aktive elevers score. Bemærk også, at scoren for eleven med id 1 og 2 tilføjes for sektion 1 for alle de 3 fag. Ovenstående forespørgsel indsætter også scoredata for elev med id 3 for sektion 1 og 2. Eleven med id 4 fik scoredata for sektion 2. Nu har vi gode testdata til at begynde at lære de aggregerede funktioner.
SUM
Dette afsnit forklarer brugen af den samlede funktionssum for at få brugernes sektionsvise score for at få den samlede score for alle emnerne for alle sektionerne som vist nedenfor.
# 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
Ovenstående forespørgselsresultater kan bruges til at præsentere rapporten, der viser den samlede score for alle brugere for hver sektion, de har studeret på skolen.
AVG
Aggregeringsfunktionen AVG kan bruges til at få den gennemsnitlige værdi af de kolonner, der er kvalificeret til aggregeringen baseret på WHERE-betingelserne og den gruppering, vi anvender.
Vi kan opnå de sektionsmæssige gennemsnitskarakterer i hvert emne som vist nedenfor.
# 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
Nu kan vi bruge ovenstående data til at generere rapporten, der viser den gennemsnitlige score opnået af brugerne for hvert afsnit.
MAX
Aggregeringsfunktionen MAX kan bruges til at finde ud af den maksimale værdi af de kolonner, der er kvalificeret til aggregeringen, baseret på WHERE-betingelserne og den gruppering, vi anvender.
Vi kan opnå de sektionsvise maksimale karakterer i hvert emne som vist nedenfor.
# 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
Aggregeringsfunktionen MIN kan bruges til at finde ud af minimumsværdien af de kolonner, der er kvalificeret til aggregeringen, baseret på WHERE-betingelserne og den gruppering, vi anvender.
Vi kan opnå de sektionsvise minimumskarakterer i hvert emne som vist nedenfor.
# 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
ANTAL
Den samlede funktion COUNT kan bruges til at få det samlede antal værdier i de angivne kolonner.
Ved at bruge testdataene kan vi få det sektionsvise samlede antal aktive brugere som vist nedenfor.
# 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
DISTINKT
Vi kan bruge søgeordet DISTINCT til at udelade duplikerede poster. I vores scenarie kan vi få de brugerdata, der opnåede
# 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
Vi kan se, at den inaktive bruger, der ikke scorede én gang, er udeladt fra forespørgselsresultaterne.
Sådan kan vi bruge de aggregerede funktioner til at indhente data til rapportering og analyseformål. Disse funktioner er også vigtige for ledelsesaktiviteter for at tage organisationsbeslutninger ved hjælp af de data, der er akkumuleret over tid.