Spojení s WHERE a ORDER BY

Spojení se dá kombinovat se vším, co znáte: s WHERE, ORDER BY, LIMIT i s funkcemi. WHERE a ORDER BY se píšou až za JOINy a mohou používat sloupce všech spojených tabulek. Které hry byly ve vrácených objednávkách?

SELECT o.id, o.datum, h.nazev
FROM polozky AS p
JOIN objednavky AS o ON p.objednavka_id = o.id
JOIN hry AS h ON p.hra_id = h.id
WHERE o.stav = 'vraceno'
ORDER BY o.datum, h.nazev;
iddatumnazev
72024-06-01Shadow Ninja
182025-03-28Galaxy Trader

Vzpomeňte si z minulé lekce na pořadí, v jakém se části dotazu provádějí. Nejdřív přijde FROM, teď se všemi svými JOINy: ty vytvoří spojené řádky. Pak z nich WHERE některé vybere a po něm přijdou GROUP BY, HAVING, SELECT, ORDER BY a LIMIT. WHERE a ORDER BY tedy vidí sloupce všech spojených tabulek, ať je ukazujete, nebo ne. Dotaz nahoře filtruje podle o.stav a řadí podle o.datum a fungoval by, i kdyby ani jeden z nich v SELECT nebyl.

Spojení také umožní porovnat sloupce dvou tabulek mezi sebou, což žádný dotaz nad jednou tabulkou nedokáže. Které položky se prodaly levněji, než je cena hry v katalogu?

SELECT p.objednavka_id, h.nazev, h.cena AS cena_hry, p.cena AS zaplacena_cena
FROM polozky AS p
JOIN hry AS h ON p.hra_id = h.id
WHERE p.cena < h.cena
ORDER BY p.objednavka_id, h.nazev;
objednavka_idnazevcena_hryzaplacena_cena
28Shadow Ninja649399
28Zombie Town799499

Jen dvě hry z objednávky na Black Friday. Ve WHERE jsou kvalifikované názvy stejně důležité jako v SELECT: WHERE cena > 500 by skončilo chybou ambiguous column name: cena.

Typická chyba: WHERE před JOINem. Pořadí částí je pevné: všechny JOINy patří k FROM a WHERE přijde až za posledním z nich. Jinak dostanete chybu near "JOIN": syntax error.

Pokyny

Které hry si koupili zákazníci z Ostravy? Ukažte jmeno zákazníka, datum objednávky (datum) a nazev hry, jen u zákazníků, jejichž mesto je Ostrava. Řádky seřaďte podle datum, potom podle nazev:

jmenodatumnazev
Lukáš Procházka2024-04-02Castle Siege
Lukáš Procházka2024-04-02Galaxy Trader
Lukáš Procházka2024-12-23Tiny Kingdoms
Natálie Marková2025-11-20Knight's Oath
Lukáš Procházka2025-12-22Bakery Story
Lukáš Procházka2025-12-22Moon Farm

Pod něj najděte objednávky, které zákazníci zadali méně než dva týdny po registraci: ukažte jmeno zákazníka, den registrace (registrace) a datum objednávky (datum) u objednávek, kde je rozdíl obou dat menší než 14 dní. Použijte julianday() ze 4. lekce. Řádky seřaďte podle datum:

jmenoregistracedatum
Vojtěch Pokorný2024-11-302024-12-05
Adéla Králová2025-02-122025-02-14
Kristýna Fialová2025-08-212025-08-30

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

5/12