Vnitřní i vnější spojení se používají ke kombinování dat ze dvou nebo více tabulek; existují však některé klíčové rozdíly! V tomto článku najdete informace o silných stránkách jednotlivých příkazů a o tom, kdy je použít.
Chcete-li toto a naše další lekce využít naplno, nezapomeňte si procvičit příklady!
Všechny příklady této lekce jsou založeny na Microsoft SQL Server Management Studio a databázi AdventureWorks2012. Začněte používat tyto bezplatné nástroje pomocí mého průvodce Začínáme s používáním serveru SQL Server.
Jaký je rozdíl mezi vnitřními a vnějšími spoji?
Vnitřní a vnější spojení jsou kombinované řádky ze dvou nebo více tabulek do jednoho výsledku pomocí podmínky spojení. Podmínka spojení určuje, jak jsou sloupce z každé tabulky vzájemně porovnány. Ve většině případů je cílem najít stejné hodnoty mezi tabulkami a zahrnout tyto shody.
Nejběžnějším případem je, když porovnáváte cizí klíč jedné tabulky s primárním klíčem jiné. , například při použití a ID k vyhledání hodnoty.
Ačkoli vnitřní i vnější spojení zahrnují řádky z obou tabulek, když je podmínka shody úspěšná, liší se v tom, jak zacházejí s podmínkou falešné shody.
Vnitřní spojení neobsahují neodpovídající řádky; vzhledem k tomu, že vnější spojení je zahrnují.
Pojďme se ponořit trochu hlouběji do mechaniky každého
Mechaniky vnitřního spojení
K vrácení výsledků se používá vnitřní spojení. kombinací řádků ze dvou nebo více tabulek.
V nejjednodušším případě, kde není podmínka spojení, by vnitřní spojení kombinovalo všechny řádky z jedné tabulky s těmi z jiné. Pokud by první tabulka obsahovala tři řádky a druhá čtyři, pak by konečný výsledek obsahoval dvanáct (3 x 4 = 12)!
Účelem podmínky spojení je omezit, které řádky jsou kombinovány. Ve většině případů omezujeme řádky na ty, které odpovídají sloupci.
Pokud má osoba více než jedno telefonní číslo, dojde k více než jedné shodě. Z toho vidíte, že můžeme získat více řádků, než kolik máme pro každou osobu.
Naopak, pokud osoba nemá žádné telefonní číslo, nebude v PersonPhone žádná položka a nebude provedena žádná shoda. Tato konkrétní osoba nebude zahrnuta do výsledků, protože jsou zahrnuty pouze osoby se shodami.
Zkusme příklad.
Příklad vnitřního připojení
Předpokládejme HR manažer chce vytvořit telefonní seznam. Chtějí jméno, příjmení, titul a telefonní čísla dané osoby. Jaký dotaz byste mohli použít k vytvoření tohoto?
Tady je ten, který by stačil:
SELECT P.FirstName, P.LastName, P.Title, PH.PhoneNumberFROM Person.Person AS P INNER JOIN Person.PersonPhone AS PH ON P.BusinessEntityID = PH.BusinessEntityID AND PH.PhoneNumberTypeID = 3ORDER BY P.LastName
INNER JOIN určuje, které tabulky připojit se a podmínka shody. Podmínka PH.Phone NumberTyeID = 3 omezuje dotaz na pracovní čísla.
Pokud spustíte výše uvedené, získáte následující výsledky:
Nezapomeňte, že vnitřní spojení vrátí pouze řádek, kde je podmínka shody je pravda. V tomto příkladu nejsou zahrnuty řádky, kde se BusinessEntityID neshodují. To může být problém, pokud osoba nemá telefonní číslo, protože tito zaměstnanci by na seznamu nebyli.
Pokud chcete tyto zaměstnance zahrnout, můžete použít vnější spojení.
Mechanika vnějšího spojení
Vnější spojení se používá k vrácení výsledků kombinací řádků ze dvou nebo více tabulek. Ale na rozdíl od vnitřního spojení, vnější spojení vrátí každý řádek z jedné zadané tabulky, i když podmínka spojení selže.
Vezměte výše uvedený příklad telefonního adresáře. Pokud by HR manažer chtěl uvést seznam všech zaměstnanců bez ohledu na to, zda mají pracovní telefonní číslo, pak by to bylo pomocí vnějšího spojení.
SELECT P.FirstName, P.LastName, P.Title, PH.PhoneNumberFROM Person.Person AS P LEFT OUTER JOIN Person.PersonPhone AS PH ON P.BusinessEntityID = PH.BusinessEntityID AND PH.PhoneNumberTypeID = 3ORDER BY P.LastName
Můžete dozvědět se více o levém a pravém vnějším spojení v tomto článku, nyní jen pochopte, že když je použit LEFT OUTER JOIN, jsou do výsledku zahrnuty všechny řádky pro tabulku v klauzuli FROM, i když shoda není nalezena s jiná tabulka.
Pokud není nalezena shoda, do sloupce se umístí NULL.
Toto můžete vidět v akci níže:
V příkladu si všimněte Telefonní číslo pro Catherine Abel je NULL. Důvodem je, že Catherineovo pracovní číslo není uvedeno a během spojení nebyla nalezena shoda.
Pokud by to bylo vnitřní spojení, pak by tento řádek nebyl zahrnut do výsledků.