SQLShack (Čeština)

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
Emil je databázový profesionál s více než 10 lety zkušeností ve všem, co souvisí s databázemi . Během let pracoval v IT a finančním průmyslu a nyní pracuje na volné noze.
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

Poslední příspěvky Emila Drkusiče (zobrazit všechny)
  • 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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *