inner join vs outer join
Vnitřní připojení Vs vnější připojení: Připravte se na prozkoumání přesných rozdílů mezi vnitřním a vnějším připojením
Než prozkoumáme rozdíly mezi Inner Join Vs Outer Join, nejprve se podívejme, co je to SQL JOIN?
Klauzule join se používá ke kombinování záznamů nebo k manipulaci se záznamy ze dvou nebo více tabulek prostřednictvím podmínky spojení. Podmínka spojení označuje, jak se sloupce z každé tabulky porovnávají proti sobě.
Spojení je založeno na souvisejícím sloupci mezi těmito tabulkami. Nejběžnějším příkladem je spojení mezi dvěma tabulkami prostřednictvím sloupce primárního klíče a sloupce cizího klíče.
Předpokládejme, že máme tabulku, která obsahuje plat zaměstnanců, a existuje další tabulka, která obsahuje podrobnosti o zaměstnancích.
V tomto případě bude existovat společný sloupec jako ID zaměstnance, který se k těmto dvěma tabulkám připojí. Tento sloupec ID zaměstnance by byl primárním klíčem tabulek podrobností o zaměstnancích a cizím klíčem v tabulce platů zaměstnanců.
Je velmi důležité mít společný klíč mezi těmito dvěma entitami. Můžete si představit tabulku jako entitu a klíč jako společné propojení mezi dvěma tabulkami, které se používá pro operaci spojení.
dual wan bezdrátový router vyvažování zátěže
V zásadě existují dva typy spojení v SQL, tj. Vnitřní připojení a vnější připojení . Vnější spojení se dále dělí na tři typy, tj. Levý vnější spoj, pravý vnější spoj a plný vnější spoj.
V tomto článku uvidíme rozdíl mezi Vnitřní připojení a vnější připojení podrobně. Udržujeme křížové a nerovné spojení mimo rozsah tohoto článku.
Co se naučíte:
- Co je vnitřní připojení?
- Co je vnější připojení?
- Rozdíl mezi vnitřním a vnějším spojením
- Výkon
- MS Access vnitřní a vnější spojení
- Left Join vs Left Outer Join
- Levý vnější spoj vs Pravý vnější spoj
- Rozdíl mezi vnitřním a vnějším spojením v tabulkovém formátu
- Vnitřní a vnější připojení vs unie
- Závěr
- Doporučené čtení
Co je vnitřní připojení?
Vnitřní spojení vrátí pouze řádky, které mají shodné hodnoty v obou tabulkách (uvažujeme zde, že spojení se provádí mezi dvěma tabulkami).
Co je vnější připojení?
Vnější spojení zahrnuje odpovídající řádky i některé neodpovídající řádky mezi dvěma tabulkami. Vnější spojení se v zásadě liší od vnitřního spojení v tom, jak zachází s podmínkou falešné shody.
Existují 3 typy vnějšího spojení:
- Levý vnější spoj : Vrátí všechny řádky z LEVÉ tabulky a odpovídající záznamy mezi oběma tabulkami.
- Pravý vnější spoj : Vrátí všechny řádky z PRAVÉ tabulky a odpovídající záznamy mezi oběma tabulkami.
- Úplné vnější připojení : Kombinuje výsledek levého vnějšího spojení a pravého vnějšího spojení.
Rozdíl mezi vnitřním a vnějším spojením
(obraz zdroj )
Jak ukazuje výše uvedený diagram, existují dvě entity, tj. Tabulka 1 a tabulka 2 a obě tabulky sdílejí některá společná data.
Vnitřní spojení vrátí společnou oblast mezi těmito tabulkami (zelená stínovaná oblast ve výše uvedeném diagramu), tj. Všechny záznamy, které jsou společné mezi tabulkou 1 a tabulkou 2.
Levé vnější spojení vrátí všechny řádky z tabulky 1 a pouze ty řádky z tabulky 2, které jsou společné také s tabulkou 1. Správný vnější spoj bude mít pravý opak. Poskytne všechny záznamy z tabulky 2 a pouze odpovídající odpovídající záznamy z tabulky 1.
Full Outer Join nám dále poskytne všechny záznamy z tabulek 1 a 2.
Začněme příkladem, který to objasní.
Předpokládejme, že máme dva tabulky: EmpDetails a EmpSalary .
Tabulka EmpDetails:
ID zaměstnance | Jméno zaměstnance |
7 | Lilie |
1 | John |
dva | Samantha |
3 | Žádný |
4 | Hedvábný |
5 | RAM |
6 | Arpit |
8 | Sita |
9 | Farah |
10 | Jerry |
Tabulka EmpSalary:
ID zaměstnance | Jméno zaměstnance | Zaměstnanecký plat |
---|---|---|
jedenáct | Růže | 90000 |
1 | John | 50 000 |
dva | Samantha | 120000 |
3 | Žádný | 75 000 |
4 | Hedvábný | 25 000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
12 | Sakši | 45000 |
13 | Zvedák | 250 000 |
Pojďme udělat vnitřní spojení na těchto dvou stolech a sledovat výsledek:
Dotaz:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails INNER JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Výsledek:
ID zaměstnance | Jméno zaměstnance | Zaměstnanecký plat |
---|---|---|
7 | Lilie | NULA |
1 | John | 50 000 |
dva | Samantha | 120000 |
3 | Žádný | 75 000 |
4 | Hedvábný | 25 000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
Ve výše uvedené sadě výsledků můžete vidět, že Inner join vrátil prvních 6 záznamů, které byly přítomny v EmpDetails i EmpSalary s odpovídajícím klíčem, tj. EmployeeID. Pokud jsou tedy A a B dvě entity, vrátí Vnitřní spojení sadu výsledků, která se bude rovnat „Záznamům v A a B“, na základě klíče shody.
Podívejme se nyní, co udělá Left Outer Join.
Dotaz:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails LEFT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Výsledek:
ID zaměstnance | Jméno zaměstnance | Zaměstnanecký plat |
---|---|---|
1 | John | 50 000 |
dva | Samantha | 120000 |
3 | Žádný | 75 000 |
4 | Hedvábný | 25 000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
8 | Sita | NULA |
9 | Farah | NULA |
10 | Jerry | NULA |
Ve výše uvedené sadě výsledků můžete vidět, že levé vnější spojení vrátilo všech 10 záznamů z LEVÉ tabulky, tj. Tabulky EmpDetails, a protože se shoduje prvních 6 záznamů, vrátil plat zaměstnanců pro tyto odpovídající záznamy.
Protože zbytek záznamů nemá odpovídající klíč v RIGHT tabulce, tj. EmpSalary tabulka, vrátil NULL odpovídající těmto. Protože Lily, Sita, Farah a Jerry nemají odpovídající ID zaměstnance v tabulce EmpSalary, jejich plat se ve výsledkové sadě zobrazuje jako NULL.
Pokud jsou tedy A a B dvě entity, pak levé vnější spojení vrátí sadu výsledků, která se bude rovnat „Záznamům v A NOT B“, na základě shodného klíče.
Nyní sledujme, co dělá Správné vnější spojení.
Dotaz:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalary FROM EmpDetails RIGHT join EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Výsledek:
ID zaměstnance | Jméno zaměstnance | Zaměstnanecký plat |
---|---|---|
NULA | NULA | 90000 |
1 | John | 50 000 |
dva | Samantha | 120000 |
3 | Žádný | 75 000 |
4 | Hedvábný | 25 000 |
5 | RAM | 150000 |
6 | Arpit | 80000 |
NULA | NULA | 250 000 |
NULA | NULA | 250 000 |
Ve výše uvedené sadě výsledků vidíte, že pravé vnější spojení provedlo pravý opak levého spojení. Vrátila všechny platy z pravé tabulky, tj. Tabulky EmpSalary.
Ale protože Rose, Sakshi a Jack nemají odpovídající ID zaměstnance v levé tabulce, tj. V tabulce EmpDetails, máme jejich ID zaměstnance a EmployeeName jako NULL z levé tabulky.
Pokud jsou tedy A a B dvě entity, pak pravé vnější spojení vrátí sadu výsledků, která se bude rovnat ‚Záznamům v B NENÍ A ', na základě shodného klíče.
Podívejme se také, co bude výsledková sada, pokud provádíme operaci výběru na všech sloupcích v obou tabulkách.
Dotaz:
SELECT * FROM EmpDetails RIGHT JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Výsledek:
ID zaměstnance | Jméno zaměstnance | ID zaměstnance | Jméno zaměstnance | Zaměstnanecký plat |
---|---|---|---|---|
NULA | NULA | jedenáct | Růže | 90000 |
1 | John | 1 | John | 50 000 |
dva | Samantha | dva | Samantha | 120000 |
3 | Žádný | 3 | Žádný | 75 000 |
4 | Hedvábný | 4 | Hedvábný | 25 000 |
5 | RAM | 5 | RAM | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
NULA | NULA | 12 | Sakši | 250 000 |
NULA | NULA | 13 | Zvedák | 250 000 |
Pojďme nyní k úplnému připojení.
Úplné vnější spojení se provádí, když chceme všechna data z obou tabulek bez ohledu na to, zda existuje shoda nebo ne. Pokud tedy chci všechny zaměstnance, i když nenajdu odpovídající klíč, spustím dotaz, jak je uvedeno níže.
Dotaz:
SELECT * FROM EmpDetails FULL JOIN EmpSalary ON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Výsledek:
ID zaměstnance | Jméno zaměstnance | ID zaměstnance | Jméno zaměstnance | Zaměstnanecký plat |
---|---|---|---|---|
7 | Lilie | NULA | NULA | NULA |
1 | John | 1 | John | 50 000 |
dva | Samantha | dva | Samantha | 120000 |
3 | Žádný | 3 | Žádný | 75 000 |
4 | Hedvábný | 4 | Hedvábný | 25 000 |
5 | RAM | 5 | RAM | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
8 | Sita | NULA | NULA | NULA |
9 | Farah | NULA | NULA | NULA |
10 | Jerry | NULA | NULA | NULA |
NULA | NULA | jedenáct | Růže | 90000 |
NULA | NULA | 12 | Sakši | 250 000 |
NULA | NULA | 13 | Zvedák | 250 000 |
Ve výše uvedené sadě výsledků můžete vidět, že protože prvních šest záznamů se shoduje v obou tabulkách, máme všechna data bez NULL. Další čtyři záznamy existují v levé tabulce, ale ne v pravé tabulce, takže odpovídající data v pravé tabulce mají hodnotu NULL.
Poslední tři záznamy existují v pravé tabulce a ne v levé tabulce, proto máme NULL v odpovídajících datech z levé tabulky. Pokud jsou tedy A a B dvě entity, úplné vnější spojení vrátí sadu výsledků, která se bude rovnat „Záznamům v A AND B“, bez ohledu na odpovídající klíč.
Teoreticky se jedná o kombinaci připojení vlevo a vpravo.
Výkon
Pojďme porovnat vnitřní spojení s levým vnějším spojením na serveru SQL. Když mluvíme o rychlosti operace, levý vnější JOIN samozřejmě není rychlejší než vnitřní spojení.
Podle definice vnější spojení, ať už je to levé nebo pravé, musí provádět veškerou práci vnitřního spojení spolu s další prací s nulovým rozšířením výsledků. Očekává se, že vnější spojení vrátí větší počet záznamů, což dále zvýší jeho celkovou dobu provádění jen kvůli větší sadě výsledků.
Vnější spojení je tedy pomalejší než vnitřní spojení.
Kromě toho mohou nastat některé konkrétní situace, kdy bude levé spojení rychlejší než vnitřní spojení, ale nemůžeme pokračovat v jejich vzájemném nahrazování, protože levé vnější spojení není funkčně ekvivalentní vnitřnímu spojení.
Pojďme diskutovat o instanci, kde by levé spojení mohlo být rychlejší než vnitřní spojení. Pokud jsou tabulky zapojené do operace spojení příliš malé, řekněme, že mají méně než 10 záznamů a tabulky nemají dostatečné indexy k pokrytí dotazu, v takovém případě je levé spojení obecně rychlejší než vnitřní spojení.
Vytvořme si níže uvedené dvě tabulky a jako příklad proveďme VNITŘNÍ PŘIPOJENÍ a LEVÝ VNĚJŠÍ PŘIPOJENÍ mezi nimi:
CREATE TABLE #Table1 ( ID int NOT NULL PRIMARY KEY, Name varchar(50) NOT NULL ) INSERT #Table1 (ID, Name) VALUES (1, 'A') INSERT #Table1 (ID, Name) VALUES (2, 'B') INSERT #Table1 (ID, Name) VALUES (3, 'C') INSERT #Table1 (ID, Name) VALUES (4, 'D') INSERT #Table1 (ID, Name) VALUES (5, 'E') CREATE TABLE #Table2 ( ID int NOT NULL PRIMARY KEY, Name varchar(50) NOT NULL ) INSERT #Table2 (ID, Name) VALUES (1, 'A') INSERT #Table2 (ID, Name) VALUES (2, 'B') INSERT #Table2 (ID, Name) VALUES (3, 'C') INSERT #Table2 (ID, Name) VALUES (4, 'D') INSERT #Table2 (ID, Name) VALUES (5, 'E') SELECT * FROM #Table1 t1 INNER JOIN #Table2 t2 ON t2.Name = t1.Name
ID | název | ID | název | |
---|---|---|---|---|
Níže je vizualizace vnitřního spojení: ![]() | Níže je vizualizace vnějšího spojení ![]() | |||
1 | 1 | NA | 1 | NA |
dva | dva | B | dva | B |
3 | 3 | C | 3 | C |
4 | 4 | D | 4 | D |
5 | 5 | JE | 5 | JE |
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
ID | název | ID | název | |
---|---|---|---|---|
1 | 1 | NA | 1 | NA |
dva | dva | B | dva | B |
3 | 3 | C | 3 | C |
4 | 4 | D | 4 | D |
5 | 5 | JE | 5 | JE |
Jak vidíte výše, oba dotazy vrátily stejnou sadu výsledků. V tomto případě, pokud zobrazíte plán provádění obou dotazů, pak zjistíte, že vnitřní spojení stálo více než vnější spojení. Důvodem je, že pro vnitřní spojení server SQL provede hash shodu, zatímco pro levé spojení vytvoří vnořené smyčky.
Zápas hash je obvykle rychlejší než vnořené smyčky. Ale v tomto případě, protože počet řádků je tak malý a neexistuje žádný index k použití (jak to děláme spojení ve sloupci názvu), hash operace se ukázala jako nejdražší dotaz na vnitřní spojení.
Pokud však změníte odpovídající klíč v dotazu na spojení z Název na ID a pokud je v tabulce velký počet řádků, zjistíte, že vnitřní spojení bude rychlejší než levé vnější spojení.
MS Access vnitřní a vnější spojení
Když používáte více zdrojů dat v dotazu MS Access, pak použijete JOINy pro ovládání záznamů, které chcete vidět, v závislosti na tom, jak jsou zdroje dat navzájem propojeny.
Ve vnitřním spojení se v jedné výsledkové sadě kombinují pouze související z obou tabulek. Toto je výchozí připojení v Accessu a také nejčastěji používané. Pokud použijete spojení, ale výslovně neurčíte, o jaký typ spojení se jedná, Access předpokládá, že se jedná o vnitřní spojení.
Ve vnějších spojeních jsou všechna související data z obou tabulek správně kombinována plus všechny zbývající řádky z jedné tabulky. V úplném vnějším spojení se všechna data kombinují, kdykoli je to možné.
Left Join vs Left Outer Join
Na serveru SQL je klíčové slovo vnější volitelné, když použijete levé vnější spojení. Nezáleží tedy na tom, zda napíšete „LEFT OUTER JOIN“ nebo „LEFT JOIN“, protože oba vám poskytnou stejný výsledek.
LEFT JOIN B je ekvivalentní syntaxe A LEFT OUTER JOIN B.
Níže je uveden seznam ekvivalentních syntaxí na serveru SQL:
jak naprogramovat počítač pro začátečníky
(obraz zdroj )
Levý vnější spoj vs Pravý vnější spoj
Tento rozdíl jsme již viděli v tomto článku. Rozdíl můžete zobrazit v dotazech Levá vnější spojka a Pravá vnější spojka a sada výsledků.
Hlavní rozdíl mezi levým a pravým spojením spočívá v zahrnutí neshodných řádků. Levé vnější spojení zahrnuje nepřizpůsobené řádky z tabulky, která je nalevo od klauzule join, zatímco pravé vnější spojení zahrnuje neodpovídající řádky z tabulky, která je napravo od klauzule join.
Lidé se ptají, co je lepší použít, tj. Levé připojení nebo pravé připojení? V zásadě se jedná o stejný typ operací, s výjimkou obrácených argumentů. Proto, když se ptáte, které spojení použít, vlastně se ptáte, zda napsat a A. Je to jen otázka preference.
Obecně platí, že lidé dávají přednost použití Left join ve svém SQL dotazu. Navrhoval bych, že byste měli zůstat konzistentní ve způsobu, jakým píšete dotaz, abyste předešli jakýmkoli nejasnostem při interpretaci dotazu.
Zatím jsme viděli vše o vnitřním spojení a všech typech vnějších spojení. Pojďme rychle shrnout rozdíl mezi vnitřním a vnějším spojením.
Rozdíl mezi vnitřním a vnějším spojením v tabulkovém formátu
Vnitřní spojení | Vnější připojení |
---|---|
Vrátí pouze řádky, které mají shodné hodnoty v obou tabulkách. | Zahrnuje shodné řádky i některé neodpovídající řádky mezi dvěma tabulkami. |
V případě, že je v tabulkách velký počet řádků a existuje index, který se má použít, je INNER JOIN obecně rychlejší než OUTER JOIN. | Obecně je VNĚJŠÍ PŘIPOJENÍ pomalejší než VNITŘNÍ PŘIPOJENÍ, protože ve srovnání s VNITŘNÍM PŘIPOJENÍ potřebuje vrátit větší počet záznamů. Mohou však existovat některé konkrétní scénáře, kdy je OUTER JOIN rychlejší. |
Pokud shoda není nalezena, nic nevrací. | Když shoda není nalezena, je NULL umístěna do vrácené hodnoty sloupce. |
Použijte INNER JOIN, pokud chcete vyhledat podrobné informace o konkrétním sloupci. | Použijte OUTER JOIN, pokud chcete zobrazit seznam všech informací ve dvou tabulkách. |
INNER JOIN funguje jako filtr. Aby vnitřní spojení vrátilo data, musí být v obou tabulkách shoda. | Chovají se jako doplňky dat. |
Pro vnitřní spojení existuje implicitní notace spojení, která v klauzuli FROM obsahuje tabulky, které mají být spojeny způsobem odděleným čárkami. Příklad: SELECT * FROM product, category WHERE product.CategoryID = category.CategoryID; | Pro vnější spojení neexistuje žádná implicitní notace spojení. |
Vnitřní a vnější připojení vs unie
Někdy si pleteme Join and Union a toto je také jedna z nejčastěji kladených otázek Rozhovory SQL . Už jsme viděli rozdíl mezi vnitřním spojením a vnějším spojením. Nyní se podívejme, jak se JOIN liší od UNIE.
UNION umístí řadu dotazů za sebou, zatímco join vytvoří kartézský produkt a nastaví jej podskupinu. UNION a JOIN jsou tedy zcela odlišné operace.
Spustíme níže uvedené dva dotazy v MySQL a uvidíme jejich výsledek.
Dotaz UNION:
SELECT 28 AS bah UNION SELECT 35 AS bah;
Výsledek:
Bah | |
---|---|
1 | 28 |
dva | 35 |
JOIN Query:
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS bar ON (55=55);
Výsledek:
foo | Bar | |
---|---|---|
1 | 38 | 35 |
Operace UNION vloží výsledek dvou nebo více dotazů do jedné sady výsledků. Tato sada výsledků obsahuje všechny záznamy, které jsou vráceny prostřednictvím všech dotazů zapojených do UNION. V zásadě tedy UNIE kombinuje dvě výsledkové sady dohromady.
Operace spojení načte data ze dvou nebo více tabulek na základě logických vztahů mezi těmito tabulkami, tj. Na základě podmínky spojení. V dotazu na spojení se data z jedné tabulky používají k výběru záznamů z jiné tabulky. Umožňuje propojit podobná data, která jsou k dispozici v různých tabulkách.
Abychom to velmi jednoduše pochopili, můžete říci, že UNION kombinuje řádky ze dvou tabulek, zatímco spojení kombinuje sloupce ze dvou nebo více tabulek. Oba se tedy používají ke kombinování dat z n tabulek, ale rozdíl spočívá v tom, jak jsou data kombinována.
Níže jsou obrázková znázornění UNION a JOIN.
Výše uvedené je obrazové znázornění operace spojení znázorňující, že každý záznam ve výsledkové sadě obsahuje sloupce z obou tabulek, tj. Tabulky A a tabulky B. Tento výsledek je vrácen na základě podmínky spojení použité v dotazu.
Spojení je obecně výsledkem denormalizace (opak normalizace) a používá cizí klíč jedné tabulky k vyhledání hodnot sloupců pomocí primárního klíče v jiné tabulce.
Výše uvedené je obrazové znázornění operace UNION znázorňující, že každý záznam v sadě výsledků je řádek z jedné ze dvou tabulek. Výsledek UNIE tedy spojil řádky z tabulky A a tabulky B.
Další čtení = >> MySQL UNION vysvětleno na příkladech
Závěr
V tomto článku jsme viděli hlavní rozdíly mezi Vnitřní spojení a vnější spojení v SQL . Také jsme viděli klasifikaci vnějšího spojení, tj. Levého spojení, pravého spojení a úplného spojení. Viděli jsme, jak každý z těchto typů spojení funguje a jak se od sebe liší.
Také jsme provedli nějaké srovnání výkonu mezi těmito typy spojení. Také jsme diskutovali o tom, jak se spojení liší od unie.
Přečtěte si také = >> Typy připojení MySQL
Doufám, že vám tento článek pomůže vyjasnit vaše pochybnosti ohledně rozdílů mezi různými typy spojení. Jsme si jisti, že to vás skutečně přiměje rozhodnout, ze kterého typu spojení si můžete vybrat na základě požadované sady výsledků.
Doporučené čtení
- Přesný rozdíl mezi ověřením a ověřením pomocí příkladů
- Modem Vs Router: Znát přesný rozdíl
- Rozdíl mezi SQL Vs MySQL Vs SQL Server (s příklady)
- Výukový program Python DateTime s příklady
- LAN V WAN V MAN: Přesný rozdíl mezi typy sítí
- Vyjmout příkaz v Unixu s příklady
- Syntaxe příkazů Unix Cat, možnosti s příklady
- Použití kurzoru v MongoDB s příklady