Jednym z najpotężniejszych aspektów SQL jest możliwość wykonywania agregacji danych. Dwa najpotężniejsze narzędzia do agregacji danych SQL to grupowanie i ogółem . W tym przewodniku nauczysz się agregacji danych SQL za pomocą grupowania i sumowania.
Funkcje agregujące SQL
W SQL agregacja to proces operowania lub obliczania zbioru wartości. Celem jest zwrócenie pojedynczej wartości podsumowania. SQL zawiera kilka bardzo zaawansowanych funkcji agregujących, takich jak AVG()
, COUNT()
, SUM()
, MAX()
i MIN()
. Te funkcje z kolei najczęściej znajdują się w instrukcjach SQL, które implementują GROUP BY
klauzula. Jednak te funkcje nie muszą być powiązane z tą klauzulą.
Uwaga O ile nie wspomniano inaczej, wszystkie polecenia baz danych przedstawione w tym przewodniku działają dobrze zarówno na MySQL i PostgreSQL .
Ten przewodnik wykorzystuje CourseTaken
tabela, aby zademonstrować funkcje agregujące. Z wiersza poleceń utwórz CourseTaken
tabela.
CREATE TABLE CourseTaken (
SSNumber CHAR(9) NOT NULL,
CourseId CHAR(6) NOT NULL,
NumericGrade INT NOT NULL,
YearTaken INT NOT NULL
);
CourseTaken
tabela zawiera następujące dane w kolumnie:
SSNnumer | Identyfikator kursu | NumericGrade | Rok podjęty |
---|---|---|---|
1111111111 | CSC101 | 98 | 2021 |
1111111111 | ENG101 | 95 | 2022 |
222222222 | CSC101 | 100 | 2022 |
222222222 | EEE101 | 75 | 2022 |
333333333 | POL101 | 92 | 2021 |
333333333 | CSC101 | 84 | 2022 |
Użyj funkcji agregującej SQL do obliczenia pojedynczej wartości podsumowania
Poniższe sekcje zawierają różne przykłady użycia funkcji agregujących do zwrócenia pojedynczej wartości podsumowania. Wszystkie przykłady używają CourseTaken
tabela, która została utworzona w sekcji „Funkcje agregujące” przewodnika.
Przykład 1:
W tym przykładzie funkcja agregująca zwraca średnią liczbową ocen wszystkich uczniów biorących udział w kursie CSC101
w roku 2022.
SELECT AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101
AND YearTaken = 2022;
SQL zwraca następującą średnią ocenę:
Avg Grade
---------
92
Przykład 2:
Poniższa funkcja agregująca zwraca liczbę studentów, którzy wzięli udział w kursie CSC101
przed rokiem 2022.
SELECT COUNT(SSNumber) AS 'Student Count'
FROM CourseTaken
WHERE CourseId = 'CSC101'
AND YearTaken < 2022;
Zwracana jest następująca liczba:
Student Count
---------
1
Przykład 3:
W tym przykładzie funkcja agregująca jest używana do uzyskania maksymalnej oceny liczbowej zarejestrowanej w dowolnym roku przez Studenta biorącego CSC101
.
SELECT MAX(NumericGrade) AS 'Max Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101'
Zwrócona maksymalna ocena jest następująca:
Max Grade
---------
100
Agregacja danych przy użyciu funkcji grupowych
Poniższe przykłady demonstrują użycie GROUP BY
klauzula wykorzystująca dane z CourseTaken
tabela.
Przykład 1:
Poniższy przykład określa średnią ocen każdego ucznia ze wszystkich dotychczasowych kursów. Aby to wykonać, użyj SQL Group By
klauzula do grupowania według Studenta (w tym przypadku SSNumber
kolumna).
SELECT SSNumber, AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
GROUP BY SSNumber
Dane wyjściowe zwracają średnią ocenę każdego ucznia.
+-----------+----------+
| SSNumber | Avg Grade|
+-----------+----------+
| 111111111 | 96.5 |
| 222222222 | 87.5 |
| 333333333 | 88 |
+-----------+----------+
Przykład 2:
Poniższa funkcja agregująca wyszukuje średnią ocenę otrzymaną dla każdego CourseId
w CourseTaken
stół. Aby to zrobić, pogrupuj według CourseId
w ciągu YearTaken
z następującym kodem SQL:
SELECT CourseId AS 'Course', YearTaken AS 'Year',
AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
GROUP BY CourseId, YearTaken
ORDER BY CourseId, YearTaken
Powinieneś zobaczyć następujące wyjście:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| POL101 | 2021 | 92 |
| CSC101 | 2022 | 92 |
| EEE101 | 2022 | 75 |
| ENG101 | 2022 | 95 |
+--------+------+-----------+
Uwaga Powyższy przykład jest nieco bardziej złożony. Grupujesz według dwóch kolumn zamiast jednej (CourseId
w ciąguYearTaken
). Dlatego obliczasz średnią ocenę i grupujesz wedługCSC101
na rok2021
oddzielnie od średniej oceny dlaCSC101
na rok2022
. KursCSC101
na rok2022
jest agregacją dwóch wierszy, podczas gdy wszystkie pozostałe wiersze Grupuj według stanowią agregację jednego wiersza. Dodatkowo z koncepcji Zamawiania (Order By
klauzula) możesz wyświetlić uporządkowane wyniki (posortowane) wedługCourseTaken
w danym roku.
Przykład 3:
Z zapytania SQL w poprzednim przykładzie możesz ograniczyć liczbę operowanych wierszy, dodając WHERE
klauzula do zapytania. Na przykład, aby wygenerować średnią ocen otrzymaną przez uczniów tylko dla CourseId
CSC101
, grupuj według CourseId
w ciągu YearTaken
. Poniższy kod SQL może to osiągnąć:
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
W powyższym kodzie SQL dodajesz warunek (poprzez WHERE
klauzula) przed wykonaniem właściwej agregacji grup (poprzez GROUP BY
klauzula).
Zwracane są następujące dane wyjściowe:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| CSC101 | 2022 | 92 |
+--------+------+-----------+
Przykład 4:
Z zapytania SQL w przykładzie 2 można zastosować warunek przed zwróceniem końcowego wyniku. Aby to osiągnąć, użyj SQL Having
klauzula. Możesz określić średnią ocenę dla każdego CourseId
, gdzie zagregowana średnia ocena jest większa niż 90
. Możesz ponownie pogrupować według CourseId
w ciągu YearTaken
. Poniższy kod SQL może to osiągnąć:
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
Dane wyjściowe są następujące:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| POL101 | 2021 | 92 |
| CSC101 | 2022 | 92 |
| ENG101 | 2022 | 95 |
+--------+------+-----------+
Wiersz dla CourseId
EEE101
nie został zwrócony. Dzieje się tak, ponieważ Having
klauzula odfiltrowana po GROUP BY
klauzula została wykonana (CourseId
EEE101
średnia ocen jest poniżej 90).
Przykład 5:
Opierając się na kodzie SQL z Przykładu 3 i Przykład 4 , możesz tworzyć zapytania agregujące, które wykorzystują zarówno Where
i Having
klauzula. Na przykład możesz określić kursy, które odbyły się w 2021
, gdzie średnia ocen z tych kursów była wyższa niż 93
. Tutaj Where
klauzula odfiltrowuje wyniki przed Group By
wykonywana jest agregacja danych, a Having
klauzula odfiltrowuje wyniki zwrócone po Group By
wykonywana jest agregacja danych. Poniższy kod SQL może to osiągnąć:
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
Zwrócone dane wyjściowe są następujące:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
+--------+------+-----------+
Przykład 6:
Możesz policzyć liczbę wierszy powiązanych z każdym Group By
agregacja w zapytaniu. Bazując na poprzednim przykładowym kodzie SQL, możesz wygenerować średnią ocenę otrzymaną przez Students
tylko dla CourseId
CSC101
, pogrupowane według CourseId
w ciągu YearTaken
. W kodzie należy podać liczbę uczniów (liczbę) związaną z każdą grupą. Poniższy kod SQL może to osiągnąć:
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
Count(SSNumber)
w SELECT
klauzula mogła zostać określona jako Count(*)
. Różnica między tymi dwiema składniami polega na tym, że Count(*)
zawiera wiersze, które mają NULL
również w nich wartości. Zgodnie z CourseTaken
definicja tabeli powyżej, wszystkie kolumny w CourseTaken
tabela musi zawierać wartości inne niż null (NOT NULL
zapewnia to atrybut). Count(SSNumber)
i Count(*)
byłoby funkcjonalnie równoważne w tym przykładzie.
Zwracane są następujące dane wyjściowe:
+--------+------+-----------+-------+
| Course | Year | Avg Grade | Count |
+--------+------+-----------+-------+
| CSC101 | 2021 | 98 | 1 |
| CSC101 | 2022 | 92 | 2 |
+--------+------+-----------+-------+
Wniosek
Ten przewodnik zawiera elementy konstrukcyjne dla zaawansowanych operacji agregacji danych SQL do grupowania i sumowania. Jak wspomniano, możesz ograniczyć wartości, które stają się częścią tych grup, używając Where
klauzula w zapytaniach przed wykonaniem agregacji. Możesz odfiltrować wiersze zgrupowanych wyników (po wykonaniu agregacji) za pomocą Having
klauzula w zapytaniach SQL.