Vše, co potřebujete vědět o prohlášení SQL GROUP BY

Vše, co potřebujete vědět o prohlášení SQL GROUP BY

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





Seskupení vám umožňuje extrahovat souhrnné informace z databáze. Umožňuje kombinovat výsledky a vytvářet užitečné statistické údaje. Seskupování vám ušetří psaní kódu pro běžné případy, jako je průměrování seznamů obrázků. A 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. Jeho využití můžeme ukázat na ukázkových datech s řádky, které sdílejí některé společné hodnoty.





jak připojit telefon k televizi

Následuje velmi jednoduchá databáze se dvěma tabulkami, které představují nahrávací alba. Takovou databázi můžete nastavit do psaní základního schématu pro vámi zvolený 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 prodeje:

+----+---------------------------+-----------+--------------+-------+
| id | name | artist_id | release_year | sales |
+----+---------------------------+-----------+--------------+-------+
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | The Dark Side of the Moon | 2 | 1973 | 24 |
| 3 | Rumours | 3 | 1977 | 28 |
| 4 | Nevermind | 4 | 1991 | 17 |
| 5 | Animals | 2 | 1977 | 6 |
| 6 | Goodbye Yellow Brick Road | 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 | name |
+----+---------------+
| 1 | The Beatles |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Nirvana |
| 5 | Elton John |
| 6 | Adele |
| 7 | Meat Loaf |
+----+---------------+

Rozumíte různým aspektům GROUP BY pouhou jednoduchou sadou dat, jako je tato. Skutečná datová sada by samozřejmě měla mnoho, mnoho dalších řá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 pro načtení sloupce artist_id:





SELECT artist_id FROM albums

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 seskupit tyto výsledky podle umělce, připojte frázi SKUPINA PODLE ID umělce :





SELECT artist_id FROM albums GROUP BY artist_id

Což dává následující výsledky:

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

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

SELECT artist_id, COUNT(*)
FROM albums
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+-----------+----------+

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

Příbuzný: The Essential SQL Commands Cheat Sheet for Beginners

Jak přistupovat k seskupeným datům pomocí agregační funkce

Možná jste použili POČET fungovat 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:

SELECT COUNT(*) FROM albums
+----------+
| COUNT(*) |
+----------+
| 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 počítat počet řádků můžeme na seskupené hodnoty použít agregační funkci:

SELECT artist_id, SUM(sales)
FROM albums
GROUP BY artist_id
+-----------+------------+
| artist_id | SUM(sales) |
+-----------+------------+
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+-----------+------------+

Celkové tržby uvedené výše pro umělce 2 a 6 jsou prodejem jejich více alb dohromady:

SELECT artist_id, sales
FROM albums
WHERE artist_id IN (2, 6)
+-----------+-------+
| artist_id | sales |
+-----------+-------+
| 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ů.

SELECT release_year, sales, count(*)
FROM albums
GROUP BY release_year, sales

To obvykle přinese více výsledků než seskupení do jednoho sloupce:

+--------------+-------+----------+
| release_year | sales | count(*) |
+--------------+-------+----------+
| 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í jen dvě alba stejný rok vydání a počet prodejů (28 v roce 1977).

Užitečné funkce agregátu

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

  • COUNT () vrátí 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í průměrný průměr. Je to ekvivalent SUM () / COUNT ().

Tyto funkce můžete také použít bez klauzule GROUP:

jak pořídit snímek obrazovky chatu na snapchatu, aniž by to věděli
SELECT AVG(sales) FROM albums
+------------+
| AVG(sales) |
+------------+
| 19.1111 |
+------------+

Použití GROUP BY s klauzulí WHERE

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

SELECT artist_id, COUNT(*)
FROM albums
WHERE release_year > 1990
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 4 | 1 |
| 6 | 2 |
+-----------+----------+

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

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
+---------+--------+
| name | albums |
+---------+--------+
| Nirvana | 1 |
| Adele | 2 |
+---------+--------+

Všimněte si však, že pokud se pokusíte filtrovat na základě agregovaného sloupce:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND albums > 2
GROUP BY artist_id;

Zobrazí se chyba:

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

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

Použití klauzule HAVING

Jak tedy filtrujete sadu výsledků po seskupení? The MÁM klauzule pojednává o této potřebě:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
GROUP BY artist_id
HAVING albums > 1;

Všimněte si, že klauzule HAVING následuje za GROUP BY. Jinak je to v podstatě jednoduchá náhrada WHERE za HAVING. Výsledky jsou:

+------------+--------+
| name | albums |
+------------+--------+
| Pink Floyd | 2 |
| Adele | 2 |
+------------+--------+

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

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
HAVING albums > 1;

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

+-------+--------+
| name | albums |
+-------+--------+
| 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á toto dodatečné pracovní zatížení dobře, protože díky svému designu je pro danou úlohu optimální.

Jakmile porozumíte seskupování a připojení ke více tabulkám, budete moci využít většinu síly relační databáze.

Podíl Podíl tweet E-mailem Jak dotazovat více databázových tabulek najednou pomocí spojení SQL

Zjistěte, jak pomocí spojení SQL zjednodušit dotazy, ušetřit čas a cítit se jako zkušený uživatel SQL.

jak najít IP adresu pro server minecraft
Číst dále Související témata
  • Programování
  • SQL
O autorovi Bobby Jack(58 článků zveřejněno)

Bobby je technologický nadšenec, který pracoval jako vývojář softwaru po téměř dvě desetiletí. Je zapálený pro hraní her, pracuje jako editor recenzí časopisu Switch Player Magazine a je ponořen do všech aspektů online publikování a webového vývoje.

Více od Bobbyho Jacka

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

Připojte se k našemu zpravodaji a získejte technické tipy, recenze, bezplatné elektronické knihy a exkluzivní nabídky!

Kliknutím sem se přihlásíte k odběru