WHERE a HAVING spolu
Dotaz může mít WHERE i HAVING zároveň a každé z nich má svou práci. WHERE filtruje řádky dřív, než se seskupí: řádky, které jeho podmínku nesplňují, se nedostanou do žádné skupiny. HAVING filtruje skupiny, až když jsou vytvořené a spočítané.
Které žánry mají aspoň 3 hry, které už vyšly? Jestli hra vyšla, je otázka na jeden řádek, a tak patří do WHERE. „Aspoň 3“ se týká celé skupiny, a tak to patří do HAVING:
SELECT zanr, COUNT(*) AS vydane_hry
FROM hry
WHERE vydano IS NOT NULL
GROUP BY zanr
HAVING COUNT(*) >= 3
ORDER BY zanr;| zanr | vydane_hry |
|---|---|
| Akční | 3 |
| Strategie | 3 |
V minulém cvičení měly 3 hry i adventury. Jedna z nich, Mystery Manor, ale ještě nevyšla a WHERE ji vyřadí dřív, než se začne počítat. Adventury pak mají jen 2 hry a HAVING je vyřadí. Akční hry měly 4, a teď se počítají jen 3, které vyšly.
Jak poznáte, kam podmínka patří? Zeptejte se, jestli ji rozhodnete pohledem na jeden řádek. „Už vyšla“, „zaplaceno“, „z Prahy“: stačí jeden řádek, takže WHERE. „Aspoň 3 hry“, „celkem víc než 1 599 Kč“, „v průměru 4 hvězdičky“: potřebujete celou skupinu, takže HAVING. Podmínka na sloupec, podle kterého seskupujete, třeba zanr = 'Akční', by fungovala v obou, ale dejte ji do WHERE: databáze pak neseskupuje řádky, které by stejně zahodila.
Typická chyba: podmínka na řádky v HAVING. Jiné databáze ohlásí chybu, protože sloupec není v GROUP BY. SQLite ne: zkontroluje datum vydání jedné hry z každé skupiny a podle něj nechá, nebo vyřadí celou skupinu. Tady nechá všechny žánry se všemi hrami:
SELECT zanr, COUNT(*) AS vydane_hry
FROM hry
GROUP BY zanr
HAVING vydano IS NOT NULL
ORDER BY zanr;| zanr | vydane_hry |
|---|---|
| Adventura | 3 |
| Akční | 4 |
| … | … |
Žádná chyba, jen špatný výsledek: akční hry mají zase 4, včetně Robot Rebellion, která ještě nevyšla.
Jak psát:
Pokyny
Spočítejte u každého zákazníka jen zaplacené objednávky (stav 'zaplaceno') a ukažte zákazníky, kteří jich mají aspoň 3: zakaznik_id a jejich počet ve sloupci zaplacene_objednavky, seřazené podle zakaznik_id:
| zakaznik_id | zaplacene_objednavky |
|---|---|
| 1 | 4 |
| 2 | 3 |
| 3 | 4 |
| 4 | 3 |
Pod tím spočítejte v každém městě zákazníky, kteří se zaregistrovali v roce 2024 nebo později, a ukažte jen města, kde jsou aspoň 2: mesto a jejich počet ve sloupci novi_zakaznici, seřazené podle města:
| mesto | novi_zakaznici |
|---|---|
| Brno | 2 |
| Plzeň | 3 |
| Praha | 2 |
Začněte programovat zdarma
9/10