Nous avons souvent dû effectuer des calculs sur plusieurs lignes pour obtenir les données à des fins de reporting, statistiques et analytiques. Dans de tels cas, les fonctions d'agrégation disponibles dans MySQL sont pratiques et nous devons être conscients de l'utilisation de ces fonctions pour récupérer les données souhaitées. Ces fonctions incluent SUM, AVG, MAX, MIN, COUNT et DISTINCT.
Le reste de la section de ce didacticiel explique l'utilisation de ces fonctions d'agrégation.
Données de test
Vous pouvez utiliser les requêtes mentionnées ci-dessous pour préparer les données de test afin de suivre les sections suivantes. Créez la base de données et les tableaux de l'école (utilisateur et score) pour comprendre les fonctions d'agrégation.
# 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`));
Ajoutez maintenant les données de test à la table utilisateur comme indiqué ci-dessous.
# 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 );
La requête ci-dessus insère 5 utilisateurs pour les sections 1 et 2. Insérez également les données de score à l'aide de la requête comme indiqué ci-dessous.
# 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');
Nous avons inséré le score des étudiants actifs. Notez également que le score de l'étudiant avec id 1 et 2 est ajouté pour la section 1 pour les 3 matières. La requête ci-dessus insère également les données de score de l'étudiant avec l'identifiant 3 pour les sections 1 et 2. L'étudiant ayant l'identifiant 4 a obtenu les données de score pour la section 2. Nous avons maintenant de bonnes données de test pour commencer à apprendre les fonctions d'agrégation.
SOMME
Cette section explique l'utilisation de la fonction d'agrégation sum pour obtenir le score par section des utilisateurs afin d'obtenir le score total de tous les sujets pour toutes les sections, comme indiqué ci-dessous.
# 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
Les résultats de la requête ci-dessus peuvent être utilisés pour présenter le rapport indiquant le score total de tous les utilisateurs pour chaque section qu'ils ont étudiée à l'école.
MOY
La fonction d'agrégation AVG peut être utilisée pour obtenir la valeur moyenne des colonnes qualifiées pour l'agrégation en fonction des conditions WHERE et du regroupement que nous avons appliqué.
Nous pouvons obtenir les notes moyennes par section dans chaque matière comme indiqué ci-dessous.
# 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
Nous pouvons maintenant utiliser les données ci-dessus pour générer le rapport indiquant le score moyen obtenu par les utilisateurs pour chaque section.
MAX
La fonction d'agrégation MAX permet de connaître la valeur maximale des colonnes qualifiées pour l'agrégation en fonction des conditions WHERE et du regroupement appliqué par nos soins.
Nous pouvons obtenir les notes maximales par section dans chaque matière, comme indiqué ci-dessous.
# 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
La fonction d'agrégation MIN permet de connaître la valeur minimale des colonnes qualifiées pour l'agrégation en fonction des conditions WHERE et du regroupement appliqué par nos soins.
Nous pouvons obtenir les notes minimales par section dans chaque matière, comme indiqué ci-dessous.
# 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
COMPTER
La fonction d'agrégation COUNT peut être utilisée pour obtenir le nombre total de valeurs dans les colonnes spécifiées.
À l'aide des données de test, nous pouvons obtenir le nombre total d'utilisateurs actifs par section, comme indiqué ci-dessous.
# 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
Nous pouvons utiliser le mot-clé DISTINCT pour omettre les enregistrements en double. Dans notre scénario, nous pouvons obtenir les données utilisateur qui ont obtenu
# 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
Nous pouvons voir que l'utilisateur inactif qui n'a pas marqué une seule fois est omis des résultats de la requête.
C'est ainsi que nous pouvons utiliser les fonctions d'agrégation pour obtenir les données à des fins de rapport et d'analyse. Ces fonctions sont également importantes pour les activités de gestion pour prendre des décisions d'organisation en utilisant les données accumulées au fil du temps.