V tomto článku se naučíme základy spojování tabulek v SQL. Dozvíme se o Left, Right, Inner a Outer JOINs a uvedeme příklady, jak je používat.
Data v RDBMS (Relational Database Management System) jsou seskupena do tabulek. Tyto tabulky mají pevnou definici typu dat, která v nich mohou být uložena. Pro propojení různých tabulek, a tím i různých typů dat, které se spolu mohou týkat, použijeme klauzuli JOIN.
Typy JOINů
Existují čtyři základní typy JOINů:INNER, OUTER, LEFT a RIGHT. Při propojení dvou tabulek vrátí každá jinou podmnožinu odpovídajících tabulek na základě podmínky v klauzuli ON.
- LEFT a RIGHT JOIN provádějí podobný úkol. Oba vrátí celou jednu tabulku s informacemi, které souvisí s druhou tabulkou.
- INNER a OUTER JOIN provádějí velmi odlišné úkoly. INNER JOIN vytváří velmi omezený výsledek, zatímco OUTER vrací kompletní datovou sadu.
V tomto příkladu používáme pro tento výukový program příklad obchodního oddělení se třemi tabulkami:prodejci, objednávky a zákazníci.
Tabulka prodejců bude mít tři sloupce:id, jméno a sazba provize.
Dále bude tabulka objednávek obsahovat čtyři sloupce:ID objednávky, celkové náklady na objednávku, zákazníka a, je-li k dispozici, prodejce.
Tabulka zákazníků bude obsahovat dva sloupce:id a základní kontaktní informace.
Nyní tedy máme několik tabulek informací, které jsou užitečné pro různé lidi různými způsoby. Pomocí těchto tří tabulek (prodejci, objednávky a zákazníci) poskytneme příklady toho, jak může být každý z JOINů užitečný.
VLEVO PŘIPOJIT SE
Asi nejčastěji používaným typem JOIN je LEFT JOIN. Pokud uvažujete o spojení dvou tabulek, ta zmíněná v klauzuli FROM je vlevo. Ten uvedený v klauzuli JOIN je vpravo. V LEFT JOIN je ve výsledku vrácen každý řádek z tabulky LEFT (nebo FROM) a je propojen s odpovídajícími řádky z tabulky RIGHT (nebo JOIN), které odpovídají klauzuli ON.
Mějte na paměti, že některé řádky VLEVO nemusí mít odpovídající data VPRAVO. V takovém případě budou pole, která by byla ve výsledku vyplněna z tabulky RIGHT, vyplněna hodnotou NULL.
Pokud se více řádků v tabulce RIGHT shoduje s řádky v tabulce LEFT, bude do sady výsledků zahrnuto více řádků. Vennův diagram ukazuje, jak by LEFT JOIN vypadal vizualizovaný:
Marketingový ředitel vás požádá o zprávu o všech objednávkách rozdělených podle zákazníka. K tomu můžete použít LEFT JOIN:
SELECT *
FROM orders
LEFT JOIN customer
ON orders.customer_id = customer.id;
Tento dotaz se ptá na všechna data v tabulce „objednávky“ propojené s řádky v tabulce „zákazník“, kde id zákazníka se rovná customer_id v objednávce. Výsledek by vypadal takto:
Všimněte si, že pro zákazníka Widgets LLC existují tři položky, protože měli tři objednávky. Jolly Inc. zadal dvě objednávky a Acme Inc. Cheapo se v tomto seznamu nezobrazuje, protože nebyly zadány žádné objednávky.
SPRÁVNÉ PŘIPOJENÍ
RIGHT JOIN je velmi podobný LEFT JOIN, kromě toho, že vrací každý řádek z tabulky RIGHT (JOIN) a pouze odpovídající řádky z tabulky LEFT (FROM). Opět platí, že pokud v tabulce LEFT nejsou žádná data, budou tyto sloupce naplněny hodnotami NULLvalues.
Pokud je v tabulce LEFT více řádků, bude v sadě výsledků více řádků. Jeho Vennův diagram by vypadal takto:
Pokud vedení chce zprávu s KAŽDÝM zákazníkem; i když nezadali objednávku, mohli bychom použít RIGHT JOIN.
SELECT *
FROM orders
RIGHT JOIN customer
ON orders.customer_id = customer.id;
Opět začneme tabulkou „objednávky“ a PŘIPOJÍME ji k tabulce zákazníků. Protože jsme použili RIGHT JOIN, získáme alespoň jeden řádek pro každý záznam v tabulce RIGHT (JOIN), zákazník. Pokud dojde ke shodě mezi customer.id a orders.customer_id, informace se vyplní. Výsledky zahrnují Cheapo Co s hodnotami NULL ve sloupcích objednávky:
INNER JOIN
INNER JOIN vrátí pouze řádky z každého sloupce, které odpovídají klauzuli ON. Pokud není shoda na PRAVO, jsou vyloučeny řady zleva a naopak. Vennův diagram pro INNER JOIN vypadá takto:
Je výplatní den a mzdové oddělení potřebuje vědět, jakou provizi má vyplatit. K tomu budou muset znát objednávky, které byly zadány prostřednictvím jednotlivých prodejců. Upozorňujeme, že ne všechny objednávky prošly přes prodejce, takže se o ně nestaráme. K tomu můžeme použít INNER JOIN:
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
INNER JOIN salespeople
ON orders.salesperson_id = salespeople.id;
Opět začínáme tabulkou objednávek. Tentokrát se k tomu připojujeme s tabulkou prodejců. Pokud v tabulce objednávek existuje záznam, který odpovídá záznamu v tabulce prodejců, bude řádek zahrnut. Místo naplnění neshodných řádků hodnotami NULL jsou tyto řádky ve výsledcích ignorovány.
Upozorňujeme, že databázi říkáme, aby nejen vrátila částku prodeje a sazbu provize, ale také vypočítanou provizi. Výsledky by vypadaly takto:
VNĚJŠÍ PŘIPOJENÍ
OUTER JOIN vrátí vše bez ohledu na to, zda existuje shoda. Pokud byste měli zkombinovat výsledky LEFT a RIGHT JOIN, dostali byste OUTER JOIN. Vennův diagram pro OUTER JOIN vypadá takto:
Nyní je konec měsíce a manažer prodeje chce znát VŠECHNY tržby a také všechny provize, které byly vyplaceny. K tomu použijeme OUTER JOIN:
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
FULL OUTER JOIN salespeople
ON orders.salesperson_id = salespeople.id;
Stejně jako mzdová zpráva začínáme objednávkami a PŘIPOJÍME SE k prodejcům. Rozdíl je v tom, že s OUTER JOIN získáte výsledky z obou tabulek LEFT a RIGHT s vyplněným NULL tam, kde neexistuje odpovídající shoda. Výsledky vypadají takto:
Pamatujte, že jsme řekli, že MariaDB a MySQL nepodporují OUTER JOIN. Také jsme řekli, že pokud přidáte LEFT JOIN k RIGHT JOIN, získáte OUTER JOIN. Trik v těchto dvou systémech spočívá právě v tom. Toho dosáhneme doložkou UNION. Přidává výsledky jednoho dotazu k druhému:
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
UNION
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
RIGHT JOIN salespeople
ON orders.salesperson_id = salespeople.id;
Výsledky by vypadaly takto:
VÍCE PŘIPOJENÍ
JOIN také umožňuje připojit více než dva stoly. Pokud chceme úplnou zprávu o prodeji s informacemi o zákaznících a prodejcích, na konci jednoduše provedeme další JOIN.
SELECT *
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
LEFT JOIN customer
ON customer.id = orders.customer_id;
V tomto příkladu začneme tabulkou objednávek a připojíme ji k tabulce prodejců podobně jako předtím. Dalším krokem je PŘIPOJIT stůl ke stolu zákazníků. Tím vyplníte všechny informace, které lze propojit s tabulkou objednávek.
Tento článek je stručným úvodem a nemá být vyčerpávající diskuzí o tom, jak lze JOIN použít v SQL.
Klikněte níže a využijte tento výhodný kupón ještě dnes!
Liquid Web má některé z nejvýkonnějších databázových serverů v oboru. Tyto servery lze využít k provozování nejmenších domácích podniků až po největší multidatabázové clustery pro korporace podnikového rozsahu.
Zavolejte nám na číslo 800 580 4985 nebo si s námi otevřete chat či vstupenku a promluvte si s jedním z našich zkušených poradců pro řešení nebo hosting, abyste zjistili, jak můžete tyto techniky využít již dnes!