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;
zanrvydane_hry
Akční3
Strategie3

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;
zanrvydane_hry
Adventura3
Akční4
……

Žádná chyba, jen špatný výsledek: akční hry mají zase 4, včetně Robot Rebellion, která ještě nevyšla.

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_idzaplacene_objednavky
14
23
34
43

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:

mestonovi_zakaznici
Brno2
Plzeň3
Praha2

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

9/10