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;| id | datum | nazev |
|---|---|---|
| 7 | 2024-06-01 | Shadow Ninja |
| 18 | 2025-03-28 | Galaxy 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_id | nazev | cena_hry | zaplacena_cena |
|---|---|---|---|
| 28 | Shadow Ninja | 649 | 399 |
| 28 | Zombie Town | 799 | 499 |
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.
Jak psát:
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:
| jmeno | datum | nazev |
|---|---|---|
| Lukáš Procházka | 2024-04-02 | Castle Siege |
| Lukáš Procházka | 2024-04-02 | Galaxy Trader |
| Lukáš Procházka | 2024-12-23 | Tiny Kingdoms |
| Natálie Marková | 2025-11-20 | Knight's Oath |
| Lukáš Procházka | 2025-12-22 | Bakery Story |
| Lukáš Procházka | 2025-12-22 | Moon 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:
| jmeno | registrace | datum |
|---|---|---|
| Vojtěch Pokorný | 2024-11-30 | 2024-12-05 |
| Adéla Králová | 2025-02-12 | 2025-02-14 |
| Kristýna Fialová | 2025-08-21 | 2025-08-30 |
Začněte programovat zdarma
5/12