05.12.2012, Vladimír Klaus, navštíveno 32514x
Tak tímto se dají spojovat tabulky. Tedy ne fyzicky, ale třeba při použití příkazu SELECT může být výsledkem spojení tabulek. K čemu je to dobré? Tak například potřebujeme znát detailní informace o objednávce, tedy jak parametry objednávky, tak i údaje o zákazníkovi, který ji učinil.
Poznámka: V některých databázích stačí napsat pouze JOIN.
A takové informace jsou ve dvou tabulkách, které musíme spojit. Spojení musíme provést přes nějakou společnou hodnotu, což je v tomto případě ID zákazníka. V tabulce objednávek se pole jmenuje IdZakaznika a v tabulce zákazníků je to ID. Protože ale i tabulka objednávek obsahuje pole ID, musíme použít místo pouhého ID celý zápis (včetně názvu tabulky) – Zakaznici.ID. A nakonec vůbec nezaškodí (často je to dokonce nutnost), když název tabulky použijeme i u druhého sloupce - Objednavky.IdZakaznika.
SELECT * FROM Objednavky
INNER JOIN Zakaznici ON Objednavky.IdZakaznika = Zakaznici.ID
Výsledkem je krásné spojení dvou tabulek. Zároveň platí, že v tomto výsledku budou spojeny řádky pouze tehdy, pokud je v obou nalezeno stejné ID zákazníka. A naopak (zjednodušeně řečeno) – pokud existuje záznam o objednávce od neexistujícího zákazníka, nebo existuje zákazník, který si nic neobjednal, ve výsledku nebude! Porovnejte prosím s LEFT JOIN a RIGHT JOIN.
Teď si zkusíme trochu komplikovanější úkol. Zjistit, jaká je celková výše objednávek zákazníků z Prahy 8. Začneme úpravou dotazu tak, aby se nám vyfiltrovaly pouze objednávky z požadovaného města.
SELECT * FROM Objednavky
INNER JOIN Zakaznici ON Objednavky.IdZakaznika = Zakaznici.ID
WHERE Zakaznici.Mesto = "Praha 8"
A teď už můžeme využít znalosti z agregačních funkcí a vložíme sčítací funkci.
SELECT SUM(Objednavky.Castka) FROM Objednavky
INNER JOIN Zakaznici ON Objednavky.IdZakaznika = Zakaznici.ID
WHERE Zakaznici.Mesto = "Praha 8"
Prima, ale nás to ještě zajímá v podrobnější podobě – podle jednotlivých adres (ulic). Obohatíme dotaz o seskupení dle Ulice, ale abychom ve výsledku viděli nejen součty, ale také ty ulice, musíme přidat Ulici i do SELECTu. Poslední úpravou bude zadání aliasu pro sloupec se součtem pomocí klíčového slova AS.
SELECT SUM(Objednavky.Castka) AS Soucet, Ulice FROM Objednavky
INNER JOIN Zakaznici ON Objednavky.IdZakaznika = Zakaznici.ID
WHERE Zakaznici.Mesto = "Praha 8"
GROUP BY Zakaznici.Ulice
V dalším příkladu si ukážeme, jak zjistit objednávky od uživatele Soboty, které jsou za více než 500 Kč. Samozřejmě musíme začít tím, že propojíme Zákazníky a Objednávky přes ID zákazníka. Následně přidáme dvě podmínky na částku a jméno.
SELECT Objednavky.*, Zakaznici.Prijmeni FROM Objednavky
INNER JOIN Zakaznici ON Objednavky.IdZakaznika = Zakaznici.ID
WHERE Objednavky.Castka > 500 AND Zakaznici.Prijmeni = "Sobota"
Poznámka: Příkaz INNER JOIN lze plnohodnotně nahradit zapsáním propojovacích podmínek do příkazu WHERE a uvedením obou tabulek za příkaz FROM.
Předchozí příklad tedy můžeme zapsat i takto:
SELECT Objednavky.*, Zakaznici.Prijmeni FROM Objednavky, Zakaznici
WHERE Objednavky.IdZakaznika = Zakaznici.ID
AND Objednavky.Castka > 500
AND Zakaznici.Prijmeni ="Sobota"