SQLShack (Čeština)

INNER JOIN vs LEFT JOIN, to je otázka. Dnes si stručně vysvětlíme, jak se oba tyto dva typy spojení používají a jaký je rozdíl. Toto téma si znovu projdeme později, až rozšíříme náš model a budeme moci psát mnohem složitější dotazy.

Změny v datech

Než porovnáme INNER JOIN vs VLEVO SE PŘIPOJTE, podívejme se, co v současné době víme. Doposud jsme v této sérii vysvětlili základy databáze – jak vytvořit databázi a tabulky, jak naplnit tabulky daty a pomocí jednoduchých dotazů zkontrolovat, co je v nich uloženo. V předchozím článku jsme se dokonce připojili ke dvěma stolům. Nyní jsme připraveni na další krok.

Než k tomu ale přejdeme, uděláme jen jednu malou změnu naše data. Do tabulky zemí přidáme 2 řádky pomocí následujících příkazů INSERT INTO:

Nyní zkontrolujeme obsah obou tabulek:

Můžete si snadno všimnout, že v zemi tabulky máme 2 nové řádky, jeden pro Španělsko a jeden pro Rusko. Jejich ID jsou 6 a 7. Všimněte si také, že v tabulce měst není žádný identifikátor země s hodnotou 6 nebo 7. To jednoduše znamená, že v naší databázi nemáme město z Ruska nebo Španělska. Tuto skutečnost použijeme později.

INNER JOIN

Pojďme si probrat tyto dva dotazy:

Výsledek, který vrátí, je uveden na obrázku níže:

Oba dotazy vracejí přesně stejný výsledek. To není náhodou, ale výsledek skutečnosti, že se jedná o stejný dotaz napsaný dvěma různými způsoby. Oba způsoby jsou správné a můžete použít kterýkoli z nich.

V prvním dotazu jsme uvedli všechny tabulky, které používáme, v části FROM dotazu (FROM country, city) a poté šli s join podmínka v WHERE části dotazu (WHERE city.country_id = country.id). V případě, že jsme zapomněli zapsat tuto podmínku spojení, měli bychom kartézský součin obou tabulek.

Ve druhém dotazu máme pouze jednu tabulku v FROM části dotazu (FROM country) a pak máme druhou tabulku a podmínku JOIN v části JOIN dotazu (INNER JOIN city ON city.country_id = country.id).

I když jsou oba dotazy dobře napsané, navrhuji, aby vždy použijete INNER JOIN namísto výpisu tabulek a jejich spojení v WHERE části dotazu. Má to několik důvodů:

  • Čitelnost je mnohem lepší, protože použitá tabulka a související podmínky PŘIPOJENÍ jsou stejné čára. Můžete snadno zjistit, zda jste vynechali podmínku PŘIPOJENÍ nebo ne
  • Pokud chcete později použít další PŘIPOJENÍ (LEVÝ nebo PRAVÝ), nemůžete to udělat (snadno), pokud jste předtím nepoužili VNITŘNÍ PŘIPOJENÍ to

Pojďme nyní komentovat, jaké dotazy se skutečně vrátily:

  • Všechny páry zemí a měst, které spolu souvisejí (pomocí cizího klíče)
  • V seznamu nemáme 2 země (Španělsko a Rusko), protože v tabulce měst nemají žádné související město.

LEFT JOIN

Zopakuji to – „Nemáme na seznamu 2 země (Španělsko a Rusko), protože v tabulce měst nemají žádné související město.“ To se ukáže jako zásadní při porovnání INNER JOIN vs LEFT JOIN.

V některých případech chceme mít ve svých výsledcích i tyto záznamy. Například si jednoduše přejete vidět ve výsledku, že tyto země nemají související záznamy v jiné tabulce. Mohlo by to být součástí nějaké kontroly, nebo jen počítání případů atd. Bez ohledu na to, jaká je motivace této touhy, měli bychom být technicky schopni to udělat. A my jsme. V databázích LEFT JOIN dělá přesně tohle.

Výsledek LEFT JOIN bude stejný jako výsledek INNER JOIN + budeme mít řádky z „levé“ tabulky, bez dvojice v „pravý“ stůl. Použijeme stejný dotaz INNER JOIN a slovo INNER jednoduše nahradíme LEFT. Toto je výsledek:

Můžete si snadno všimnout, že ve srovnání s výsledkem VNITŘNÍ máme další 2 řádky PŘIPOJTE se k dotazu. Toto jsou řádky pro Rusko a Španělsko. Protože oba nemají žádné související město, mají všechny atributy města v těchto dvou řádcích hodnoty NULL (nejsou definovány). To je největší rozdíl při porovnávání VNITŘNÍHO PŘIPOJENÍ proti LEVÉMU PŘIPOJENÍ.

SPRÁVNÉ PŘIPOJENÍ

O SPRÁVNÉM PŘIPOJENÍ budete alespoň slyšet. Používá se jen zřídka, protože vrací stejný výsledek jako LEFT JOIN. Na druhou stranu jsou dotazy, které používají LEFT JOIN, mnohem snazší číst, protože jednoduše vypisujeme tabulky jeden po druhém.

Toto je ekvivalent předchozího dotazu používajícího RIGHT JOIN:

Můžete si všimnout, že vrácené hodnoty jsou stejné, pouze v tomto případě jsou hodnoty z tabulky měst v prvních 5 sloupcích a country- související hodnoty přicházejí za nimi.

VNITŘNÍ PŘIPOJENÍ vs LEVÉ PŘIPOJENÍ

VNITŘNÍ PŘIPOJENÍ vs LEVÉ PŘIPOJENÍ?Ve skutečnosti to vůbec není otázka. INNER JOIN použijete, pokud chcete vrátit pouze záznamy, které mají pár na obou stranách, a LEFT JOIN použijete, když potřebujete všechny záznamy z „levé“ tabulky, bez ohledu na to, zda mají pár v „pravé“ tabulce nebo ne. Pokud budete potřebovat všechny záznamy z obou tabulek, bez ohledu na to, zda mají pár, budete muset použít CROSS JOIN (nebo jej simulovat pomocí LEFT JOINs a UNION). Více o tom v následujících článcích.

Obsah

Naučte se SQL: CREATE DATABASE & CREATE TABLE Operations

Learn SQL: INSERT INTO TABLE

Learn SQL: Primary Key

Learn SQL: Foreign Key

Naučte se SQL: Příkaz SELECT

Naučte se SQL: VNITŘNÍ PŘIPOJENÍ vs LEVÉ PŘIPOJENÍ

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 napsat komplexní dotaz SELECT

Naučte se SQL: Databáze INFORMATION_SCHEMA

Naučte se SQL: Datové typy SQL

Naučte se SQL: Teorie množin

Naučte se SQL: Uživatelem definované funkce

Naučte se SQL: Uživatelsky definované uložené procedury

Naučte se SQL: Zobrazení SQL

Naučte se SQL: Spouštěče SQL

Naučte se SQL: Procvičujte dotazy SQL

Learn SQL: SQL Query examples

Learn SQL: Create a report manually 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 mazání a aktualizaci dat

Naučte se SQL: Konvence pojmenování

Naučte se SQL: Úlohy související s SQL

Naučte se SQL: Non-Equi se připojuje na SQL Server

Naučte se SQL: SQL Vstřikování

  • autor
  • poslední příspěvky
Emil je databázový profesionál s více než 10 lety zkušeností ve všem, co se týká databází. 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 od Emila Drkusica (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 *