Co to jest SQL Group by Clause?
Klauzula GROUP BY to polecenie SQL używane do grupowania wierszy 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 do tworzenia raportów podsumowujących z bazy danych.
To właśnie robi, podsumowując dane 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, co to jest klauzula SQL GROUP BY, spójrzmy na składnię dla podstawowej grupy według zapytania.
SELECT statements… GROUP BY column_name1[,column_name2,… ] [HAVING condition];
TUTAJ
- „Instrukcje SELECT…” to standardowe zapytanie polecenia SQL SELECT.
- „ GROUP BY 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.
- „[MAJĄC warunek]” jest opcjonalne; służy do ograniczenia wierszy, na które ma wpływ klauzula GROUP BY. Jest podobny do klauzuli WHERE.
Grupowanie za pomocą pojedynczej kolumny
Aby lepiej zrozumieć wpływ klauzuli SQL Group By, wykonajmy proste zapytanie, które zwróci wszystkie wpisy dotyczące płci z tabeli elementów członkowskich.
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 środowisku roboczym MySQL na bazie Myflixdb daje następujące wyniki.
gender |
---|
Female |
Male |
Uwaga: zwrócono tylko dwa wyniki. Dzieje się tak, ponieważ mamy tylko dwa typy płci: męską i żeńską. Klauzula GROUP BY w SQL zgrupowała razem wszystkich członków „męskich” i zwróciła tylko jeden wiersz. To samo zrobiło z członkami „Żeńskimi”.
Grupowanie przy użyciu wielu kolumn
Załóżmy, że chcemy uzyskać listę filmów category_id i odpowiadających im lat, w których zostały wydane.
Przyjrzyjmy się wynikowi 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 polecenia group by w SQL -
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
Wykonanie powyższego skryptu w środowisku MySQL na 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 wydanym roku, aby zidentyfikować unikalne wiersze w powyższym przykładzie.
Jeśli identyfikator kategorii jest taki sam, ale wydany rok jest inny, wiersz jest traktowany jako niepowtarzalny.Jeśli identyfikator kategorii i wydany rok są takie same dla więcej niż jednego wiersza, wówczas jest uważany za duplikat i tylko jeden wiersz jest pokazane.
Funkcje grupujące i agregujące
Załóżmy, że chcemy, aby w naszej bazie danych znajdowała się całkowita liczba samców i samic. W tym celu możemy użyć poniższego skryptu.
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
Wykonanie powyższego skryptu w środowisku roboczym MySQL na myflixdb daje 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 zapytania za pomocą klauzuli HAVING
Nie zawsze będziemy chcieli grupować wszystkie dane w danej tabeli. Będą chwile, kiedy będziemy chcieli zawęzić nasze wyniki do określonych kryteriów. W takich przypadkach możemy skorzystać z klauzuli HAVING
Załóżmy, że chcielibyśmy poznać wszystkie lata premiery filmu o identyfikatorze 8. Użylibyśmy następującego skryptu, aby osiągnąć nasze wyniki.
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
Wykonanie powyższego skryptu w środowisku MySQL na 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 tylko 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 instrukcją SQL SELECT.
- Instrukcja SELECT użyta w klauzuli GROUP BY może zawierać tylko nazwy kolumn, funkcje agregujące, stałe i wyrażenia.
- Klauzula SQL having jest używana do ograniczenia 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 przez jedną lub więcej kolumn.