Všechny řádky: LEFT JOIN

JOIN vynechá řádky, které nemají protějšek: v seznamu zákazníků s objednávkami chybí Filip Beneš i Martin Zeman. Často ale chcete všechny řádky jedné tabulky, ať protějšek mají, nebo ne. K tomu slouží LEFT JOIN (levé spojení):

SELECT z.jmeno, o.id, o.datum
FROM zakaznici AS z
LEFT JOIN objednavky AS o ON o.zakaznik_id = z.id
ORDER BY o.datum, z.jmeno;
jmenoiddatum
Filip BenešNULLNULL
Martin ZemanNULLNULL
Eva Novotná12024-01-20
Jakub Dvořák22024-02-14
………

Tabulka před LEFT JOIN, tady zakaznici, je levá a tabulka za ním pravá. LEFT JOIN si nechá každý řádek levé tabulky. Řádky, které protějšek mají, se spárují stejně jako u JOIN. Řádek bez protějšku zůstane ve výsledku jednou a sloupce pravé tabulky jsou v něm NULL: Filip Beneš nemá žádnou objednávku, takže ID i datum jeho objednávky jsou NULL. A protože NULL je při řazení první, zákazníci bez objednávky jsou nahoře.

Teď tedy záleží na tom, která tabulka je první. FROM objednavky AS o LEFT JOIN zakaznici AS z … si nechá každou objednávku, a protože každá objednávka má zákazníka, nenajde nic navíc oproti JOIN. Na první místo dejte tabulku, jejíž řádky chcete zachovat. Uvidíte také LEFT OUTER JOIN, což je totéž.

Existuje i RIGHT JOIN, který si nechá každý řádek pravé tabulky, a FULL JOIN, který si nechá řádky obou. SQLite má oba, ale budete je potřebovat jen zřídka: RIGHT JOIN je LEFT JOIN s prohozenými tabulkami a většina programátorů píše LEFT JOIN.

Pozor, když za LEFT JOIN připojujete další tabulku. Řekněme, že chcete u objednávek každého zákazníka i názvy her, a tak přidáte JOIN polozky AS p ON p.objednavka_id = o.id. U Filipa Beneše je o.id NULL a NULL se ničemu nerovná, takže jeho řádek žádnou položku nenajde a obyčejný JOIN ho zase vyhodí. Tabulka, která se připojuje k pravé tabulce LEFT JOINu, obvykle potřebuje LEFT JOIN také.

Pokyny

Ukažte každou hru s hvězdičkami jejích recenzí, včetně her, které nikdo nehodnotil: nazev a hvezdicky, seřazené podle nazev, potom podle hvezdicky od nejvyšších. Hra Castle Siege nemá žádnou recenzi, takže její hvězdičky jsou NULL:

nazevhvezdicky
Bakery Story4
Castle SiegeNULL
Cube Logic5
Cube Logic3
……

Pod něj vypište každého zákazníka s názvy her, které hodnotil: jmeno a nazev, ze tří tabulek zakaznici, recenze a hry. Zákazníci, kteří nic nehodnotili, musí ve výsledku zůstat. Řádky seřaďte podle nazev, potom podle jmeno:

jmenonazev
Filip BenešNULL
Martin ZemanNULL
Klára HorákováBakery Story
Eva NovotnáCube Logic
Tereza SvobodováCube Logic
Anna KučerováDragon Forge
……

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

7/12