Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Przegląd typów złączeń SQL wraz z przykładami

SQL JOIN to klauzula używana do łączenia wielu tabel i pobierania danych na podstawie wspólnego pola w relacyjnych bazach danych. Specjaliści od baz danych stosują normalizacje w celu zapewnienia i poprawy integralności danych. W różnych formach normalizacji dane są rozdzielane na wiele tabel logicznych. Tabele te wykorzystują ograniczenia referencyjne — klucz podstawowy i klucze obce — w celu wymuszenia integralności danych w tabelach programu SQL Server. Na poniższym obrazku mamy wgląd w proces normalizacji bazy danych.

Zrozumienie różnych typów SQL JOIN

SQL JOIN generuje znaczące dane, łącząc wiele tabel relacyjnych. Te tabele są powiązane za pomocą klucza i mają relacje jeden do jednego lub jeden do wielu. Aby pobrać poprawne dane, musisz znać wymagania dotyczące danych i poprawne mechanizmy łączenia. SQL Server obsługuje wiele sprzężeń, a każda metoda ma określony sposób pobierania danych z wielu tabel. Poniższy obraz określa obsługiwane przyłącza SQL Server.

Złączenie wewnętrzne SQL

Sprzężenie wewnętrzne SQL zawiera wiersze z tabel, w których spełnione są warunki sprzężenia. Na przykład na poniższym diagramie Venna sprzężenie wewnętrzne zwraca pasujące wiersze z Tabeli A i Tabeli B.

W poniższym przykładzie zwróć uwagę na następujące rzeczy:

  • Mamy dwie tabele – [Pracownicy] i [Adres].
  • Zapytanie SQL jest połączone w kolumnie [Pracownicy].[Identyfikator stanowiska] i [Adres].[ID].

Dane wyjściowe zapytania zwracają rekordy pracowników dla EmpID, które istnieją w obu tabelach.

Sprzężenie wewnętrzne zwraca pasujące wiersze z obu tabel; dlatego jest również znany jako sprzężenie Equi. Jeśli nie określimy słowa kluczowego inner, SQL Server wykona operację sprzężenia wewnętrznego.

W innym typie sprzężenia wewnętrznego, sprzężeniu theta, nie używamy operatora równości (=) w klauzuli ON. Zamiast tego używamy operatorów nierówności, takich jak .

SELECT * FROM Tabela1 T1, Tabela2 T2 WHERE T1.Cena

Samodzielne łączenie SQL

W przypadku samodzielnego łączenia SQL Server łączy ze sobą tabelę. Oznacza to, że nazwa tabeli pojawia się dwukrotnie w klauzuli from.

Poniżej mamy tabelę [Emp], która zawiera dane pracowników oraz ich menedżerów. Samosprzężenie jest przydatne do wykonywania zapytań dotyczących danych hierarchicznych. Na przykład w tabeli pracowników możemy użyć funkcji samodzielnego łączenia, aby poznać każdego pracownika i imię i nazwisko jego kierownika raportującego.

Powyższe zapytanie umieszcza samozłączanie w tabeli [Emp]. Łączy kolumnę EmpMgrID z kolumną EmpID i zwraca pasujące wiersze.

Połączenie krzyżowe SQL

W połączeniu krzyżowym SQL Server zwraca produkt kartezjański z obu tabel. Na przykład na poniższym obrazku wykonaliśmy połączenie krzyżowe dla tabel A i B.

Sprzężenie krzyżowe łączy każdy wiersz z tabeli A z każdym wierszem dostępnym w tabeli B. Dlatego wynik jest również znany jako iloczyn kartezjański obu tabel. Na poniższym obrazku zwróć uwagę na następujące kwestie:

  • Tabela [Pracownik] ma trzy wiersze dla identyfikatorów pracowników 1,2 i 3.
  • Tabela [Adres] zawiera rekordy dla Emp ID 1,2,7 i 8.

W danych wyjściowych łączenia krzyżowego wiersz 1 tabeli [Employee] łączy się ze wszystkimi wierszami tabeli [Adres] i stosuje ten sam wzorzec dla pozostałych wierszy.

Jeśli pierwsza tabela ma liczbę x wierszy, a druga tabela ma liczbę n wierszy, łączenie krzyżowe daje w wyniku x*n liczbę wierszy. Należy unikać łączenia krzyżowego w większych tabelach, ponieważ może to zwrócić ogromną liczbę rekordów, a SQL Server wymaga dużej mocy obliczeniowej (procesora, pamięci i IO) do obsługi tak obszernych danych.

Zewnętrzne sprzężenie SQL

Jak wyjaśniliśmy wcześniej, sprzężenie wewnętrzne zwraca pasujące wiersze z obu tabel. Podczas korzystania z zewnętrznego sprzężenia SQL nie tylko wyświetla pasujące wiersze, ale także zwraca niedopasowane wiersze z innych tabel. Niedopasowany wiersz zależy od lewego, prawego lub pełnego słowa kluczowego.

Poniższy obraz przedstawia na wysokim poziomie lewe, prawe i pełne sprzężenie zewnętrzne.

Lewe sprzężenie zewnętrzne

Lewe sprzężenie zewnętrzne SQL zwraca pasujące wiersze obu tabel wraz z niedopasowanymi wierszami z lewej tabeli. Jeśli rekord z lewej tabeli nie ma pasujących wierszy w prawej tabeli, wyświetla rekord z wartościami NULL.

W poniższym przykładzie lewe sprzężenie zewnętrzne zwraca następujące wiersze:

  • Dopasowane wiersze:Emp ID 1 i 2 istnieją zarówno w lewej, jak i prawej tabeli.
  • Niedopasowany wiersz:Emp ID 3 nie istnieje w prawej tabeli. Dlatego w wyniku zapytania mamy wartość NULL.

