Klauzula SQL GROUP BY i HAVING z przykładami
Co to jest grupa SQL według klauzuli?
Klauzula GROUP BY jest używanym poleceniem SQL grupuj wiersze o tych samych wartościach. Klauzula GROUP BY jest używana w instrukcji SELECT. Opcjonalnie jest używany w połączeniu z funkcjami agregującymi w celu tworzenia raportów podsumowujących z bazy danych.
To właśnie robi Podsumowanie danych z bazy danych.
Zapytania zawierające klauzulę GROUP BY nazywane są zapytaniami zgrupowanymi i zwracają tylko jeden wiersz dla każdego zgrupowanego elementu.
Składnia SQL GROUP BY
Teraz, gdy wiemy, czym jest klauzula SQL GROUP BY, przyjrzyjmy się składni podstawowej grupy według zapytania.
SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];
TUTAJ
- „Instrukcje SELECT…” to standardowe zapytanie polecenia SQL SELECT.
- "GRUPUJ WEDŁUG nazwa_kolumny1” to klauzula wykonująca grupowanie na podstawie nazwa_kolumny1.
- „[,nazwa_kolumny2,…]” jest opcjonalne; reprezentuje inne nazwy kolumn, gdy grupowanie odbywa się na więcej niż jednej kolumnie.
- „[Warunek POSIADAM]” jest opcjonalny; służy do ograniczenia wierszy, na które wpływa klauzula GROUP BY. Jest podobny do klauzula GDZIE.
Grupowanie za pomocą a pojedyncza kolumna
Aby pomóc zrozumieć działanie klauzuli SQL Group By, wykonajmy proste zapytanie, które zwróci wszystkie wpisy dotyczące płci z tabeli członków.
SELECT `gender` FROM `members` ;
gender |
---|
Female |
Female |
Male |
Female |
Male |
Male |
Male |
Male |
Male |
Załóżmy, że chcemy uzyskać unikalne wartości dla płci. Możemy użyć następującego zapytania –
SELECT `gender` FROM `members` GROUP BY `gender`;
Wykonanie powyższego skryptu w MySQL Workbench w stosunku do Myflixdb daje nam następujące wyniki.
gender |
---|
Female |
Male |
Uwaga: zwrócone zostały tylko dwa wyniki. Dzieje się tak dlatego, że mamy tylko dwa typy płci: męski i żeński. Klauzula GROUP BY w języku SQL grupowała wszystkich członków „Male” i zwracała dla nich tylko jeden wiersz. To samo uczyniło z „żeńskimi” członkami.
Grupowanie za pomocą wiele kolumn
Załóżmy, że chcemy uzyskać listę filmów kategoria_id i odpowiadające im lata, w których zostały wydane.
Przyjrzyjmy się wynikom tego prostego zapytania
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 |
Powyższy wynik ma wiele duplikatów.
Wykonajmy to samo zapytanie, używając group by w SQL –
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
Wykonanie powyższego skryptu w MySQL workbench z myflixdb daje nam następujące wyniki, pokazane poniżej.
category_id | year_released |
---|---|
NULL | 2008 |
NULL | 2010 |
NULL | 2012 |
1 | 2011 |
2 | 2008 |
6 | 2007 |
7 | 1920 |
8 | 1920 |
8 | 2005 |
8 | 2007 |
Klauzula GROUP BY działa zarówno na identyfikatorze kategorii, jak i na roku wydania, aby zidentyfikować wyjątkowy wiersze w naszym powyższym przykładzie.
Jeśli identyfikator kategorii i wydany rok są takie same, ale wydany rok jest inny, wiersz jest traktowany jako unikalny. Jeśli identyfikator kategorii i wydany rok są takie same w więcej niż jednym wierszu, wówczas wiersz jest uważany za duplikat i występuje tylko w jednym wierszu jest pokazane.
Grupowanie i funkcje agregujące
Załóżmy, że chcemy mieć całkowitą liczbę mężczyzn i kobiet w naszej bazie danych. Możemy użyć poniższego skryptu, aby to zrobić.
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
Wykonanie powyższego skryptu w MySQL workbench z myflixdb daje nam następujące wyniki.
gender | COUNT('membership_number') |
---|---|
Female | 3 |
Male | 5 |
Wyniki pokazane poniżej są pogrupowane według każdej opublikowanej unikalnej wartości płci, a liczba zgrupowanych wierszy jest zliczana za pomocą funkcji agregującej COUNT.
Ograniczanie wyników zapytań za pomocą metody MAJĄCY klauzula
Nie zawsze będzie tak, że będziemy chcieli grupować wszystkie dane w danej tabeli. Będą chwile, kiedy będziemy chcieli ograniczyć nasze wyniki do określonych kryteriów. W takich przypadkach możemy zastosować klauzulę HAVING
Załóżmy, że chcemy poznać wszystkie lata wydania filmu o identyfikatorze kategorii 8. W celu uzyskania oczekiwanych wyników użylibyśmy następującego skryptu.
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
Wykonanie powyższego skryptu w MySQL workbench z Myflixdb daje nam następujące wyniki, pokazane poniżej.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
9 | Honey mooners | John Schultz | 2005 | 8 |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
Uwaga: klauzula GROUP BY dotyczy wyłącznie filmów o identyfikatorze kategorii 8.
Podsumowanie
- Klauzula GROUP BY SQL służy do grupowania wierszy o tych samych wartościach.
- Klauzula GROUP BY jest używana razem z Instrukcja SQL SELECT.
- Instrukcja SELECT użyta w klauzuli GROUP BY może zawierać wyłącznie nazwy kolumn, funkcje agregujące, stałe i wyrażenia.
- Klauzula SQL Have służy do ograniczania wyników zwracanych przez klauzulę GROUP BY.
- Klauzula MYSQL GROUP BY służy do zbierania danych z wielu rekordów i zwracania zestawu rekordów według jednej lub większej liczby kolumn.