Grundlegendes zu den Konzepten und der Syntax von Verknüpfungen

Abgeschlossen

Die grundlegendste und gängigste Methode zum Kombinieren von Daten aus mehreren Tabellen ist die Verwendung eines JOIN-Vorgangs. Manche stellen sich JOIN-Vorgänge als separate Klausel in einer SELECT-Anweisung vor, während andere diese hingegen als Teil der FROM-Klausel betrachten. In diesem Modul werden sie hauptsächlich als Teil der FROM-Klausel betrachtet. In diesem Modul erfahren Sie, wie die FROM-Klausel in einer SELECT-Anweisung von T-SQL virtuelle Zwischentabellen erstellt, die in späteren Phasen der Abfrage genutzt wird.

Die FROM-Klausel und virtuelle Tabellen

Wenn Sie die logische Reihenfolge von Vorgängen gelernt haben, die durchgeführt werden, wenn SQL Server eine Abfrage verarbeitet, wissen Sie bereits, dass die FROM-Klausel einer SELECT-Anweisung die erste Klausel ist, die verarbeitet wird. Diese Klausel bestimmt, welche Tabelle bzw. Tabellen als Quelle der Zeilen für die Abfrage fungieren werden. Die FROM-Klausel kann eine einzelne Tabelle referenzieren oder mehrere Tabellen als Datenquelle für Ihre Abfrage zusammenbringen. Sie können sich die FROM-Klausel wie das Erstellen und Auffüllen einer virtuellen Tabelle vorstellen. Diese virtuelle Tabelle enthält die Ausgabe der FROM-Klausel und wird von Klauseln der SELECT-Anweisung verwendet, die später angewendet werden, z. B. von der WHERE-Klausel. Wenn Sie weitere Funktionen wie Verknüpfungsoperatoren zu einer FROM-Klausel hinzufügen, wird es sich als nützlich erweisen, sich den Zweck der Elemente der FROM-Klausel entweder als Hinzufügen oder Entfernen von Zeilen der virtuellen Tabelle vorzustellen.

Die von einer FROM-Klausel erstellte virtuelle Tabelle ist lediglich eine logische Entität. In SQL Server wird keine dauerhafte oder temporäre physische Tabelle erstellt, um die Ergebnisse der FROM-Klausel zu speichern, da diese an die WHERE-Klausel oder andere Teile der Abfrage übergeben werden.

Die anhand der FROM-Klausel erstellte virtuelle Tabelle enthält Daten aus allen verknüpften Tabellen. Es kann hilfreich sein, die Ergebnisse als Mengen zu betrachten und die Verknüpfungsergebnisse in Form eines Venn-Diagramms zu konzeptualisieren.

A Venn diagram showing the set of an Employee table joined to a SalesOrder table

Mit der Zeit wurde die T-SQL-Sprache erweitert, um Änderungen an den ANSI-Standards (American National Standards Institute) für die SQL-Sprache widerzuspiegeln. Eine der wichtigsten Stellen, an der diese Änderungen sichtbar sind, ist die Syntax für Verknüpfungen in einer FROM-Klausel. Im ANSI-SQL-89-Standard wurden Verknüpfungen festgelegt, indem mehrere Tabellen in einer durch Kommas getrennte Liste in die FROM-Klausel eingefügt wurden. Jegliche Filterung, um zu bestimmen, welche Zeilen eingefügt werden sollen, wurden wie folgt in der WHERE-Klausel durchgeführt:

SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM SalesLT.Product AS p, SalesLT.ProductModel AS m
WHERE p.ProductModelID = m.ProductModelID;

Diese Syntax wird weiterhin von SQL Server unterstützt, allerdings wird aufgrund der Komplexität der Darstellung der Filter für komplexe Verknüpfungen davon abgeraten. Wenn eine WHERE-Klausel versehentlich ausgelassen wird, können Verknüpfungen im ANSI-SQL-89-Stil problemlos zu kartesischen Produkten werden und eine übermäßige Anzahl von Ergebniszeilen zurückgeben, was zu Leistungsproblemen und möglicherweise falschen Ergebnissen führen kann.

Beim Lernen des Schreibens von Abfragen mehrerer Tabellen in T-SQL ist es wichtig, dass Sie das Konzept kartesischer Produkte verstehen. In der Mathematik stellt ein kartesisches Produkt das Produkt aus zwei Mengen dar. Das Produkt einer Menge mit zwei Elementen und einer Menge mit sechs Elementen ist eine Menge mit zwölf Elementen (bzw. 6 × 2). Jedes Element in einer Menge wird mit jedem Element in der anderen Menge kombiniert. Im folgenden Beispiel sehen Sie eine Menge von Namen mit zwei Elementen und einer Menge von Produkten mit drei Elementen. Das kartesische Produkt kombiniert jeden Namen mit jedem Produkt, was sechs Elemente ergibt.

Cartesian product

In Datenbanken ist ein kartesisches Produkt das Ergebnis der Kombination jeder Zeile in einer Tabelle mit jeder Zeile einer anderen Tabelle. Das Produkt einer Tabelle mit 10 Zeilen und einer Tabelle mit 100 Zeilen ist ein Resultset mit 1.000 Zeilen. Das zugrunde liegende Ergebnis eines JOIN-Vorgangs ist ein kartesisches Produkt, allerdings ist ein kartesisches Produkt bei den meisten T-SQL-Abfragen nicht das gewünschte Ergebnis. In T-SQL tritt ein kartesisches Produkt auf, wenn zwei Eingabetabellen verknüpft werden, ohne dass Beziehungen zwischen diesen berücksichtigt werden. Ohne Informationen über Beziehungen gibt der SQL Server-Abfrageprozessor alle möglichen Zeilenkombinationen zurück. Für dieses Ergebnis kann es zwar praktische Anwendungsfälle geben, z. B. zum Generieren von Testdaten, in der Regel ist dies jedoch nicht nützlich und kann schwerwiegende Auswirkungen auf die Leistung haben.

Mit der Einführung des ANSI-SQL-92-Standards wurde die Unterstützung für die Schlüsselwörter der JOIN- und ON-Klauseln hinzugefügt. T-SQL unterstützt diese Syntax ebenfalls. Verknüpfungen werden in der FROM-Klausel mithilfe des entsprechenden JOIN-Operators dargestellt. Die logische Beziehung zwischen den Tabellen, die zu einem Filterprädikat wird, wird in der ON-Klausel festgelegt.

Im folgenden Beispiel wird die vorherige Abfrage mit der neuen Syntax ausgeführt:

SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM SalesLT.Product AS p
JOIN SalesLT.ProductModel AS m
    ON p.ProductModelID = m.ProductModelID;

Hinweis

Die ANSI-SQL-92-Syntax erschwert das versehentliche Erstellen kartesischer Produkte. Nachdem das Schlüsselwort JOIN hinzugefügt wurde, wird ein Syntaxfehler ausgelöst, wenn eine ON-Klausel fehlt, es sei denn, JOIN wird als CROSS JOIN angegeben.