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
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.
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:
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.
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.
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:
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:
Ein Full Outer Join gibt die folgenden Zeilen in der Ausgabe zurück:
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.
Lassen Sie uns die Abfrage in den folgenden Schritten analysieren:
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 .
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.
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.SQL-Self-Join
SQL-Cross-Join
SQL Outer Join
Linker äußerer Join
Right Outer Join
Vollständiger äußerer Join
SQL-Joins mit mehreren Tabellen
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
NULL-Werte und SQL-Joins
Best Practices für den SQL-Beitritt