Един от най-мощните аспекти на 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 заявките.