Pokud chcete z dat dostat něco smysluplného , téměř vždy se budete muset připojit k více stolům. V tomto článku si ukážeme, jak to udělat pomocí různých typů spojení. Abychom toho dosáhli, spojíme VNITŘNÍ PŘIPOJENÍ a LEVÁ PŘIPOJENÍ. Pojďme tedy začít.
Model
Na následujícím obrázku můžete vidět stávající model. Skládá se ze 6 tabulek a my jsme to již víceméně popsali v předchozích článcích.
Přesto i bez popisu, pokud je databáze modelována a prezentována dobrým způsobem (rozumný výběr jmen, použití konvence pojmenování, dodržování stejných pravidel v celém modelu, řádky / vztahy ve schématu se nepřekrývají více, než je potřeba), měli byste být schopni k závěru, kde najdete data, která potřebujete. To je zásadní, protože předtím, než se připojíte k více tabulkám, musíte tyto tabulky nejprve identifikovat.
Budeme hovořit o konvenci pojmenování a o radách, jak přemýšlet, když píšete dotazy SQL, dále v tomto série. Zatím pojďme žít s tím, že tento model je docela jednoduchý a dokážeme to docela snadno.
Co zatím víme?
V této sérii jsme pokryta:
- Základy související s příkazem SQL SELECT a
- Porovnáno VNITŘNÍ PŘIPOJENÍ a LEVÉ PŘIPOJENÍ
Využijeme znalosti z obou těchto článků a zkombinujte je do psaní složitějších příkazů SELECT, které se připojí k více tabulkám.
Spojte více tabulek pomocí INNER JOIN
Prvním příkladem, který budeme analyzovat, je způsob, jak načíst data z více tabulek využívající pouze VNITŘNÍ PŘIPOJENÍ. U každého příkladu pojdeme s definicí problému, který musíme vyřešit, a dotazem, který tuto práci dělá. Začněme tedy prvním problémem.
# 1 Musíme uvést seznam všech hovorů s časem zahájení a ukončení. U každého hovoru chceme zobrazit, jaký byl výsledek, a také jméno a příjmení zaměstnance, který tento hovor provedl. Budeme třídit naše hovory podle času zahájení vzestupně.
Než napíšeme dotaz, identifikujeme tabulky, které musíme použít. Abychom to mohli udělat, musíme určit, které tabulky obsahují data, která potřebujeme, a zahrnout je. Mezi těmito tabulkami bychom také měli zahrnout všechny tabulky – tabulky, které neobsahují potřebná data, ale slouží jako vztah mezi tabulkami, které tak činí (v tomto případě to tak není).
Dotaz, který úlohu provede, je uveden níže:
Výsledek dotazu je uveden níže:
Zde bych chtěl poukázat na několik věcí:
- Tabulky, ke kterým jsme se připojili, jsou zde, protože data potřebujeme se nachází v těchto 3 tabulkách
- Pokaždé, když zmíním jakýkoli atribut z libovolné tabulky, používám formát název_tabulky.attribut_název (např. employee.first_name). I když to není nutné, je to osvědčený postup, protože někdy 2 nebo více tabulek ve stejném dotazu může používat stejné názvy atributů a to by vedlo k chybě
- Použili jsme INNER JOIN 2krát v pořadí připojit 3 tabulky. Výsledkem bude vrácení pouze řádků, které mají páry v jiné tabulce.
- Pokud ke spojení více tabulek používáte pouze VNITŘNÍ PŘIPOJENÍ, není pořadí těchto tabulek ve spojení důležité. Jedinou důležitou věcí je, že použijete vhodné podmínky spojení po „ZAPNUTO“ (spojení pomocí cizích klíčů)
Protože všechny hovory měly související zaměstnance a výsledek hovoru, dostali bychom stejný výsledek, pokud místo VNITŘNÍHO PŘIPOJENÍ jsme použili LEFT JOIN.
Připojte se k více stolům pomocí LEFT JOIN
Psaní dotazů, které používají LEFT JOIN, se ve srovnání s psaní dotazů pomocí VNITŘNÍ PŘIPOJENÍ. Výsledek by se samozřejmě lišil (alespoň v případech, kdy některé záznamy nemají pár v jiných tabulkách).
Toto je problém, který chceme vyřešit.
# 2 Vyjmenujte všechny okresy a zákazníky související s těmito zeměmi. U každé země zobrazujte její název v angličtině, jméno zákazníka města se nachází i jméno tohoto zákazníka. Vraťte i země bez souvisejících měst a zákazníci.
Tabulky obsahující data, která potřebujeme, jsou na následujícím obrázku:
Nejprve si řekneme rychle zkontrolujte, co je pokračování ents těchto 3 tabulek.
Všimli jsme si dvou důležitých věcí:
- I když každé město má spřízněnou zemi, ne všechny země mají spřízněná města (Španělsko & Rusko je nemá)
- Totéž platí pro zákazníky.Každý zákazník má definovanou hodnotu city_id, ale používají se pouze 3 města (Berlín, Záhřeb & New York)
Nejprve si zapište dotaz pomocí INNER JOIN:
Výsledek dotazu je uveden na následujícím obrázku:
Máme 7 krajů a 6 měst v naší databázi, ale náš dotaz vrátí pouze 4 řádky. To je výsledek skutečnosti, že v naší databázi máme pouze 4 zákazníky. Každá z těchto 4 souvisí se svým městem a město se vztahuje k zemi. INNER JOIN tedy vyloučil všechny tyto země a města bez zákazníků. Jak je ale také zahrnout do výsledku?
K tomu použijeme LEFT JOIN. Jednoduše nahradíme vše „VNITŘNÍ“ řetězcem „VLEVO“, takže náš dotaz je následující:
Výsledek je uveden na následujícím obrázku:
Můžete si snadno všimnout, že nyní máme všechny země, i ty, které nemají žádné související město (Rusko & Španělsko), a také všechny města, i ta bez zákazníků (Varšava, Bělehrad & Los Angeles). Zbývající 4 řádky jsou stejné jako v dotazu pomocí INNER JOIN.
LEFT JOIN – záleží na pořadí tabulek
Zatímco pořadí JOINs v INNER JOIN není důležité, stejné nestojí za LEFT JOIN. Když používáme LEFT JOIN k připojení více tabulek, je důležité si uvědomit, že toto spojení bude zahrnovat všechny řádky z tabulky na levé straně JOIN. Změníme uspořádání předchozího dotazu:
Nejprve byste mohli snadno říci, že tento a předchozí dotaz jsou stejné (to platí při použití INNER JOIN). Použili jsme stejné tabulky, LEFT JOINs a stejné podmínky připojení. Nejprve se podívejme na výstup:
Co se tady stalo? Proč máme 4 řádky (stejné 4, které jsme měli, když jsme použili INNER JOIN)?
Odpověď je jednoduchá a souvisí s tím, jak LEFT JOIN funguje. Vezme první tabulku (zákazník) a spojí všechny její řádky (4 z nich) s další tabulkou (město). Výsledkem jsou 4 řádky, protože zákazník mohl patřit pouze do 1 města. Potom spojíme tyto 4 řádky s další tabulkou (zemí) a opět máme 4 řádky, protože město může patřit pouze jedné zemi.
Důvod, proč bychom se k těmto 3 stolům v této způsob je dán textem příkladu # 2. Dotaz je napsán takovým způsobem, že vrací 4 řádky, které by byly odpovědí na následující: Vrátí jména všech zákazníků i měst a zemí, ve kterých se nacházejí. Vrátí i zákazníky bez souvisejících měst a zemí.
- Poznámka: Pokud používáte LEFT JOIN, je důležité pořadí tabulek v tomto příkazu a pokud toto pořadí změníte, dotaz vrátí jiný výsledek. Pořadí ve skutečnosti závisí na tom, co chcete jako výsledek vrátit.
Propojte více tabulek pomocí obou – INNER JOIN & LEFT JOIN
To je také možné. Pojďme znovu na příklad.
# 3 Vraťte seznam všech zemí a měst, které mají pár (kromě zemí, na které neodkazuje žádné město). U těchto párů vraťte všechny zákazníky. Vraťte sudé páry, které nemají jediného zákazníka.
Dotaz, který dělá danou práci, je:
Výsledek dotazu je uveden na následujícím obrázku:
Můžete si snadno všimnout, že nemáme země bez jakéhokoli souvisejícího města (to bylo Španělsko & Rusko). INNER JOIN tyto řádky vyloučil. Přesto máme citace bez zákazníků (Bělehrad, Los Angeles & Varšava). To je výsledek skutečnosti, že jsme použili LEFT JOIN mezi tabulkami city a zákazníkem.
Závěr
Pokud potřebujete připojit více tabulek, máte INNER & LEFT JOIN, který máte k dispozici (RIGHT JOIN se používá jen zřídka a lze jej snadno nahradit LEFT JOIN). Které spojení použijete, závisí přímo na úkolu, který potřebujete vyřešit, a během toho získáte pocit. V nadcházejících článcích probereme, jak přemýšlet a organizovat se, když potřebujete psát složitější dotazy.
Obsah
Naučte se SQL: CREATE DATABASE & CREATE TABLE Operations
Learn SQL: INSERT INTO TABLE
Learn SQL: Primary Key
Learn SQL: Foreign Key
Learn SQL: SELECT prohlášení
Naučte se SQL: INNER JOIN vs LEFT JOIN
Naučte se SQL: Skripty SQL
Naučte se SQL: Typy vztahů
Naučte se SQL: Připojte se k více tabulkám
Naučte se SQL: Agregační funkce
Naučte se SQL: Jak psát komplexní SELECT Dotaz
Naučte se SQL: Databáze INFORMATION_SCHEMA
Naučte se SQL: Datové typy SQL
Naučte se SQL: Teorie množin
Learn SQL: User-Defined Functions
Learn SQL: User-Defined Stored Procedures
Learn SQL: SQL Views
Naučte se SQL: Spouštěče SQL
Naučte se SQL: Procvičujte dotazy SQL
Naučte se SQL: SQL Příklady dotazů
Naučte se SQL: Vytvořte sestavu ručně pomocí dotazů SQL
Naučte se SQL: Funkce data a času na serveru SQL
Naučte se SQL: Vytvářejte sestavy serveru SQL pomocí funkcí data a času
Naučte se SQL: kontingenční tabulky serveru SQL
Naučte se SQL: Export serveru SQL do aplikace Excel
Naučte se SQL: Úvod do smyček serveru SQL
Naučte se SQL: Kurzory serveru SQL
Naučte se SQL: Osvědčené postupy pro odstraňování a aktualizaci dat
Naučte se SQL: Konvence pojmenování
Naučte se SQL: Úlohy související s SQL
Learn SQL: Non-Equi Joins in SQL Server
Learn SQL: SQL Injection
- autor
- poslední příspěvky
Jeho minulé i současné angažmá se liší od návrhu a kódování databází, přes výuku, konzultace a psaní o databázích. Nezapomeňte také na BI, vytváření algoritmů, šachy, filatelie, 2 psi, 2 kočky, 1 manželka, 1 dítě …
Najdete ho na LinkedIn
Zobrazit všechny příspěvky od Emila Drkusica
- Learn SQL: SQL Injection – 2. listopadu 2020
- Learn SQL: Non-Equi Joins in SQL Server – 29. září 2020
- Learn SQL: Úlohy související s SQL – 1. září 2020