Velká část síly relačních databází pochází z filtrování dat a spojování tabulek dohromady. Proto tyto vztahy zastupujeme na prvním místě. Moderní databázové systémy však poskytují další cennou techniku: seskupování.

Seskupení umožňuje extrahovat souhrnné informace z databáze. Umožňuje vám kombinovat výsledky a vytvářet užitečná statistická data. Seskupení vám ušetří psaní kódu pro běžné případy, jako jsou průměrování seznamů čísel. A to může přispět k efektivnějším systémům.

Co dělá klauzule GROUP BY?

GROUP BY, jak název napovídá, seskupuje výsledky do menší sady. Výsledky se skládají z jednoho řádku pro každou odlišnou hodnotu seskupeného sloupce. Můžeme ukázat jeho využití při pohledu na některá ukázková data s řádky, které sdílejí některé běžné hodnoty.

Následuje velmi jednoduchá databáze se dvěma tabulkami představujícími nahrávací alba. Tuto databázi můžete nastavit pomocí psaní základního schématu pro vámi vybraný databázový systém. The alba tabulka má devět řádků s primárním klíčem id sloupec a sloupce pro jméno, umělce, rok vydání a prodej:

instagram viewer
++++++
| id | jméno | artist_id | release_year | prodej |
++++++
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | Temná stránka měsíce 2 | 1973 | 24 |
| 3 | Pověsti | 3 | 1977 | 28 |
| 4 | Nevadí | 4 | 1991 | 17 |
| 5 | Zvířata | 2 | 1977 | 6 |
| 6 | Sbohem žlutá cihlová cesta 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
| 9 | Bat Out of Hell | 7 | 1977 | 28 |
++++++

The umělci tabulka je ještě jednodušší. Má sedm řádků se sloupci id a name:

+++
| id | jméno |
+++
| 1 | The Beatles |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Nirvana |
| 5 | Elton John |
| 6 | Adele |
| 7 | Sekaná |
+++

Rozumíte různým aspektům GROUP BY pouze s jednoduchým souborem dat, jako je tento. Soubor skutečných dat by samozřejmě měl mnohem, mnohem více řádků, ale principy zůstávají stejné.

Seskupení podle jednoho sloupce

Řekněme, že chceme zjistit, kolik alb máme pro každého umělce. Začněte s typickým VYBRAT dotaz na načtení sloupce artist_id:

VYBERTE interpreta_id Z alb

Tím se vrátí všech devět řádků podle očekávání:

++
| artist_id |
++
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 5 |
| 6 |
| 6 |
| 7 |
++

Chcete-li tyto výsledky seskupit podle umělce, připojte frázi GROUP BY artist_id:

VYBERTE interpreta_id FROM alb SKUPINU podle interpreta_id

Který dává následující výsledky:

++
| artist_id |
++
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
++

Ve výsledkové sadě je sedm řádků snížených z celkových devíti v alba stůl. Každý jedinečný artist_id má jeden řádek. Nakonec pro získání skutečných počtů přidejte POČET(*) do vybraných sloupců:

VYBRAT ID umělce, COUNT (*)
Z alb
GROUP BY artist_id
+++
| artist_id | POČET (*) |
+++
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+++

Výsledky seskupují dva páry řádků pro umělce s ID 2 a 6. Každý z nich má v naší databázi dvě alba.

Příbuzný: Základní podváděcí příkazy SQL pro začátečníky

Jak přistupovat ke seskupeným datům pomocí agregované funkce

Možná jste použili POČET funkce dříve, zejména v POČET(*) forma, jak je vidět výše. Načte počet výsledků v sadě. Můžete jej použít k získání celkového počtu záznamů v tabulce:

VYBERTE POČET (*) Z alb
++
| POČET (*) |
++
| 9 |
++

COUNT je agregační funkce. Tento termín označuje funkce, které překládají hodnoty z více řádků do jedné hodnoty. Často se používají ve spojení s příkazem GROUP BY.

Spíše než jen spočítat počet řádků, můžeme použít agregovanou funkci na seskupené hodnoty:

VÝBĚR ID umělce, SUMA (prodeje)
Z alb
GROUP BY artist_id
+++
| artist_id | SUM (prodej) |
+++
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+++

Celkový prodej uvedený výše pro umělce 2 a 6 je kombinovaný prodej jejich více alb:

VÝBĚR ID umělce, tržby
Z alb
WHERE artist_id IN (2, 6)
+++
| artist_id | prodej |
+++
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+++

Seskupení podle více sloupců

Můžete seskupit podle více než jednoho sloupce. Stačí zahrnout více sloupců nebo výrazů oddělených čárkami. Výsledky se seskupí podle kombinace těchto sloupců.

VYBRAT release_year, sales, count (*)
Z alb
GROUP BY release_year, sales

To obvykle vyprodukuje více výsledků než seskupení podle jednoho sloupce:

