Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Eine Übersicht über SQL-Join-Typen mit Beispielen

SQL JOIN ist eine Klausel, die verwendet wird, um mehrere Tabellen zu kombinieren und Daten basierend auf einem gemeinsamen Feld in relationalen Datenbanken abzurufen. Datenbankexperten verwenden Normalisierungen, um die Datenintegrität sicherzustellen und zu verbessern. Bei den verschiedenen Normalisierungsformen werden Daten auf mehrere logische Tabellen verteilt. Diese Tabellen verwenden referenzielle Einschränkungen – Primärschlüssel und Fremdschlüssel –, um die Datenintegrität in SQL Server-Tabellen zu erzwingen. In der Abbildung unten erhalten wir einen Einblick in den Prozess der Datenbanknormalisierung.

Die verschiedenen SQL JOIN-Typen verstehen

SQL JOIN generiert aussagekräftige Daten durch Kombinieren mehrerer relationaler Tabellen. Diese Tabellen sind über einen Schlüssel verknüpft und haben Eins-zu-eins- oder Eins-zu-viele-Beziehungen. Um die richtigen Daten abzurufen, müssen Sie die Datenanforderungen und die korrekten Join-Mechanismen kennen. SQL Server unterstützt mehrere Verknüpfungen, und jede Methode hat eine bestimmte Methode zum Abrufen von Daten aus mehreren Tabellen. Das folgende Bild gibt die unterstützten SQL Server-Joins an.

SQL Inner Join

Der innere SQL-Join enthält Zeilen aus den Tabellen, in denen die Join-Bedingungen erfüllt sind. Im folgenden Venn-Diagramm gibt der Inner Join beispielsweise die übereinstimmenden Zeilen aus Tabelle A und Tabelle B zurück.

Beachten Sie im folgenden Beispiel die folgenden Dinge:

  • Wir haben zwei Tabellen – [Mitarbeiter] und [Adresse].
  • Die SQL-Abfrage wird in den Spalten [Employees].[EmpID] und [Address].[ID] verknüpft.

Die Abfrageausgabe gibt die Mitarbeiterdatensätze für EmpID zurück, die in beiden Tabellen vorhanden sind.

Der innere Join gibt übereinstimmende Zeilen aus beiden Tabellen zurück; Daher wird es auch als Equi-Join bezeichnet. Wenn wir das innere Schlüsselwort nicht angeben, führt SQL Server die innere Join-Operation durch.

Bei einer anderen Art von Inner Join, einem Theta-Join, verwenden wir den Gleichheitsoperator (=) nicht in der ON-Klausel. Stattdessen verwenden wir Nicht-Gleichheitsoperatoren wie .

SELECT * FROM Table1 T1, Table2 T2 WO T1.Preis

SQL-Self-Join

Bei einem Self-Join verbindet SQL Server die Tabelle mit sich selbst. Das bedeutet, dass der Tabellenname zweimal in der from-Klausel vorkommt.

Unten haben wir eine Tabelle [Emp], die Mitarbeiter sowie die Daten ihrer Manager enthält. Der Self-Join ist nützlich, um hierarchische Daten abzufragen. Beispielsweise können wir in der Mitarbeitertabelle die Selbstverknüpfung verwenden, um jeden Mitarbeiter und den Namen seines berichtenden Vorgesetzten zu erfahren.

Die obige Abfrage fügt einen Self-Join in die [Emp]-Tabelle ein. Es verbindet die EmpMgrID-Spalte mit der EmpID-Spalte und gibt die übereinstimmenden Zeilen zurück.

SQL-Cross-Join

Beim Cross Join gibt SQL Server ein kartesisches Produkt aus beiden Tabellen zurück. In der folgenden Abbildung haben wir beispielsweise eine Kreuzverknüpfung für Tabelle A und B durchgeführt.

Der Cross Join verbindet jede Zeile aus Tabelle A mit jeder verfügbaren Zeile in Tabelle B. Daher wird die Ausgabe auch als kartesisches Produkt beider Tabellen bezeichnet. Beachten Sie im folgenden Bild Folgendes:

  • Tabelle [Employee] hat drei Zeilen für Emp-ID 1, 2 und 3.
  • Tabelle [Adresse] enthält Datensätze für Emp-ID 1,2,7 und 8.

In der Cross-Join-Ausgabe wird Zeile 1 der Tabelle [Employee] mit allen Zeilen der Tabelle [Address] verknüpft und folgt dem gleichen Muster für die verbleibenden Zeilen.

Wenn die erste Tabelle eine Anzahl von x Zeilen und die zweite Tabelle eine Anzahl von n Zeilen hat, ergibt Cross Join eine Anzahl von x*n Zeilen in der Ausgabe. Sie sollten Cross Joins bei größeren Tabellen vermeiden, da dies eine große Anzahl von Datensätzen zurückgeben kann und SQL Server viel Rechenleistung (CPU, Speicher und IO) benötigt, um solch umfangreiche Daten zu verarbeiten.

SQL Outer Join

Wie wir bereits erklärt haben, gibt der Inner Join die übereinstimmenden Zeilen aus beiden Tabellen zurück. Bei Verwendung eines SQL Outer Join werden nicht nur die übereinstimmenden Zeilen aufgelistet, sondern auch die nicht übereinstimmenden Zeilen aus den anderen Tabellen zurückgegeben. Die nicht übereinstimmende Zeile hängt von den linken, rechten oder vollständigen Schlüsselwörtern ab.

Das folgende Bild beschreibt auf hoher Ebene den linken, rechten und vollständigen äußeren Join.

Linker äußerer Join

