Et af de mest kraftfulde aspekter af SQL er evnen til at udføre dataaggregering. To af de mest kraftfulde SQL-dataaggregeringsværktøjer er gruppering og i alt . I denne vejledning lærer du SQL-dataaggregering ved hjælp af gruppering og summering.
SQL-aggregatfunktioner
I SQL er aggregering processen med at betjene eller beregne et sæt værdier. Hensigten er at returnere en enkelt opsummeringsværdi. SQL indeholder flere meget kraftfulde aggregerede funktioner såsom AVG()
, COUNT()
, SUM()
, MAX()
og MIN()
. Disse funktioner findes til gengæld oftest i SQL-sætninger, der implementerer en GROUP BY
klausul. Disse funktioner behøver dog ikke at være forbundet med denne klausul.
Bemærk Medmindre andet er nævnt, fungerer alle databasekommandoer, der er vist i denne vejledning, godt på både MySQL og PostgreSQL .
Denne vejledning bruger en CourseTaken
tabel for at demonstrere aggregerede funktioner. Fra kommandolinjen skal du oprette CourseTaken
tabel.
OPRET TABEL CourseTaken (SSNumber CHAR(9) NOT NULL, CourseId CHAR(6) NOT NULL, NumericGrade INT NOT NULL, YearTaken INT NOT NULL);
CourseTaken
tabel indeholder følgende kolonnedata:
SSNumber | CourseId | NumericGrade | YearTaken |
---|---|---|---|
111111111 | CSC101 | 98 | 2021 |
111111111 | ENG101 | 95 | 2022 |
222222222 | CSC101 | 100 | 2022 |
222222222 | EEE101 | 75 | 2022 |
333333333 | POL101 | 92 | 2021 |
333333333 | CSC101 | 84 | 2022 |
Brug en SQL-aggregatfunktion til at beregne en enkelt oversigtsværdi
Sektionerne nedenfor giver forskellige eksempler, der bruger aggregerede funktioner til at returnere en enkelt oversigtsværdi. Alle eksempler bruger CourseTaken
tabel, der blev oprettet i sektionen Samlede funktioner i vejledningen.
Eksempel 1:
I dette eksempel returnerer aggregatfunktionen en numerisk gennemsnitskarakter for alle elever, der tager kurset CSC101
i år 2022.
VÆLG AVG(NumericGrade) SOM 'Avg Grade'FROM CourseTakenWHERE CourseId ='CSC101AND YearTaken =2022;
SQL returnerer følgende gennemsnitskarakter:
Gennemsnitlig karakter---------92
Eksempel 2:
Den samlede funktion nedenfor returnerer en optælling af antallet af studerende, der tog kursus CSC101
før år 2022.
VÆLG COUNT(SSNumber) AS 'Student Count'FROM CourseTakenWHERE CourseId ='CSC101'AND YearTaken <2022;
Følgende optælling returneres:
Studentantal---------1
Eksempel 3:
I dette eksempel bruges en aggregeret funktion til at opnå den maksimale numeriske karakter, der er registreret i ethvert år af en elev, der tager CSC101
.
VÆLG MAX(NumericGrade) AS 'Max Grade'FROM CourseTakenWHERE CourseId ='CSC101'
Den returnerede maksimale karakter er følgende:
Maks. karakter---------100
Aggregér data ved hjælp af gruppefunktioner
De følgende eksempler demonstrerer brugen af GROUP BY
klausul ved hjælp af data fra CourseTaken
tabel.
Eksempel 1:
Eksemplet nedenfor bestemmer gennemsnitskarakteren for hver elev for alle kurser, de har taget til dato. For at udføre dette skal du bruge SQL Group By
klausul til at gruppere efter elev (i dette tilfælde SSNumber
kolonne).
VÆLG SSNumber, AVG(NumericGrade) SOM 'Gennemsnitskarakter'FRA CourseTakenGROUP BY SSNumber
Outputtet returnerer gennemsnitskarakteren for hver elev.
+-----------+----------+| SSNumber | Gennemsnitlig karakter|+-----------+----------+| 111111111 | 96,5 || 222222222 | 87,5 || 333333333 | 88 |+-----------+----------+
Eksempel 2:
Den samlede funktion nedenfor finder den gennemsnitlige karakter modtaget på tværs af hvert CourseId
i CourseTaken
bord. For at gøre dette, grupper efter CourseId
inden for YearTaken
med følgende SQL-kode:
VÆLG CourseId AS 'Course', YearTaken AS 'Year',AVG(NumericGrade) AS 'Avg Grade'FROM CourseTakenGROUP BY CourseId, YearTakenORDER BY CourseId, YearTaken
Du bør se følgende output:
+--------+------+-----------+| Kursus | år | Gennemsnitlig karakter |+--------+------+-----------+| CSC101 | 2021 | 98 || POL101 | 2021 | 92 || CSC101 | 2022 | 92 || EEE101 | 2022 | 75 || ENG101 | 2022 | 95 |+--------+------+-----------+
Bemærk Eksemplet ovenfor er lidt mere komplekst. Du grupperer efter to kolonner i stedet for én (CourseId
inden forÅr
). Derfor beregner du den gennemsnitlige karakter og grupperer efterCSC101
for året2021
separat fra den gennemsnitlige karakter forCSC101
for året2022
. KursetCSC101
for år2022
er en aggregering af to rækker, mens alle de andre Group By-rækker er en aggregering af en række. Derudover fra konceptet bestilling (Bestil efter
klausul) kan du vise ordnede resultater (sorteret) efterKursus
inden for et givet år.
Eksempel 3:
Fra SQL-forespørgslen i det foregående eksempel kan du begrænse antallet af rækker, du betjener, ved at tilføje en WHERE
klausul til forespørgslen. For eksempel for kun at generere den gennemsnitlige karakter modtaget af elever for CourseId
CSC101
, grupper efter CourseId
inden for YearTaken
. Følgende SQL-kode kan udføre dette:
VÆLG CourseId AS 'Course', YearTaken AS 'Year',AVG(NumericGrade) AS 'Avg Grade'FROM CourseTakenWHERE CourseId ='CSC101'GROUP BY CourseId, YearTakenORDER BY CourseId, YearTaken
I ovenstående SQL-kode tilføjer du en betingelse (via WHERE
klausul), før den faktiske gruppesammenlægning udføres (via GROUP BY
klausul).
Følgende output returneres:
+--------+------+-----------+| Kursus | år | Gennemsnitlig karakter |+--------+------+-----------+| CSC101 | 2021 | 98 || CSC101 | 2022 | 92 |+--------+------+-----------+
Eksempel 4:
Fra SQL-forespørgslen i eksempel 2 kan du anvende en betingelse, før det endelige resultat returneres. For at opnå dette skal du bruge SQL Having
klausul. Du kan bestemme den gennemsnitlige karakter på tværs af hver CourseId
, hvor den aggregerede gennemsnitskarakter er større end 90
. Du kan igen gruppere efter CourseId
inden for YearTaken
. Følgende SQL-kode kan udføre dette:
VÆLG CourseId AS 'Course', YearTaken AS 'Year',AVG(NumericGrade) AS 'Avg Grade'FRA CourseTakenGROUP BY CourseId, YearTakenHAVING AVG(NumericGrade)> 90ORDER BY CourseId, YearTaken
Outputtet er følgende:
+--------+------+-----------+| Kursus | år | Gennemsnitlig karakter |+--------+------+-----------+| CSC101 | 2021 | 98 || POL101 | 2021 | 92 || CSC101 | 2022 | 92 || ENG101 | 2022 | 95 |+--------+------+-----------+
Rækken for CourseId
EE101
blev ikke returneret. Dette skyldes, at Har
klausul filtrerede det fra efter GROUP BY
klausul blev udført (CourseId
EE101
’s gennemsnitlige karakter er under 90).
Eksempel 5:
Bygger på SQL-koden fra Eksempel 3 og Eksempel 4 , kan du oprette aggregeringsforespørgsler, der bruger både Where
og Har
klausul. For eksempel kan du bestemme de kurser, der blev taget i 2021
, hvor gennemsnitskarakteren for disse kurser var større end 93
. Her er Hvor
klausulen filtrerer resultater fra før Group By
dataaggregering udføres, og Har
klausulen frafiltrerer resultater, der returneres efter Group By
dataaggregering udføres. Følgende SQL-kode kan udføre dette:
VÆLG CourseId AS 'Course', YearTaken AS 'Year',AVG(NumericGrade) AS 'Avg Grade'FROM CourseTakenWHERE YearTaken =2021GROUP BY CourseId, YearTakenHAVING AVG(NumericGrade)> 93IORDER Code
Det returnerede output er følgende:
+--------+------+-----------+| Kursus | år | Gennemsnitlig karakter |+--------+------+-----------+| CSC101 | 2021 | 98 |+--------+------+-----------+
Eksempel 6:
Du kan tælle antallet af rækker, der er knyttet til hver Grupper efter
aggregering i en forespørgsel. Med udgangspunkt i det foregående eksempel på SQL-kode kan du generere den gennemsnitlige karakter modtaget af Studenter
kun for CourseId
CSC101
, grupperet efter CourseId
inden for YearTaken
. Koden skal angive antallet af elever (antal), der er tilknyttet hver gruppe. Følgende SQL-kode kan udføre dette:
VÆLG CourseId AS 'Course', YearTaken AS 'Year',AVG(NumericGrade) AS 'Avg Grade',Count(SSNumber) AS 'Count'FROM CourseTakenWHERE CourseId ='CSC101'GROUP BY CourseId, YearTakenORDER BY CourseId, YearTaken
Count(SSNumber)
i SELECT
klausul kunne have været angivet som Count(*)
. Forskellen mellem de to syntakser er, at Count(*)
inkluderer rækker, der har NULL
værdier i dem også. I henhold til CourseTaken
tabeldefinition ovenfor, alle kolonner i CourseTaken
tabellen skal indeholde værdier, der ikke er nul (NOT NULL
attribut sikrer dette). Count(SSNumber)
og Count(*)
ville være funktionelt ækvivalent i dette eksempel.
Følgende output returneres:
+--------+------+-----------+-------+| Kursus | år | Gennemsnitlig karakter | Tæl |+--------+------+-----------+-------+| CSC101 | 2021 | 98 | 1 || CSC101 | 2022 | 92 | 2 |+--------+------+------------+------+
Konklusion
Denne vejledning giver byggestenene til SQLs kraftfulde dataaggregeringsoperationer til gruppering og sammenlægning. Som nævnt kan du begrænse værdier, der bliver en del af disse grupper, ved at bruge en Hvor
klausul i forespørgsler, før sammenlægningen udføres. Du kan bortfiltrere rækker af grupperede resultater (efter aggregeringen er udført) ved at bruge Har
klausul i SQL-forespørgslerne.