sql >> Databáze >  >> RDS >> Mysql

Výkon MySQL:Úvod do JOINů v SQL

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.
Poznámka:V době psaní tohoto článku MariaDB a MySQL nepodporují OUTER JOINs. Uvedeme však příklad způsobu, jak vyrobit tento výstup jiným způsobem.

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!

Navigace řady<
  1. Obnovte svou databázi WordPress pomocí WP-CLI

  2. Jak odstraním pevný počet řádků s řazením v PostgreSQL?

  3. Replikace MySQL a selhání založené na GTID – hluboký ponor do chybných transakcí

  4. Vytvořte tabulku pouze v případě, že v MariaDB neexistuje