Речення SQL GROUP BY і HAVING із прикладами
Що таке SQL Group by Clause?
Речення GROUP BY — це команда SQL, яка використовується для групувати рядки, які мають однакові значення. Речення GROUP BY використовується в операторі SELECT. За бажанням він використовується в поєднанні з агрегатними функціями для створення зведених звітів із бази даних.
Ось що воно робить, узагальнення даних з бази даних.
Запити, які містять речення GROUP BY, називаються згрупованими запитами та повертають лише один рядок для кожного згрупованого елемента.
Синтаксис SQL GROUP BY
Тепер, коли ми знаємо, що таке речення SQL GROUP BY, давайте розглянемо синтаксис для базового групування за запитом.
SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];
ТУТ
- «Інструкції SELECT…» — це стандартний запит команди SQL SELECT.
- "GROUP BY ім'я_стовпця1” — це пропозиція, яка виконує групування на основі column_name1.
- “[,column_name2,…]” є необов’язковим; представляє інші назви стовпців, якщо групування виконується для кількох стовпців.
- «[Умова НАЯВНОСТІ]» є необов’язковим; він використовується для обмеження рядків, на які впливає речення GROUP BY. Це схоже на ДЕ ЗАКЛАД.
Групування за допомогою a Одинарна колона
Щоб допомогти зрозуміти ефект пропозиції SQL Group By, давайте виконаємо простий запит, який повертає всі гендерні записи з таблиці members.
SELECT `gender` FROM `members` ;
gender |
---|
Female |
Female |
Male |
Female |
Male |
Male |
Male |
Male |
Male |
Припустімо, ми хочемо отримати унікальні значення для статей. Ми можемо використати наступний запит –
SELECT `gender` FROM `members` GROUP BY `gender`;
Виконання наведеного вище сценарію в MySQL верстак проти Myflixdb дає нам такі результати.
gender |
---|
Female |
Male |
Зверніть увагу, що було повернуто лише два результати. Це пов’язано з тим, що ми маємо лише два типи статі – чоловічу та жіночу. Речення GROUP BY у SQL згрупувало всі «чоловічі» члени разом і повернуло для нього лише один рядок. Те саме було зроблено з учасницями групи «Жінки».
Групування за допомогою кілька стовпців
Припустімо, що ми хочемо отримати список категорій_фільмів і відповідних років, коли вони були випущені.
Давайте поспостерігаємо за виходом цього простого запиту
SELECT `category_id`,`year_released` FROM `movies` ;
category_id | year_released |
---|---|
1 | 2011 |
2 | 2008 |
NULL | 2008 |
NULL | 2010 |
8 | 2007 |
6 | 2007 |
6 | 2007 |
8 | 2005 |
NULL | 2012 |
7 | 1920 |
8 | NULL |
8 | 1920 |
Наведений вище результат має багато дублікатів.
Давайте виконаємо той самий запит за допомогою group by у SQL –
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
Виконання наведеного вище сценарію в MySQL workbench проти myflixdb дає нам такі результати, наведені нижче.
category_id | year_released |
---|---|
NULL | 2008 |
NULL | 2010 |
NULL | 2012 |
1 | 2011 |
2 | 2008 |
6 | 2007 |
7 | 1920 |
8 | 1920 |
8 | 2005 |
8 | 2007 |
Речення GROUP BY працює як з ідентифікатором категорії, так і з роком, випущеним для ідентифікації створеного рядків у нашому прикладі вище.
Якщо ідентифікатор категорії той самий, але рік випуску інший, тоді рядок розглядається як унікальний. Якщо ідентифікатор категорії та рік випуску однакові для кількох рядків, тоді він вважається дублікатом і лише одним рядком показано.
Групування і сукупність функцій
Припустімо, нам потрібна загальна кількість чоловіків і жінок у нашій базі даних. Для цього ми можемо використати наведений нижче сценарій.
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
Виконання наведеного вище сценарію в MySQL workbench проти myflixdb дає нам такі результати.
gender | COUNT('membership_number') |
---|---|
Female | 3 |
Male | 5 |
Наведені нижче результати згруповано за кожним опублікованим унікальним значенням статі, а кількість згрупованих рядків підраховується за допомогою агрегатної функції COUNT.
Обмеження результатів запиту за допомогою ВІД пункт
Не завжди ми хочемо виконувати групування всіх даних у даній таблиці. Буватимуть випадки, коли ми захочемо обмежити наші результати певним критерієм. У таких випадках ми можемо використовувати речення HAVING
Припустімо, ми хочемо знати всі роки випуску фільму з ідентифікатором категорії 8. Щоб отримати результати, ми використаємо наступний сценарій.
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
Виконання наведеного вище сценарію в MySQL Workbench проти Myflixdb дає нам такі результати, наведені нижче.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
9 | Honey mooners | John Schultz | 2005 | 8 |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
Зауважте, що лише фільми з ідентифікатором категорії 8 підпадають під дію пункту GROUP BY.
Підсумки
- Речення GROUP BY SQL використовується для групування рядків з однаковими значеннями.
- Речення GROUP BY використовується разом із Оператор SQL SELECT.
- Інструкція SELECT, яка використовується в реченні GROUP BY, може використовуватися лише для імен стовпців, агрегатних функцій, констант і виразів.
- Речення SQL Having використовується для обмеження результатів, які повертає речення GROUP BY.
- Речення MYSQL GROUP BY використовується для збору даних із кількох записів і повертає запис, набір одного чи кількох стовпців.