sql >> Database teknologi >  >> RDS >> Mysql

Introduktion til SQL-gruppering og sammenlægning

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 efter CSC101 for året 2021 separat fra den gennemsnitlige karakter for CSC101 for året 2022 . Kurset CSC101 for år 2022 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) efter Kursus 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.


  1. Google BigQuery ODBC-driver

  2. Kan ikke indlæse sqlite-databasen ved første kørsel

  3. 2 måder at konvertere mellem decimal og hexadecimal i MySQL

  4. MariaDB introducerer en JSON_TABLE() funktion