Един от най-мощните аспекти на SQL е способността за извършване на агрегиране на данни. Два от най-мощните инструмента за агрегиране на SQL данни са групирането и общо . В това ръководство вие научавате агрегирането на SQL данни чрез групиране и сумиране.
SQL агрегатни функции
В SQL агрегирането е процесът на опериране или изчисляване на набор от стойности. Целта е да се върне единична обобщена стойност. SQL включва няколко много мощни агрегатни функции като AVG()
, COUNT()
, SUM()
, MAX()
и MIN()
. Тези функции от своя страна най-често се намират в SQL изрази, които имплементират GROUP BY
клауза. Тези функции обаче не е необходимо да се свързват с тази клауза.
Забележка Освен ако не е посочено друго, всички демонстрирани в това ръководство команди на базата данни работят добре и на MySQL и PostgreSQL .
Това ръководство използва CourseTaken
таблица за демонстриране на агрегатни функции. От командния ред създайте CourseTaken
таблица.
CREATE TABLE CourseTaken (
SSNumber CHAR(9) NOT NULL,
CourseId CHAR(6) NOT NULL,
NumericGrade INT NOT NULL,
YearTaken INT NOT NULL
);
CourseTaken
таблицата съдържа следните данни в колоната:
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 |
Използвайте SQL агрегатна функция за изчисляване на единична обобщена стойност
Разделите по-долу предоставят различни примери, които използват агрегатни функции за връщане на една обобщена стойност. Всички примери използват CourseTaken
таблица, която е създадена в раздела за агрегатни функции на ръководството.
Пример 1:
В този пример агрегатната функция връща числова средна оценка за всички студенти, които вземат курс CSC101
през 2022 г.
SELECT AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101
AND YearTaken = 2022;
SQL връща следната средна оценка:
Avg Grade
---------
92
Пример 2:
Обобщаващата функция по-долу връща броя на студентите, преминали курс CSC101
преди 2022 г.
SELECT COUNT(SSNumber) AS 'Student Count'
FROM CourseTaken
WHERE CourseId = 'CSC101'
AND YearTaken < 2022;
Връща се следният брой:
Student Count
---------
1
Пример 3:
В този пример се използва обобщена функция за получаване на максималната числова оценка, записана през която и да е година от студент, който приема CSC101
.
SELECT MAX(NumericGrade) AS 'Max Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101'
Върнатата максимална оценка е следната:
Max Grade
---------
100
Обобщени данни с помощта на групови функции
Следните примери демонстрират използването на GROUP BY
клауза, използваща данните от CourseTaken
таблица.
Пример 1:
Примерът по-долу определя средната оценка за всеки студент за всички курсове, които са преминали до момента. За да изпълните това, използвайте SQL Group By
клауза за групиране от ученик (в този случай SSNumber
колона).
SELECT SSNumber, AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
GROUP BY SSNumber
Резултатът връща средната оценка за всеки ученик.
+-----------+----------+
| SSNumber | Avg Grade|
+-----------+----------+
| 111111111 | 96.5 |
| 222222222 | 87.5 |
| 333333333 | 88 |
+-----------+----------+
Пример 2:
Обобщаващата функция по-долу намира средната оценка, получена за всеки CourseId
в CourseTaken
маса. За да направите това, групирайте по CourseId
в рамките на YearTaken
със следния SQL код:
SELECT CourseId AS 'Course', YearTaken AS 'Year',
AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
GROUP BY CourseId, YearTaken
ORDER BY CourseId, YearTaken
Трябва да видите следния изход:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| POL101 | 2021 | 92 |
| CSC101 | 2022 | 92 |
| EEE101 | 2022 | 75 |
| ENG101 | 2022 | 95 |
+--------+------+-----------+
Забележка Примерът по-горе е малко по-сложен. Групирате по две колони вместо по една (CourseId
в рамките наYear
). Следователно изчислявате средната оценка и групирате поCSC101
за годината2021
отделно от средната оценка заCSC101
за годината2022
. КурсътCSC101
за година2022
е агрегиране на два реда, докато всички останали редове Group By са сбор от един ред. Освен това от концепцията за Поръчка (Order By
клауза) можете да покажете подредени резултати (сортирани) поCourse
в рамките на дадена година.
Пример 3:
От SQL заявката в предишния пример можете да ограничите броя на редовете, с които работите, като добавите WHERE
клауза към заявката. Например, за генериране на средната оценка, получена от студентите само за CourseId
CSC101
, групирайте по CourseId
в рамките на YearTaken
. Следният SQL код може да постигне това:
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
В горния SQL код добавяте условие (чрез WHERE
клауза), преди да се извърши действителното групово агрегиране (чрез GROUP BY
клауза).
Връща се следният изход:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| CSC101 | 2022 | 92 |
+--------+------+-----------+
Пример 4:
От SQL заявката в Пример 2 можете да приложите условие, преди да бъде върнат крайният резултат. За да постигнете това, използвайте SQL Having
клауза. Можете да определите средната оценка за всеки CourseId
, където обобщената средна оценка е по-голяма от 90
. Можете отново да групирате по CourseId
в рамките на YearTaken
. Следният SQL код може да постигне това:
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
Резултатът е следният:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| POL101 | 2021 | 92 |
| CSC101 | 2022 | 92 |
| ENG101 | 2022 | 95 |
+--------+------+-----------+
Редът за CourseId
EEE101
не е върната. Това е така, защото Having
клауза го филтрира след GROUP BY
клаузата беше изпълнена (CourseId
EEE101
средната оценка на е под 90).
Пример 5:
Въз основа на SQL кода от Пример 3 и Пример 4 , можете да създавате заявки за агрегиране, които използват и двете Where
и Having
клауза. Например, можете да определите курсовете, които са преминали през 2021
, където средната оценка за тези взети курсове е по-голяма от 93
. Тук Where
клаузата филтрира резултатите преди Group By
се извършва агрегиране на данни и Having
клаузата филтрира резултатите, върнати след Group By
се извършва агрегиране на данни. Следният SQL код може да постигне това:
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
Върнатият резултат е следният:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
+--------+------+-----------+
Пример 6:
Можете да преброите броя на редовете, свързани с всеки Group By
агрегиране в заявка. Въз основа на предишния примерен SQL код, можете да генерирате средната оценка, получена от Students
само за CourseId
CSC101
, групирани по CourseId
в рамките на YearTaken
. Кодът трябва да предоставя броя на учениците (брой), свързани с всяка група. Следният SQL код може да постигне това:
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)
в SELECT
клаузата може да е посочена като Count(*)
. Разликата между двата синтаксиса е, че Count(*)
включва редове, които имат NULL
ценности и в тях. Съгласно CourseTaken
дефиниция на таблицата по-горе, всички колони в CourseTaken
таблицата трябва да съдържа стойности, различни от нула (NOT NULL
атрибут гарантира това). Count(SSNumber)
и Count(*)
ще бъде функционално еквивалентен в този пример.
Връща се следният изход:
+--------+------+-----------+-------+
| Course | Year | Avg Grade | Count |
+--------+------+-----------+-------+
| CSC101 | 2021 | 98 | 1 |
| CSC101 | 2022 | 92 | 2 |
+--------+------+-----------+-------+
Заключение
Това ръководство предоставя градивните елементи за мощните операции на SQL за агрегиране на данни за групиране и сумиране. Както беше отбелязано, можете да ограничите стойностите, които стават част от тези групи, като използвате Where
клауза в заявките, преди да се извърши агрегирането. Можете да филтрирате редове с групирани резултати (след като се извърши агрегирането), като използвате Having
клауза в SQL заявките.