Sjednocení výsledků: UNION
Spojení tabulek klade tabulky vedle sebe: sloupce jedné vedle sloupců druhé. UNION (sjednocení) klade výsledky dvou dotazů pod sebe: nejdřív řádky prvního dotazu, pak řádky druhého. Co je v obchodě nového od srpna 2025, noví zákazníci i nové hry v jednom seznamu:
SELECT registrace AS den, 'nový zákazník' AS udalost, jmeno AS podrobnosti
FROM zakaznici
WHERE registrace >= '2025-08-01'
UNION ALL
SELECT vydano, 'nová hra', nazev
FROM hry
WHERE vydano >= '2025-08-01'
ORDER BY den;| den | udalost | podrobnosti |
|---|---|---|
| 2025-08-21 | nový zákazník | Kristýna Fialová |
| 2025-09-26 | nová hra | Goal Rush |
| 2025-10-03 | nový zákazník | Martin Zeman |
| 2025-11-14 | nová hra | Knight's Oath |
Oba dotazy musí mít stejný počet sloupců. Sloupce se k sobě přiřazují podle pořadí, ne podle názvu: první sloupec druhého dotazu jde pod první sloupec prvního dotazu a tak dál. Názvy sloupců se berou z prvního dotazu, takže aliasy potřebuje jen on. S jiným počtem sloupců dostanete chybu:
Error on line 1: SELECTs to the left and right of UNION do not have the same number of result columnsZpráva říká, že dotazy nalevo a napravo od UNION nemají stejný počet sloupců. Všimněte si také sloupců 'nový zákazník' a 'nová hra': text v apostrofech dá v každém řádku stejnou hodnotu a tady říká, odkud který řádek pochází.
UNION ALL nechá všechny řádky. UNION bez ALL odstraní z výsledku opakující se řádky, stejně jako DISTINCT. Hry, které si někdo objednal nebo ohodnotil, tedy SELECT hra_id FROM polozky UNION SELECT hra_id FROM recenze, dají 17 řádků, každou hru jednou. S UNION ALL je to 67 řádků, jeden za každou položku každé objednávky a jeden za každou recenzi. Když víte, že se řádky opakovat nemůžou, nebo je chcete nechat, použijte UNION ALL: databáze nemusí opakované řádky hledat, takže je rychlejší.
ORDER BY se píše jen jednou, úplně na konec, a řadí celý výsledek; totéž platí pro LIMIT. Používá názvy sloupců prvního dotazu, tady den. ORDER BY za prvním dotazem skončí chybou ORDER BY clause should come after UNION not before.
Typická chyba: sloupce v jiném pořadí. Kdyby druhý dotaz měl SELECT nazev, 'nová hra', vydano, SQLite by si nestěžovalo: dalo by názvy her pod data bez jediného slova. Zkontrolujte, že sloupce obou dotazů znamenají totéž.
Jak psát:
Pokyny
Ukažte, kolik her má každý žánr, jako zanr a pocet_her, a přidejte ještě jeden řádek: text Všechny žánry a počet všech her. Seřaďte podle sloupce pocet_her od nejvyššího, pak podle žánru:
| zanr | pocet_her |
|---|---|
| Všechny žánry | 20 |
| Akční | 4 |
| Adventura | 3 |
| Strategie | 3 |
| … | … |
Pod to ukažte jména zákazníků, kterým by měl vedoucí zavolat: těch, kteří mají nějakou vrácenou objednávku, a těch, kteří napsali recenzi s méně než 3 hvězdičkami. Každý z nich má být v seznamu jen jednou. V prvním dotazu spojte tabulku zakaznici s tabulkou objednavky, ve druhém tabulku zakaznici s tabulkou recenze. Seřaďte podle jména:
| jmeno |
|---|
| Adéla Králová |
| Matěj Němec |
| Tomáš Veselý |
Začněte programovat zdarma
8/8