Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wprowadzenie do grupowania i sumowania SQL

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ągu YearTaken ). Dlatego obliczasz średnią ocenę i grupujesz według CSC101 na rok 2021 oddzielnie od średniej oceny dla CSC101 na rok 2022 . Kurs CSC101 na rok 2022 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ług CourseTaken 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać miesiąc z daty w MySQL?

  2. Jak całkowicie usunąć MySQL z Ubuntu?

  3. Jak pobrać dane JSON z MySQL?

  4. Jak sprawić, by mysqli rzucał wyjątki za pomocą MYSQLI_REPORT_STRICT?

  5. Jak połączyć się z bazą danych za pomocą klienta Workbench MySQL