++++
| release_year | prodej | počet (*) |
++++
| 1969 | 14 | 1 |
| 1973 | 24 | 1 |
| 1977 | 28 | 2 |
| 1991 | 17 | 1 |
| 1977 | 6 | 1 |
| 1973 | 8 | 1 |
| 2011 | 25 | 1 |
| 2015 | 22 | 1 |
++++

Všimněte si, že v našem malém příkladu mají pouze dvě alba stejný rok vydání a počet prodejů (28 v roce 1977).

Užitečné agregační funkce

Kromě funkce COUNT funguje několik funkcí se skupinou GROUP dobře. Každá funkce vrací hodnotu na základě záznamů patřících do každé skupiny výsledků.

  • COUNT () vrací celkový počet odpovídajících záznamů.
  • SUM () vrací součet všech hodnot v daném sloupci sečtených.
  • MIN () vrací nejmenší hodnotu v daném sloupci.
  • MAX () vrací největší hodnotu v daném sloupci.
  • AVG () vrací střední průměr. Je to ekvivalent SUM () / COUNT ().

Můžete také použít tyto funkce bez klauzule GROUP:

VYBERTE AVG (prodej) Z alb
++
| AVG (prodej) |
++
| 19.1111 |
++

Použití GROUP BY s klauzulí WHERE

Stejně jako u normálního příkazu SELECT můžete stále použít WHERE k filtrování sady výsledků:

VYBRAT ID umělce, COUNT (*)
Z alb
KDE release_year> 1990
GROUP BY artist_id
+++
| artist_id | POČET (*) |
+++
| 4 | 1 |
| 6 | 2 |
+++

Nyní máte k dispozici pouze alba vydaná po roce 1990 seskupená podle umělců. Můžete také použít spojení s klauzulí WHERE, nezávisle na GROUP BY:

VYBRAT jméno r., COUNT (*) JAKO alba
Z alba l, umělci r
WHERE artist_id = r.id
AND release_year> 1990
GROUP BY artist_id
+++
| jméno | alba |
+++
| Nirvana | 1 |
| Adele | 2 |
+++

Upozorňujeme však, že pokud se pokusíte filtrovat na základě agregovaného sloupce:

VYBRAT jméno r., COUNT (*) JAKO alba
Z alba l, umělci r
WHERE artist_id = r.id
A alba> 2
GROUP BY artist_id;

Zobrazí se chyba:

ERROR 1054 (42S22): Unknown column 'alba' in 'where clause'

Sloupce založené na agregovaných datech nejsou klauzuli WHERE k dispozici.

Použití klauzule HAVING

Jak tedy vyfiltrujete sadu výsledků po seskupení? The MÁM doložka se zabývá touto potřebou:

VYBRAT jméno r., COUNT (*) JAKO alba
Z alba l, umělci r
WHERE artist_id = r.id
GROUP BY artist_id
MÁ alba> 1;

Všimněte si, že klauzule HAVING přichází za GROUP BY. Jinak je to v zásadě jednoduchá náhrada KDE ZA HAVING. Výsledky jsou:

+++
| jméno | alba |
+++
| Pink Floyd | 2 |
| Adele | 2 |
+++

K filtrování výsledků před seskupením můžete stále použít podmínku WHERE. Bude fungovat společně s klauzulí HAVING pro filtrování po seskupení:

VYBRAT jméno r., COUNT (*) JAKO alba
Z alba l, umělci r
WHERE artist_id = r.id
AND release_year> 1990
GROUP BY artist_id
MÁ alba> 1;

Pouze jeden umělec v naší databázi vydal po roce 1990 více než jedno album:

+++
| jméno | alba |
+++
| Adele | 2 |
+++

Kombinace výsledků s GROUP BY

Příkaz GROUP BY je neuvěřitelně užitečnou součástí jazyka SQL. Může poskytovat souhrnné informace o datech, například pro stránku s obsahem. Je to vynikající alternativa k načítání velkého množství dat. Databáze zvládá tuto extra pracovní zátěž dobře, protože její samotný design ji činí optimální pro danou úlohu.

Jakmile pochopíte seskupování a jak se připojit k několika tabulkám, budete moci využít většinu síly relační databáze.

E-mailem
Jak dotazovat více databázových tabulek najednou pomocí připojení SQL

Naučte se, jak používat spojení SQL k zefektivnění dotazů, úspoře času a budete se cítit jako mocný uživatel SQL.

Související témata
  • Programování
  • SQL
O autorovi
Bobby Jack (28 článků publikováno)

Bobby je technologický nadšenec, který většinu softwarových vývojářů pracoval téměř dvě desetiletí. Je vášnivým hráčem, pracuje jako editor recenzí v časopisu Switch Player Magazine a je ponořen do všech aspektů online publikování a vývoje webových stránek.

Více od Bobbyho Jacka

Přihlaste se k odběru našeho zpravodaje

Připojte se k našemu zpravodaji s technickými tipy, recenzemi, bezplatnými elektronickými knihami a exkluzivními nabídkami!

Ještě jeden krok…!

V e-mailu, který jsme vám právě poslali, potvrďte svou e-mailovou adresu.

.