sql >> Databáze >  >> RDS >> Sqlserver

Přehled typů SQL Join s příklady

SQL JOIN je klauzule, která se používá ke kombinaci více tabulek a načítání dat na základě společného pole v relačních databázích. Databázoví odborníci používají normalizace k zajištění a zlepšení integrity dat. V různých formách normalizace jsou data distribuována do více logických tabulek. Tyto tabulky používají referenční omezení – primární klíč a cizí klíče – k vynucení integrity dat v tabulkách SQL Server. Na obrázku níže vidíme proces normalizace databáze.

Porozumění různým typům SQL JOIN

SQL JOIN generuje smysluplná data kombinací více relačních tabulek. Tyto tabulky spolu souvisí pomocí klíče a mají vztahy jedna k jedné nebo jedna k mnoha. Chcete-li získat správná data, musíte znát požadavky na data a správné mechanismy spojení. SQL Server podporuje více spojení a každá metoda má specifický způsob načítání dat z více tabulek. Níže uvedený obrázek uvádí podporovaná připojení k serveru SQL.

Vnitřní spojení SQL

Vnitřní spojení SQL zahrnuje řádky z tabulek, kde jsou splněny podmínky spojení. Například v níže uvedeném Vennově diagramu vnitřní spojení vrací odpovídající řádky z tabulky A a tabulky B.

V níže uvedeném příkladu si všimněte následujících věcí:

  • Máme dvě tabulky – [Zaměstnanci] a [Adresa].
  • Dotaz SQL je připojen ke sloupci [Zaměstnanci].[ID_zaměstnavatele] a [Adresa].[ID].

Výstup dotazu vrátí záznamy zaměstnanců pro EmpID, které existuje v obou tabulkách.

Vnitřní spojení vrátí odpovídající řádky z obou tabulek; proto je také známý jako Equi join. Pokud klíčové slovo inner nespecifikujeme, SQL Server provede operaci vnitřního spojení.

V jiném typu vnitřního spojení, theta spojení, nepoužíváme operátor rovnosti (=) v klauzuli ON. Místo toho používáme operátory nerovnosti, jako jsou .

SELECT * FROM Table1 T1, Table2 T2 WHERE T1.Price

Vlastní připojení k SQL

Při samopřipojení se SQL Server připojí k tabulce sám se sebou. To znamená, že název tabulky se v klauzuli from objeví dvakrát.

Níže máme tabulku [Emp], která obsahuje údaje o zaměstnancích a jejich manažerech. Vlastní spojení je užitečné pro dotazování na hierarchická data. Například v tabulce zaměstnanců můžeme pomocí vlastního připojení zjistit jméno každého zaměstnance a jeho manažera sestav.

Výše uvedený dotaz vloží vlastní spojení do tabulky [Emp]. Spojí sloupec EmpMgrID se sloupcem EmpID a vrátí odpovídající řádky.

Vzájemné spojení SQL

V křížovém spojení vrátí SQL Server kartézský produkt z obou tabulek. Například na obrázku níže jsme provedli křížové spojení pro tabulku A a B.

Křížové spojení spojuje každý řádek z tabulky A s každým řádkem dostupným v tabulce B. Proto je výstup také známý jako kartézský součin obou tabulek. Na obrázku níže si všimněte následujícího:

  • Tabulka [Zaměstnanec] má tři řádky pro ID zaměstnance 1, 2 a 3.
  • Tabulka [Address] obsahuje záznamy pro Emp ID 1, 2, 7 a 8.

Ve výstupu křížového spojení se řádek 1 tabulky [Zaměstnanec] spojí se všemi řádky tabulky [Adresa] a pro zbývající řádky se řídí stejným vzorem.

Pokud má první tabulka x počet řádků a druhá tabulka má n počet řádků, křížové spojení dá x*n počet řádků na výstupu. U větších tabulek byste se měli vyhnout křížovému spojení, protože může vrátit velké množství záznamů a SQL Server vyžaduje hodně výpočetního výkonu (CPU, paměť a IO) pro zpracování tak rozsáhlých dat.

Vnější spojení SQL

Jak jsme vysvětlili dříve, vnitřní spojení vrací odpovídající řádky z obou tabulek. Při použití vnějšího spojení SQL nejen vypíše odpovídající řádky, ale také vrátí neshodné řádky z ostatních tabulek. Neshodný řádek závisí na levém, pravém nebo úplném klíčovém slovu.

Obrázek níže popisuje na vysoké úrovni levé, pravé a úplné vnější spojení.

Levý vnější spoj

Levé vnější spojení SQL vrátí odpovídající řádky obou tabulek spolu s neodpovídajícími řádky z levé tabulky. Pokud záznam z levé tabulky nemá žádné odpovídající řádky v pravé tabulce, zobrazí záznam s hodnotami NULL.

V níže uvedeném příkladu vrací levé vnější spojení následující řádky:

  • Odpovídající řádky:Emp ID 1 a 2 existuje v levé i pravé tabulce.
  • Nepřiřazený řádek:Emp ID 3 v pravé tabulce neexistuje. Proto máme ve výstupu dotazu hodnotu NULL.

Pravé vnější spojení