Der linke äußere SQL-Join gibt die übereinstimmenden Zeilen beider Tabellen zusammen mit den nicht übereinstimmenden Zeilen aus der linken Tabelle zurück. Wenn ein Datensatz aus der linken Tabelle keine übereinstimmenden Zeilen in der rechten Tabelle hat, wird der Datensatz mit NULL-Werten angezeigt.

Im folgenden Beispiel gibt der linke äußere Join die folgenden Zeilen zurück:

  • Übereinstimmende Zeilen:Emp-ID 1 und 2 sind sowohl in der linken als auch in der rechten Tabelle vorhanden.
  • Unmatched row:Emp ID 3 existiert nicht in der rechten Tabelle. Daher haben wir einen NULL-Wert in der Abfrageausgabe.

Right Outer Join

SQL Right Outer Join gibt die übereinstimmenden Zeilen beider Tabellen zusammen mit den nicht übereinstimmenden Zeilen aus der rechten Tabelle zurück. Wenn ein Datensatz aus der rechten Tabelle keine übereinstimmenden Zeilen in der linken Tabelle hat, wird der Datensatz mit NULL-Werten angezeigt.

Im folgenden Beispiel haben wir die folgenden Ausgabezeilen:

  • Übereinstimmende Zeilen:Emp-ID 1 und 2 existiert in beiden Tabellen; Daher sind diese Zeilen übereinstimmende Zeilen.
  • Nicht übereinstimmende Zeilen:In der rechten Tabelle haben wir zusätzliche Zeilen für Emp ID 7 und 8, aber diese Zeilen sind in der linken Tabelle nicht verfügbar. Daher erhalten wir für diese Zeilen einen NULL-Wert im rechten äußeren Join.

Vollständiger äußerer Join

Ein Full Outer Join gibt die folgenden Zeilen in der Ausgabe zurück:

  • Übereinstimmende Zeilen zwischen zwei Tabellen.
  • Nicht übereinstimmende Zeilen ähnlich dem Left Outer Join:NULL-Werte für nicht übereinstimmende Zeilen aus der rechten Tabelle.
  • Nicht übereinstimmende Zeilen ähnlich dem rechten äußeren Join:Nullwerte für nicht übereinstimmende Zeilen aus der linken Tabelle.

SQL-Joins mit mehreren Tabellen

In den vorherigen Beispielen verwenden wir zwei Tabellen in einer SQL-Abfrage, um Join-Operationen auszuführen. Meistens verbinden wir mehrere Tabellen miteinander und es werden die relevanten Daten zurückgegeben.

Die folgende Abfrage verwendet mehrere innere Verknüpfungen.

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

Lassen Sie uns die Abfrage in den folgenden Schritten analysieren:

  • Zwischenergebnis 1:  Der erste innere Join befindet sich zwischen [HumanResources].[Employees] und [Person].[Person] table.
  • Zwischenergebnis 2:  Inner Join zwischen den Tabellen [Zwischenergebnis 1] und [HumanResources].[EmployeeDepartmentHistory].
  • Zwischenergebnis 3:  Inner Join zwischen den Tabellen [Zwischenergebnis 2] und [HumanResources].[Department].

Nachdem Sie die Abfrage mit mehreren Joins ausgeführt haben, bereitet der Abfrageoptimierer den Ausführungsplan vor. Es bereitet einen kostenoptimierten Ausführungsplan vor, der die Join-Bedingungen mit der Ressourcennutzung erfüllt – zum Beispiel können wir im folgenden tatsächlichen Ausführungsplan mehrere verschachtelte Schleifen (Inner Join) und Hash-Matches (Inner Join) betrachten, die Daten aus mehreren Join-Tabellen kombinieren .

NULL-Werte und SQL-Joins

Angenommen, wir haben NULL-Werte in den Tabellenspalten und verknüpfen die Tabellen in diesen Spalten. Stimmt SQL Server mit NULL-Werten überein?

Die NULL-Werte stimmen nicht überein. Daher konnte SQL Server die übereinstimmende Zeile nicht zurückgeben. Im folgenden Beispiel haben wir NULL in der EmpID-Spalte der [Employees]-Tabelle. Daher wird in der Ausgabe nur die übereinstimmende Zeile für [EmpID] 2 zurückgegeben.

Wir können diese NULL-Zeile in der Ausgabe im Falle eines SQL-Outer-Joins erhalten, da sie auch die nicht übereinstimmenden Zeilen zurückgibt.

Best Practices für den SQL-Beitritt

In diesem Artikel haben wir die verschiedenen SQL-Join-Typen untersucht. Hier sind einige wichtige Best Practices, die Sie bei der Verwendung von SQL-Joins beachten und anwenden sollten.

  • Inner Joins geben die übereinstimmenden Zeilen aus der Join-Bedingung in beiden Tabellen aus.
  • Cross Join gibt das kartesische Produkt beider Tabellen zurück.
  • Outer Join gibt die übereinstimmenden und nicht übereinstimmenden Zeilen zurück, abhängig von den linken, rechten und vollständigen Schlüsselwörtern.
  • SQL Self-Join verbindet eine Tabelle mit sich selbst.
  • Sie sollten immer einen Tabellenalias verwenden, wenn Sie die Verknüpfungen in den Abfragen verwenden.
  • Verwenden Sie immer das zweiteilige Namensformat [Tabellenalias].[Spalte] für Spalten in Abfragen.
  • Bei mehreren SQL-Joins in einer Abfrage sollten Sie die logischen Reihenfolgen der Tabellen so verwenden, dass Ihr Datenbedarf gedeckt und der Datenfluss zwischen verschiedenen Operatoren des Ausführungsplans minimiert wird.
  • Sie können mehrere Verknüpfungen kombinieren, z. B. innere Verknüpfung, äußere Verknüpfung und Selbstverknüpfung. Sie sollten jedoch die Joins und ihre Reihenfolge verwenden, um die erforderlichen Daten zu erhalten.