Prawe sprzężenie zewnętrzne

Prawe sprzężenie zewnętrzne SQL zwraca pasujące wiersze obu tabel wraz z niedopasowanymi wierszami z prawej tabeli. Jeśli rekord z prawej tabeli nie ma pasujących wierszy w lewej tabeli, wyświetla rekord z wartościami NULL.

W poniższym przykładzie mamy następujące wiersze wyjściowe:

  • Zgodne wiersze:Emp ID 1 i 2 istnieją w obu tabelach; dlatego te wiersze są wierszami dopasowanymi.
  • Niedopasowane wiersze:w prawej tabeli mamy dodatkowe wiersze dla Emp ID 7 i 8, ale te wiersze nie są dostępne w lewej tabeli. Dlatego otrzymujemy wartość NULL w prawym sprzężeniu zewnętrznym dla tych wierszy.

Pełne sprzężenie zewnętrzne

Pełne sprzężenie zewnętrzne zwraca w danych wyjściowych następujące wiersze:

  • Dopasowywanie wierszy między dwoma tabelami.
  • Niedopasowane wiersze podobne do lewego sprzężenia zewnętrznego:wartości NULL dla niedopasowanych wierszy z prawej tabeli.
  • Niedopasowane wiersze podobne do prawego sprzężenia zewnętrznego:wartości Null dla niedopasowanych wierszy z lewej tabeli.

Łączenia SQL z wieloma tabelami

W poprzednich przykładach używamy dwóch tabel w zapytaniu SQL do wykonywania operacji złączenia. Przeważnie łączymy wiele tabel razem i zwracamy odpowiednie dane.

Poniższe zapytanie używa wielu sprzężeń wewnętrznych.

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

Przeanalizujmy zapytanie w następujących krokach:

  • Wynik pośredni 1:  Pierwsze sprzężenie wewnętrzne znajduje się między tabelą [Zasoby ludzkie].[Pracownicy] i [Osoba].[Osoba].
  • Wynik pośredni 2:  Sprzężenie wewnętrzne między tabelą [Wynik pośredni 1] i [HumanResources].[EmployeeDepartmentHistory].
  • Wynik pośredni 3:  Sprzężenie wewnętrzne między tabelą [Wynik pośredni 2] i [Zasoby ludzkie].[Dział].

Po wykonaniu zapytania z wieloma sprzężeniami optymalizator zapytań przygotowuje plan wykonania. Przygotowuje zoptymalizowany pod względem kosztów plan wykonania spełniający warunki łączenia z wykorzystaniem zasobów — na przykład w poniższym rzeczywistym planie wykonania możemy przyjrzeć się wielu zagnieżdżonym pętlom (sprzężenie wewnętrzne) i hash match (sprzężenie wewnętrzne) łączącym dane z wielu tabel łączących .

Wartości NULL i łączenia SQL

Załóżmy, że w kolumnach tabeli mamy wartości NULL i łączymy tabele w tych kolumnach. Czy SQL Server pasuje do wartości NULL?

Wartości NULL nie pasują do siebie. Dlatego SQL Server nie może zwrócić pasującego wiersza. W poniższym przykładzie mamy NULL w kolumnie EmpID tabeli [Employees]. Dlatego na wyjściu zwraca pasujący wiersz tylko dla [EmpID] 2.

Możemy uzyskać ten wiersz NULL w danych wyjściowych w przypadku zewnętrznego sprzężenia SQL, ponieważ zwraca on również niedopasowane wiersze.

Najlepsze praktyki łączenia SQL

W tym artykule omówiliśmy różne typy złączeń SQL. Oto kilka ważnych najlepszych praktyk, które należy zapamiętać i zastosować podczas korzystania z łączeń SQL.

  • Złączenia wewnętrzne wyprowadzają pasujące wiersze z warunku złączenia w obu tabelach.
  • Złączenie krzyżowe zwraca iloczyn kartezjański obu tabel.
  • Złączenie zewnętrzne zwraca dopasowane i niedopasowane wiersze w zależności od lewego, prawego i pełnego słowa kluczowego.
  • Samozłączenie SQL łączy tabelę ze sobą.
  • Zawsze należy używać aliasu tabeli podczas używania złączeń w zapytaniach.
  • Zawsze używaj dwuczęściowego formatu nazwy [alias tabeli].[kolumna] dla kolumn w zapytaniach.
  • W przypadku wielu sprzężeń SQL w zapytaniu, powinieneś użyć logicznej kolejności tabel w taki sposób, aby spełnić wymagania dotyczące danych i zminimalizować przepływ danych między różnymi operatorami planu wykonania.
  • Możesz łączyć ze sobą wiele sprzężeń, takich jak sprzężenie wewnętrzne, sprzężenie zewnętrzne i sprzężenie własne. Powinieneś jednak użyć złączeń i ich zamówień, aby uzyskać wymagane dane.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak włączyć wszystkie ograniczenia sprawdzania w bazie danych SQL Server — samouczek SQL Server / TSQL, część 88

  2. Najlepsze opcje monitorowania bazy danych dostępne dla Twojej firmy

  3. Jak dodać ograniczenie klucza podstawowego do kolumn tożsamości do wszystkich tabel w bazie danych programu SQL Server — samouczek programu SQL Server / TSQL, część 63

  4. SQL Server 2008:jak nadać uprawnienia do nazwy użytkownika?

  5. Utwórz profil poczty bazy danych (SSMS)