Mysql
 sql >> база данни >  >> RDS >> Mysql

Въведение в SQL групиране и сумиране

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JSON_ARRAY_APPEND() – Добавяне на стойности към JSON масив в MySQL

  2. #1055 - Изразът на списъка SELECT не е в клауза GROUP BY и съдържа неагрегирана колона, това е несъвместимо с sql_mode=only_full_group_by

  3. Кое е най-бързо? SELECT SQL_CALC_FOUND_ROWS ОТ `таблица` или SELECT COUNT(*)

  4. Намерете и заменете цялата база данни на mysql

  5. Как мога да възстановя пълните привилегии на root потребителя на MySQL?