Pravé vnější spojení SQL vrátí odpovídající řádky obou tabulek spolu s neodpovídajícími řádky z pravé tabulky. Pokud záznam z pravé tabulky nemá žádné odpovídající řádky v levé tabulce, zobrazí záznam s hodnotami NULL.

V níže uvedeném příkladu máme následující výstupní řádky:

  • Odpovídající řádky:Emp ID 1 a 2 existuje v obou tabulkách; proto jsou tyto řádky odpovídajícími řádky.
  • Nepřiřazené řádky:V pravé tabulce máme další řádky pro Emp ID 7 a 8, ale tyto řádky nejsou dostupné v levé tabulce. Proto pro tyto řádky získáme hodnotu NULL v pravém vnějším spojení.

Úplné vnější spojení

Úplné vnější spojení vrátí ve výstupu následující řádky:

  • Odpovídající řádky mezi dvěma tabulkami.
  • Nepřiřazené řádky podobné levému vnějšímu spojení:hodnoty NULL pro neodpovídající řádky z pravé tabulky.
  • Nepřiřazené řádky podobné pravému vnějšímu spojení:Hodnoty Null pro neodpovídající řádky z levé tabulky.

Spojení SQL s více tabulkami

V předchozích příkladech používáme dvě tabulky v dotazu SQL k provádění operací spojení. Většinou spojujeme více tabulek dohromady a vrací relevantní data.

Níže uvedený dotaz používá více vnitřních spojení.

USE [AdventureWorks2019]
GO
SELECT 
e.[BusinessEntityID] 
,p.[FirstName] 
,p.[MiddleName] 
,p.[LastName] 
,e.[JobTitle]
,d.[Name] AS [Department] 
,d.[GroupName] 
,edh.[StartDate] 
FROM [HumanResources].[Employee] e
INNER JOIN [Person].[Person] p
ON p.[BusinessEntityID] = e.[BusinessEntityID]
INNER JOIN [HumanResources].[EmployeeDepartmentHistory] edh 
ON e.[BusinessEntityID] = edh.[BusinessEntityID] 
INNER JOIN [HumanResources].[Department] d 
ON edh.[DepartmentID] = d.[DepartmentID] 
WHERE edh.EndDate IS NULL
GO

Pojďme analyzovat dotaz v následujících krocích:

  • Mezivýsledek 1:  První vnitřní spojení je mezi tabulkou [HumanResources].[Zaměstnanci] a [Person].[Person].
  • Mezivýsledek 2:  Vnitřní spojení mezi tabulkou [Mezivýsledek 1] a [HumanResources].[EmployeeDepartmentHistory].
  • Mezivýsledek 3:  Vnitřní spojení mezi tabulkou [Mezivýsledek 2] a [HumanResources].[Department].

Jakmile spustíte dotaz s více spojeními, optimalizátor dotazů připraví plán provádění. Připravuje nákladově optimalizovaný prováděcí plán splňující podmínky spojení s využitím zdrojů – například v níže uvedeném skutečném plánu provádění se můžeme podívat na více vnořených smyček (vnitřní spojení) a hash match (vnitřní spojení) kombinující data z více spojovacích tabulek. .

Hodnoty NULL a spojení SQL

Předpokládejme, že ve sloupcích tabulky máme hodnoty NULL a spojíme tabulky v těchto sloupcích. Odpovídá SQL Server hodnotám NULL?

Hodnoty NULL se navzájem neshodují. Proto SQL Server nemohl vrátit odpovídající řádek. V níže uvedeném příkladu máme ve sloupci EmpID tabulky [Zaměstnanci] hodnotu NULL. Proto ve výstupu vrátí odpovídající řádek pouze pro [EmpID] 2.

Tento řádek NULL můžeme získat ve výstupu v případě vnějšího spojení SQL, protože vrací také neshodné řádky.

Osvědčené postupy spojení SQL

V tomto článku jsme prozkoumali různé typy spojení SQL. Zde je několik důležitých doporučených postupů, které je třeba pamatovat a používat při používání spojení SQL.

  • Vnitřní spojení vypisují odpovídající řádky z podmínky spojení v obou tabulkách.
  • Křížové spojení vrátí kartézský součin obou tabulek.
  • Vnější spojení vrátí odpovídající a neodpovídající řádky v závislosti na levém, pravém a úplném klíčovém slovu.
  • Vlastní připojení SQL připojí tabulku k sobě.
  • Při používání spojení v dotazech byste měli vždy používat alias tabulky.
  • Pro sloupce v dotazech vždy používejte dvoudílný název [alias tabulky].[column].
  • V případě více spojení SQL v dotazu byste měli používat logické pořadí tabulek takovým způsobem, abyste uspokojili své požadavky na data a minimalizovali datový tok mezi různými operátory prováděcího plánu.
  • Můžete zkombinovat více spojení, například vnitřní spojení, vnější spojení a vlastní spojení. K získání požadovaných dat byste však měli používat spojení a jejich objednávky.

  1. Najděte všechny nečíselné hodnoty ve sloupci v MariaDB

  2. Monitorování počítadel výkonu prostřednictvím PERFMON | Odstraňování problémů s výkonem serveru SQL -3

  3. Spuštění ProxySQL jako Kubernetes Service

  4. Jak získám asynchronní / událostmi řízenou podporu LISTEN/NOTIFY v Javě pomocí databáze Postgres?