Někteří lidé jdou hodně daleko, aby se ve svých dotazech vyhnuli klauzulím GROUP BY a HAVING. Chybové zprávy jsou náročné, ale obvykle mají pravdu. Klíčová slova GROUP BY a HAVING jsou zásadní pro dobré hlášení SQL.
Primárním důvodem pro GROUP BY je snížení počtu řádků, obvykle agregací. Ze vstupu vytvoří pouze jeden řádek pro každé odpovídající seskupení. To vám umožňuje provádět sofistikované výpočty pomocí běžného SQL.
Příklad ovoce:
Máme nějaké ovoce:
Tento další případ nám umožňuje dívat se dopředu. V polovině roku, jaké ovoce bude k dispozici? Děláme to se stejným dotazem jako výše, ale po spuštění dotazu zkontrolujeme hodnoty min(fresh_until) pomocí klauzule have. HAVING je způsob, jak kvalifikovat souhrn.
Všechna jablka a hrozny budou k dispozici v polovině roku.
Seznam položek mezi SELECT a FROM, cílový seznam. může obsahovat neagregáty a agregáty. Tyto neagregované sloupce v cílovém seznamu
by měly být ve skupině podle klauzule. Chybová zpráva to říká. Na pořadí sloupců ve skupině podle věty záleží. Určuje, jak jsou agregáty seskupeny. Pořadí je často hierarchické. Co to znamená pro vaše sloupce, je vaše zaměření. Může to být ovoce nebo zdroje a/nebo fresh_until date.
Příklady hracích karet
Podívejme se na další sadu příkladů, které ilustrují získávání informací z hracích karet. O kartách se můžete dozvědět na Wikipedii Standard Cards.
Předpokládejme, že rozdáte programově šest 5-karetních hand, jako šest lidí hraje poker. V tomto obchodu je použito celkem 30 karet. Jsou v ruce tabulka jako je následující, kde jsou názvy karet a barev spojeny vyhledávacími tabulkami. Ukládáme pořadí, abychom mohli správně třídit. Pro zobrazení používáme názvy. Jména a hodnosti mají vztah jedna ku jedné pro každou z karet a barev.
Jaký je počet barev pro každou ruku? Opravdu se zajímáme pouze o všechny handy, které mají 3 nebo více karet stejné barvy. To nám řekne, kdo má větší šance na pokerovou flush. Všimněte si, že ačkoli se zdá, že GROUP BY implikuje ORDER BY, není tomu tak. ORDER BY musí být explicitní.
Co když jste tedy dotaz seskupili špatně? Pokud tato ruka stůl není seskupen podle handid, pak získáte 30 záznamů o 6 handách 5-karet. Pokud byste měli agregáty, byly by seskupeny podle řádku. Nepříliš užitečné.
Pokud agregujete název karty a nezahrnete
název karty sólo na cílový seznam a pokusíte se seřadit podle názvu karty,
obdržíte chybovou zprávu, že by neměla být v
pořadí podle doložky. Uspořádání podle klauzule by mělo obsahovat
prvky skupiny podle klauzule.
Pokud je však název karty výslovně uveden v cílovém seznamu,
pak musí být název karty ve skupině podle klauzule a
proto musí být povolen v pořadí podle klauzule.
Pokud je dotaz podle barvy, bude minimálně 1 nebo maximálně 4 záznamy na barvu pro každou ze šesti kombinací. Všimněte si, že třídíme podle hodnosti barvy, která
také musí být ve skupině podle klauzule. su_name a su_rank mají vztah jedna ku jedné.
Chcete-li vidět rozdělení karet do rukou, musíme seskupit podle sloupce hodnosti karet. Samozřejmě existují 4 barvy každé karty, takže kartu neuvidíte ve více než čtyřech kombinacích.
Chcete-li se podívat, kdo drží esa, můžeme použít následující krátký dotaz. Všimněte si, že existuje klauzule WHERE, která se provádí při shromažďování řádků. HAVING se provede po shromáždění řádků.
Shrnutí
Tyto příklady představují jednoduché způsoby, jak vyhodnotit známé entity. Experimentujte a používejte tato jednoduchá pravidla.
- Pokud je sloupec v cílovém seznamu a ne agregovaný, musí být v klauzuli GROUP BY.
- Kde se během procesu výběru vyskytují klauzule WHERE.
- Klauzule HAVING se vyskytují po dokončení agregací.
- V klauzuli ORDER BY mohou být pouze neagregáty.
- Na pořadí klauzule GROUP BY záleží.