L'un des aspects les plus puissants de SQL est la possibilité d'effectuer une agrégation de données. Deux des outils d'agrégation de données SQL les plus puissants sont le regroupement et totalisant . Dans ce guide, vous apprendrez l'agrégation de données SQL à l'aide du regroupement et de la totalisation.
Fonctions d'agrégation SQL
En SQL, l'agrégation est le processus d'exploitation ou de calcul d'un ensemble de valeurs. L'intention est de renvoyer une seule valeur récapitulative. SQL inclut plusieurs fonctions d'agrégation très puissantes telles que AVG()
, COUNT()
, SUM()
, MAX()
, et MIN()
. Ces fonctions, à leur tour, se trouvent le plus souvent dans des instructions SQL qui implémentent un GROUP BY
clause. Cependant, ces fonctions n'ont pas besoin d'être associées à cette clause.
Remarque Sauf mention contraire, toutes les commandes de base de données présentées dans ce guide fonctionnent bien sur MySQL et PostgreSQL .
Ce guide utilise un CourseTaken
tableau pour illustrer les fonctions d'agrégation. Depuis la ligne de commande, créez le CourseTaken
tableau.
CREATE TABLE CourseTaken (
SSNumber CHAR(9) NOT NULL,
CourseId CHAR(6) NOT NULL,
NumericGrade INT NOT NULL,
YearTaken INT NOT NULL
);
Le CourseTaken
table contient les données de colonne suivantes :
SSNumber | ID de cours | Grade numérique | Année prise |
---|---|---|---|
111111111 | CSC101 | 98 | 2021 |
111111111 | ENG101 | 95 | 2022 |
222222222 | CSC101 | 100 | 2022 |
222222222 | EEE101 | 75 | 2022 |
333333333 | POL101 | 92 | 2021 |
333333333 | CSC101 | 84 | 2022 |
Utiliser une fonction d'agrégation SQL pour calculer une valeur récapitulative unique
Les sections ci-dessous fournissent différents exemples qui utilisent des fonctions d'agrégation pour renvoyer une seule valeur récapitulative. Tous les exemples utilisent le CourseTaken
tableau qui a été créé dans la section Fonctions d'agrégation du guide.
Exemple 1 :
Dans cet exemple, la fonction d'agrégation renvoie une note moyenne numérique pour tous les étudiants qui suivent le cours CSC101
en 2022.
SELECT AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101
AND YearTaken = 2022;
SQL renvoie la note moyenne suivante :
Avg Grade
---------
92
Exemple 2 :
La fonction d'agrégation ci-dessous renvoie le nombre d'étudiants qui ont suivi le cours CSC101
avant l'année 2022.
SELECT COUNT(SSNumber) AS 'Student Count'
FROM CourseTaken
WHERE CourseId = 'CSC101'
AND YearTaken < 2022;
Le décompte suivant est renvoyé :
Student Count
---------
1
Exemple 3 :
Dans cet exemple, une fonction d'agrégation est utilisée pour obtenir la note numérique maximale enregistrée au cours d'une année par un étudiant suivant CSC101
.
SELECT MAX(NumericGrade) AS 'Max Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101'
La note maximale renvoyée est la suivante :
Max Grade
---------
100
Agréger des données à l'aide de fonctions de groupe
Les exemples suivants illustrent l'utilisation du GROUP BY
clause utilisant les données du CourseTaken
tableau.
Exemple 1 :
L'exemple ci-dessous détermine la note moyenne de chaque étudiant pour tous les cours qu'il a suivis à ce jour. Pour l'exécuter, utilisez le SQL Group By
clause pour regrouper par Étudiant (dans ce cas, le SSNumber
colonne).
SELECT SSNumber, AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
GROUP BY SSNumber
La sortie renvoie la note moyenne de chaque étudiant.
+-----------+----------+
| SSNumber | Avg Grade|
+-----------+----------+
| 111111111 | 96.5 |
| 222222222 | 87.5 |
| 333333333 | 88 |
+-----------+----------+
Exemple 2 :
La fonction d'agrégation ci-dessous trouve la note moyenne reçue pour chaque CourseId
dans le CourseTaken
table. Pour ce faire, regroupez par CourseId
dans YearTaken
avec le code SQL suivant :
SELECT CourseId AS 'Course', YearTaken AS 'Year',
AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
GROUP BY CourseId, YearTaken
ORDER BY CourseId, YearTaken
Vous devriez voir le résultat suivant :
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| POL101 | 2021 | 92 |
| CSC101 | 2022 | 92 |
| EEE101 | 2022 | 75 |
| ENG101 | 2022 | 95 |
+--------+------+-----------+
Remarque L'exemple ci-dessus est légèrement plus complexe. Vous groupez par deux colonnes au lieu d'une (CourseId
dansYear
). Par conséquent, vous calculez la note moyenne et le groupe parCSC101
pour l'année2021
séparément de la note moyenne pourCSC101
pour l'année2022
. Le coursCSC101
pour l'année2022
est une agrégation de deux lignes, tandis que toutes les autres lignes Grouper par sont une agrégation d'une ligne. De plus, à partir du concept de commande (Order By
clause) vous pouvez afficher les résultats classés (triés) parCourse
dans une année donnée.
Exemple 3 :
A partir de la requête SQL de l'exemple précédent, vous pouvez restreindre le nombre de lignes que vous exploitez en ajoutant un WHERE
clause à la requête. Par exemple, pour générer la note moyenne reçue par les étudiants uniquement pour CourseId
CSC101
, grouper par CourseId
dans YearTaken
. Le code SQL suivant peut accomplir cela :
SELECT CourseId AS 'Course', YearTaken AS 'Year',
AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101'
GROUP BY CourseId, YearTaken
ORDER BY CourseId, YearTaken
Dans le code SQL ci-dessus, vous ajoutez une condition (via le WHERE
clause) avant que l'agrégation de groupe réelle ne soit effectuée (via la clause GROUP BY
clause).
La sortie suivante est renvoyée :
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| CSC101 | 2022 | 92 |
+--------+------+-----------+
Exemple 4 :
À partir de la requête SQL de l'exemple 2, vous pouvez appliquer une condition avant que le résultat final ne soit renvoyé. Pour ce faire, utilisez le SQL Having
clause. Vous pouvez déterminer la note moyenne sur chaque CourseId
, où la note moyenne agrégée est supérieure à 90
. Vous pouvez à nouveau grouper par CourseId
dans YearTaken
. Le code SQL suivant peut accomplir cela :
SELECT CourseId AS ‘Course’, YearTaken AS ‘Year’,
AVG(NumericGrade) AS ‘Avg Grade’
FROM CourseTaken
GROUP BY CourseId, YearTaken
HAVING AVG(NumericGrade) > 90
ORDER BY CourseId, YearTaken
Le résultat est le suivant :
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| POL101 | 2021 | 92 |
| CSC101 | 2022 | 92 |
| ENG101 | 2022 | 95 |
+--------+------+-----------+
La ligne pour CourseId
EEE101
n'a pas été retourné. C'est parce que le Having
la clause l'a filtré après le GROUP BY
clause a été exécutée (CourseId
EEE101
la note moyenne de est inférieure à 90).
Exemple 5 :
S'appuyant sur le code SQL de l'exemple 3 et Exemple 4 , vous pouvez créer des requêtes d'agrégation qui utilisent à la fois Where
et Having
clause. Par exemple, vous pouvez déterminer les cours qui ont été suivis en 2021
, où la note moyenne des cours suivis était supérieure à 93
. Ici, le Where
la clause filtre les résultats avant le Group By
l'agrégation des données est effectuée, et le Having
la clause filtre les résultats renvoyés après le Group By
l'agrégation des données est effectuée. Le code SQL suivant peut accomplir cela :
SELECT CourseId AS ‘Course’, YearTaken AS ‘Year’,
AVG(NumericGrade) AS ‘Avg Grade’
FROM CourseTaken
WHERE YearTaken = 2021
GROUP BY CourseId, YearTaken
HAVING AVG(NumericGrade) > 93
ORDER BY CourseId
Le résultat renvoyé est le suivant :
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
+--------+------+-----------+
Exemple 6 :
Vous pouvez compter le nombre de lignes associées à chaque Group By
agrégation dans une requête. En vous basant sur l'exemple de code SQL précédent, vous pouvez générer la note moyenne reçue par les Students
pour CourseId
uniquement CSC101
, regroupés par CourseId
dans YearTaken
. Le code doit indiquer le nombre d'élèves (nombre) associés à chaque groupe. Le code SQL suivant peut accomplir cela :
SELECT CourseId AS ‘Course’, YearTaken AS ‘Year’,
AVG(NumericGrade) AS ‘Avg Grade’,
Count(SSNumber) AS ‘Count’
FROM CourseTaken
WHERE CourseId = ‘CSC101’
GROUP BY CourseId, YearTaken
ORDER BY CourseId, YearTaken
Le Count(SSNumber)
dans le SELECT
la clause aurait pu être spécifiée sous la forme Count(*)
. La différence entre les deux syntaxes est que Count(*)
inclut les lignes qui ont NULL
valeurs en eux aussi. Selon le CourseTaken
définition de table ci-dessus, toutes les colonnes dans le CourseTaken
table doit contenir des valeurs non nulles (le NOT NULL
attribut le garantit). Le Count(SSNumber)
et Count(*)
serait fonctionnellement équivalent dans cet exemple.
La sortie suivante est renvoyée :
+--------+------+-----------+-------+
| Course | Year | Avg Grade | Count |
+--------+------+-----------+-------+
| CSC101 | 2021 | 98 | 1 |
| CSC101 | 2022 | 92 | 2 |
+--------+------+-----------+-------+
Conclusion
Ce guide fournit les éléments de base des puissantes opérations d'agrégation de données de SQL pour le regroupement et le total. Comme indiqué, vous pouvez restreindre les valeurs qui font partie de ces groupes en utilisant un Where
clause dans les requêtes avant que l'agrégation ne soit effectuée. Vous pouvez filtrer les lignes de résultats groupés (après l'agrégation) en utilisant le Having
clause dans les requêtes SQL.