Duża moc relacyjnych baz danych pochodzi z filtrowania danych i łączenia tabel. Dlatego w pierwszej kolejności reprezentujemy te relacje. Jednak nowoczesne systemy baz danych zapewniają inną cenną technikę: grupowanie.
Grupowanie umożliwia wyodrębnienie informacji podsumowujących z bazy danych. Pozwala łączyć wyniki w celu tworzenia przydatnych danych statystycznych. Grupowanie pozwala uniknąć pisania kodu dla typowych przypadków, takich jak uśrednianie list liczb. I może przyczynić się do powstania bardziej wydajnych systemów.
Co robi klauzula GROUP BY?
GROUP BY, jak sama nazwa wskazuje, grupuje się w mniejszy zbiór. Wyniki składają się z jednego wiersza dla każdej odrębnej wartości w zgrupowanej kolumnie. Możemy pokazać jego użycie, patrząc na przykładowe dane z wierszami, które mają wspólne wartości.
Poniżej znajduje się bardzo prosta baza danych z dwiema tabelami reprezentującymi albumy płyt. Możesz założyć taką bazę danych przez napisanie podstawowego schematu dla wybranego systemu baz danych. Plik
albumy tabela ma dziewięć wierszy z kluczem podstawowym ID kolumna i kolumny z nazwiskiem, wykonawcą, rokiem wydania i sprzedażą:++++++
| id | nazwa | Artist_id | release_year | sprzedaż |
++++++
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | Ciemna strona księżyca | 2 | 1973 | 24 |
| 3 | Plotki | 3 | 1977 | 28 |
| 4 | Nieważne | 4 | 1991 | 17 |
| 5 | Zwierzęta | 2 | 1977 | 6 |
| 6 | Żegnaj Yellow Brick Road | 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
| 9 | Nietoperz z piekła rodem | 7 | 1977 | 28 |
++++++
Plik artystów stół jest jeszcze prostszy. Ma siedem wierszy z kolumnami id i nazwa:
+++
| id | nazwa |
+++
| 1 | The Beatles |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Nirvana |
| 5 | Elton John |
| 6 | Adele |
| 7 | Pieczeń Mięsna |
+++
Możesz zrozumieć różne aspekty GROUP BY za pomocą prostego zestawu danych, takiego jak ten. Oczywiście rzeczywisty zbiór danych miałby wiele, wiele więcej wierszy, ale zasady pozostają takie same.
Grupowanie według pojedynczej kolumny
Powiedzmy, że chcemy się dowiedzieć, ile albumów mamy dla każdego wykonawcy. Zacznij od typowego WYBIERZ zapytanie, aby pobrać kolumnę artist_id:
SELECT artist_id FROM albumów
Spowoduje to zwrócenie wszystkich dziewięciu wierszy zgodnie z oczekiwaniami:
++
| Artist_id |
++
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 5 |
| 6 |
| 6 |
| 7 |
++
Aby pogrupować wyniki według artysty, dołącz frazę GROUP BY artist_id:
SELECT artist_id FROM albums GROUP BY artist_id
Co daje następujące wyniki:
++
| Artist_id |
++
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
++
W zestawie wyników jest siedem wierszy, pomniejszonych z łącznej liczby dziewięciu w albumy stół. Każdy wyjątkowy Artist_id ma jeden wiersz. Wreszcie, aby uzyskać rzeczywiste liczby, dodaj LICZYĆ(*) do wybranych kolumn:
SELECT Artist_id, COUNT (*)
Z albumów
GROUP BY artist_id
+++
| Artist_id | LICZBA (*) |
+++
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+++
Wyniki grupują dwie pary rzędów dla artystów z identyfikatorami 2 i 6. Każdy ma dwa albumy w naszej bazie danych.
Związane z: The Essential SQL Commands Cheat Sheet for Beginners
Jak uzyskać dostęp do zgrupowanych danych za pomocą funkcji agregacji
Mogłeś użyć LICZYĆ funkcji wcześniej, szczególnie w LICZYĆ(*) forma, jak widać powyżej. Pobiera liczbę wyników w zestawie. Możesz go użyć, aby uzyskać całkowitą liczbę rekordów w tabeli:
WYBIERZ LICZBĘ (*) Z albumów
++
| LICZBA (*) |
++
| 9 |
++
COUNT to funkcja agregująca. Termin ten odnosi się do funkcji, które tłumaczą wartości z wielu wierszy na jedną wartość. Są często używane w połączeniu z instrukcją GROUP BY.
Zamiast tylko liczyć liczbę wierszy, możemy zastosować funkcję agregującą do zgrupowanych wartości:
SELECT Artist_id, SUM (sprzedaż)
Z albumów
GROUP BY artist_id
+++
| Artist_id | SUMA (sprzedaż) |
+++
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+++
Łączna sprzedaż pokazana powyżej dla artystów 2 i 6 to suma sprzedaży ich wielu albumów:
SELECT artist_id, sales
Z albumów
WHERE artist_id IN (2, 6)
+++
| Artist_id | sprzedaż |
+++
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+++
Grupowanie według wielu kolumn
Możesz grupować według więcej niż jednej kolumny. Wystarczy dołączyć wiele kolumn lub wyrażeń oddzielonych przecinkami. Wyniki zostaną pogrupowane według kombinacji tych kolumn.
SELECT release_year, sale, count (*)
Z albumów
GROUP BY release_year, sales
Zwykle daje to więcej wyników niż grupowanie według jednej kolumny:
++++
| release_year | sprzedaż | liczyć (*) |
++++
| 1969 | 14 | 1 |
| 1973 | 24 | 1 |
| 1977 | 28 | 2 |
| 1991 | 17 | 1 |
| 1977 | 6 | 1 |
| 1973 | 8 | 1 |
| 2011 | 25 | 1 |
| 2015 | 22 | 1 |
++++
Zauważ, że w naszym małym przykładzie tylko dwa albumy mają ten sam rok wydania i liczbę sprzedaży (28 w 1977).
Przydatne funkcje agregujące
Oprócz COUNT kilka funkcji dobrze współpracuje z GROUP. Każda funkcja zwraca wartość na podstawie rekordów należących do każdej grupy wynikowej.
- COUNT () zwraca całkowitą liczbę pasujących rekordów.
- SUMA () zwraca sumę wszystkich sumowanych wartości w danej kolumnie.
- MIN () zwraca najmniejszą wartość w danej kolumnie.
- MAX () zwraca największą wartość w danej kolumnie.
- AVG () zwraca średnią średnią. Jest to odpowiednik SUMA () / LICZBA ().
Możesz także używać tych funkcji bez klauzuli GROUP:
WYBIERZ AVG (sprzedaż) z albumów
++
| AVG (sprzedaż) |
++
| 19.1111 |
++
Używanie GROUP BY z klauzulą WHERE
Podobnie jak w przypadku zwykłego SELECT, nadal możesz użyć WHERE do filtrowania zestawu wyników:
SELECT Artist_id, COUNT (*)
Z albumów
GDZIE release_year> 1990
GROUP BY artist_id
+++
| Artist_id | LICZBA (*) |
+++
| 4 | 1 |
| 6 | 2 |
+++
Teraz masz tylko te albumy wydane po 1990 roku, pogrupowane według wykonawców. Możesz także użyć złączenia z klauzulą WHERE, niezależnie od GROUP BY:
SELECT r.name, COUNT (*) AS albumy
Z albumów l, artyści r
GDZIE artist_id = r.id
AND release_year> 1990
GROUP BY artist_id
+++
| nazwa | albumy |
+++
| Nirvana | 1 |
| Adele | 2 |
+++
Pamiętaj jednak, że jeśli spróbujesz filtrować na podstawie zagregowanej kolumny:
SELECT r.name, COUNT (*) AS albumy
Z albumów l, artyści r
GDZIE artist_id = r.id
ORAZ albumy> 2
GROUP BY artist_id;
Pojawi się błąd:
BŁĄD 1054 (42S22): Nieznana kolumna „albumy” w „klauzuli gdzie”
Kolumny oparte na danych zagregowanych nie są dostępne dla klauzuli WHERE.
Korzystanie z klauzuli HAVING
Jak więc filtrować zestaw wyników po przeprowadzeniu grupowania? Plik MAJĄCY klauzula dotyczy tej potrzeby:
SELECT r.name, COUNT (*) AS albumy
Z albumów l, artyści r
GDZIE artist_id = r.id
GROUP BY artist_id
MAJĄC albumy> 1;
Zauważ, że klauzula HAVING znajduje się po GROUP BY. W przeciwnym razie jest to w zasadzie prosta zamiana GDZIE na POSIADAJĄC. Wyniki są następujące:
+++
| nazwa | albumy |
+++
| Pink Floyd | 2 |
| Adele | 2 |
+++
Nadal możesz używać warunku WHERE, aby filtrować wyniki przed grupowaniem. Będzie działać razem z klauzulą HAVING do filtrowania po zgrupowaniu:
SELECT r.name, COUNT (*) AS albumy
Z albumów l, artyści r
GDZIE artist_id = r.id
AND release_year> 1990
GROUP BY artist_id
MAJĄC albumy> 1;
Tylko jeden artysta w naszej bazie wydał więcej niż jeden album po 1990 roku:
+++
| nazwa | albumy |
+++
| Adele | 2 |
+++
Łączenie wyników z GROUP BY
Instrukcja GROUP BY jest niezwykle użyteczną częścią języka SQL. Może dostarczać podsumowania danych, na przykład dla strony ze spisem treści. To doskonała alternatywa dla pobierania dużych ilości danych. Baza danych dobrze radzi sobie z tym dodatkowym obciążeniem, ponieważ sama konstrukcja sprawia, że jest optymalna do pracy.
Kiedy zrozumiesz grupowanie i łączenie wielu tabel, będziesz w stanie wykorzystać większość mocy relacyjnej bazy danych.
Dowiedz się, jak używać sprzężeń SQL, aby usprawnić zapytania, zaoszczędzić czas i sprawić, że poczujesz się jak zaawansowany użytkownik SQL.
- Programowanie
- SQL
Bobby jest entuzjastą technologii, który przez prawie dwie dekady pracował jako programista. Pasjonuje się grami, pracuje jako redaktor recenzji w Switch Player Magazine i jest pochłonięty wszystkimi aspektami publikacji online i tworzenia stron internetowych.
Zapisz się do naszego newslettera
Dołącz do naszego biuletynu, aby otrzymywać wskazówki techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!
Jeszcze jeden krok…!
Potwierdź swój adres e-mail w wiadomości e-mail, którą właśnie wysłaliśmy.