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;| jmeno | |
|---|---|
| Filip Beneš | filip@benes.dev |
| Martin Zeman | martin.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 ….
Jak psát:
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:
| nazev | cena |
|---|---|
| Lost Temple | 499 |
| Mystery Manor | 649 |
| Robot Rebellion | 999 |
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:
| nazev | vydano |
|---|---|
| Castle Siege | 2021-05-20 |
| Lost Temple | 2022-04-07 |
| Mystery Manor | NULL |
| Robot Rebellion | NULL |
Začněte programovat zdarma
8/12