Hledání toho, co chybí

LEFT JOIN označí řádky bez protějšku hodnotami NULL a ty se snadno najdou pomocí IS NULL. Dohromady odpovídají na otázky, co chybí. Kteří zákazníci si nikdy nic neobjednali?

SELECT z.jmeno, z.email
FROM zakaznici AS z
LEFT JOIN objednavky AS o ON o.zakaznik_id = z.id
WHERE o.id IS NULL
ORDER BY z.jmeno;
jmenoemail
Filip Benešfilip@benes.dev
Martin Zemanmartin.zeman@mail.cz

Krok za krokem: LEFT JOIN dá každého zákazníka s každou jeho objednávkou a každého zákazníka bez objednávky jednou, s hodnotami NULL. To je výsledek z minulého cvičení. WHERE si pak nechá jen řádky, kde je o.id NULL, a to jsou přesně zákazníci, ke kterým se žádná objednávka nenašla.

Který sloupec pravé tabulky testovat? Takový, který v řádku s nalezeným protějškem nikdy není NULL: její primární klíč, nebo sloupec s NOT NULL. Tabulky polozky a recenze nemají id, testujte tedy například p.objednavka_id nebo r.hvezdicky. Nevybírejte sloupec, který může být NULL i tak, jako komentar recenze: dostali byste i hry, které recenzi mají, jen bez komentáře.

Typická chyba: WHERE o.id = NULL. Jak víte ze 3. lekce, = NULL nikdy neplatí, takže dotaz nenajde nic. Nic nenajde ani tehdy, když napíšete JOIN místo LEFT JOIN: JOIN žádné řádky s NULL nemá, protože řádky bez protějšku vyhodí dřív, než je WHERE vůbec uvidí.

Opačná otázka, kteří zákazníci si něco objednali, potřebuje jen JOIN. Každý zákazník by ve výsledku byl jednou pro každou objednávku, a tak přidejte DISTINCT: SELECT DISTINCT z.jmeno FROM zakaznici AS z JOIN objednavky AS o ON ….

Pokyny

Které hry si ještě nikdo neobjednal? Začněte dotazem, který spojí tabulku hry (alias h) s tabulkou polozky (alias p) tak, aby ve výsledku zůstala každá hra, a ukáže nazev a cena hry.

Teď přidejte podmínku, která nechá jen hry, které nejsou v žádné objednávce, a seřaďte je podle nazev:

nazevcena
Lost Temple499
Mystery Manor649
Robot Rebellion999

Pod něj napište dotaz, který najde hry bez recenze: jejich nazev a datum vydání (vydano), seřazené podle nazev. Dvě z nich ještě nevyšly, takže mají ve sloupci vydano NULL. To je NULL samotné hry, ne znamení chybějící recenze:

nazevvydano
Castle Siege2021-05-20
Lost Temple2022-04-07
Mystery ManorNULL
Robot RebellionNULL

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

8/12