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
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