Site Overlay

SQL Inner Join zu zwei oder mehr Tabellen

Verwenden Sie einen SQL INNER JOIN, wenn Sie Zeilen aus zwei Tabellen abgleichen müssen. Zeilen, die übereinstimmen, bleiben im Ergebnis, diejenigen, die nicht abgelehnt werden. Die Übereinstimmungsbedingung wird allgemein als Join-Bedingung bezeichnet. Wenn die Übereinstimmungsbedingungen Gleichheit beinhalten, dh genau den Inhalt einer Spalte mit einer anderen übereinstimmen, wird der innere SQL-Join als Equijoin bezeichnet. Sie werden feststellen, dass die meisten Joins, die Sie verwenden, Equijoins sind. Eine häufige Situation ist, dass Sie den Primärschlüssel einer Tabelle mit dem Fremdschlüssel einer anderen Tabelle verknüpfen müssen., Sie benötigen dies, wenn Sie Daten denormalisieren.

Hinweis: Die Serie beginnt mit dem Artikel Einführung in Datenbank-Joins. Alle Beispiele für diese Lektion basieren auf Microsoft SQL Server Management Studio und der AdventureWorks2012-Datenbank. Erste Schritte mit diesen kostenlosen Tools mit meinem Leitfaden Erste Schritte mit SQL Server. In diesem Artikel werden wir innere Joins behandeln.

Grundstruktur eines INNEREN SQL-JOINS

Unten ist ein Beispiel für eine einfache Select-Anweisung mit einer INNEREN JOIN-Klausel.,

SELECT columnlistFROM maintableINNER JOIN secondtable ON join condition

Überlegen Sie, ob Sie ein Verzeichnis mit Personen und deren Telefonnummern erstellen möchten. Dazu müssen Sie Zeilen aus den Tabellen Person und PersonPhone kombinieren.

Die SQL, um dies zu tun ist:

SELECT Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM Person.Person INNER JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID

Diese Art von Join wird als Equi-Join bezeichnet, da wir eine Gleichheit für die Join-Bedingung verwenden. Es ist sicher zu sagen, dass die überwiegende Mehrheit der Joins, denen Sie begegnen, Equi-Joins sind., Es gibt besondere Umstände, unter denen es sinnvoll ist, andere Vergleiche zu verwenden, z. B. not equals oder greater than. Diese Art von Joins, genannt Non Equi-Joins, werden später in diesem Beitrag untersucht. Sobald die Daten verbunden sind, können sie auch gefiltert und mit vertrauten WHERE-und ORDER BY-Klauseln sortiert werden. Die Reihenfolge der Klauseln ist das, was Sie erwarten könnten:

SELECT columnlistFROM maintableINNER JOIN secondtable ON join conditionWHERE filter conditionORDER BY columnlist

Die WHERE Klausel kann auf eines der Felder aus den verknüpften Tabellen verweisen. Um klar zu sein, ist es am besten, den Spalten den Tabellennamen voranzustellen. Gleiches gilt für die Sortierung., Verwenden Sie ein beliebiges Feld; Es ist jedoch üblich, nach einem oder mehreren ausgewählten Feldern zu sortieren. Nehmen wir unser Telefonverzeichnis, aber listen Sie nur Personen in der Reihenfolge des Nachnamens auf, deren Nachnamen mit C beginnen. Im Hinblick auf diese Anforderung wird unsere SQL-Anweisung:

SELECT Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM Person.Person INNER JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID WHERE Person.LastName LIKE 'C%' ORDER BY Person.LastName

Beachten Sie, dass die Join-Bedingung gleich bleibt. Die einzigen Änderungen sind das Hinzufügen der WHERE-und ORDER BY-Klauseln. Inzwischen sollten Ihnen diese vertraut sein.

Tabellenaliase erleichtern das Lesen von SQL-Joins

Wenn Sie kompliziertere SQL-Anweisungen erstellen, können sie schwer lesbar werden., Vieles davon ist auf die ausführliche (wortreiche) Natur der Sprache zurückzuführen. Sie können einige davon reduzieren, indem Sie einen anderen Namen für Ihre Tabellen in Anweisungen verwenden. Verwenden Sie dazu Tabellenaliase. Denken Sie an Aliase wie Spitznamen. Zum Glück ist es einfach, Aliase zu definieren! Platzieren Sie sie einfach nach der ersten Referenz des Tabellennamens. Hier ist ein einfaches Beispiel, in dem wir die Personentabelle als P:

SELECT P.FirstName, P.LastName FROM Person.Person AS P

In diesem Beispiel haben wir den Buchstaben P verwendet. Wo Aliase wirklich nützlich sind, ist mit Joins., Nehmen wir den letzten Join, den wir gemacht haben,aber dieses Mal schreiben Sie es, indem Sie Person als P und PersonPhone als PP Aliasing. Hier ist die Anweisung

SELECT P.FirstName, P.LastName, PP.PhoneNumber FROM Person.Person AS P INNER JOIN Person.PersonPhone AS PP ON P.BusinessEntityID = PP.BusinessEntityID WHERE P.LastName LIKE 'C%' ORDER BY P.LastName

In Bezug auf die Benennung könnten Sie Ihre Tabellen A, B, C aliassieren,aber es kann schwierig werden,sich an die Aliase zu erinnern. Mein System, um die Aliase kurz und dennoch leicht zu merken, ist es, den ersten Buchstaben der Tabelle zu verwenden. Wenn die Tabelle zwei Wörter wie PersonPhone enthält, verwende ich normalerweise den ersten Buchstaben jedes Wortes.,

SQL INNER Join mit Mehr als Einem Feld

In einigen Fällen können Sie finden, dass Sie brauchen, um eine SQL INNER JOIN auf zwei oder mehr Felder. Dies geschieht, wenn der Primärschlüssel einer Tabelle aus zwei oder mehr Spalten besteht. Verwenden Sie den Operator UND, um Join-Bedingungen zu verknüpfen. Durch die Verwendung UND Sie „sagen“ müssen beide Spalten übereinstimmen, damit der Join fortgesetzt werden kann…

Betrachten Sie ein Beispiel, in dem wir alle Tage und Zeiten wissen möchten, an denen jeder Lehrer eine Klasse unterrichtet., In unserem Beispiel besteht der Primärschlüssel für die Klassentabelle aus zwei Feldern: className und Instructor. Um den Zeitplan zu erstellen, müssen wir Klasse zu Abschnitt verbinden, indem wir sowohl className als auch Instructor.

Hinweis: Dieses Beispiel funktioniert in der AdventureWorks2012-Datenbank nicht

Beim Erstellen innerer Joins ist es wichtig, auf Ihre Daten zu achten. Wenn wir in unserem Beispiel die Klasse fälschlicherweise nur mit der Spalte className mit der Abschnittstabelle verbunden haben, enthält die Klassenliste jeder Anweisung auch Zeitpläne aus anderen Anweisungen, die dieselbe Klasse unterrichten., Ein innerer Join stimmt mit so vielen Zeilen wie möglich zwischen Tabellen überein. Kombinationen von Zeilen sind im Ergebnis enthalten, solange die Join-Bedingung erfüllt ist.

Studieren Sie bei der Planung Ihrer Joins die Primärschlüsseldefinitionen jeder Tabelle, um zu verstehen, wie sich Tabellen aufeinander beziehen.

Drei oder mehr Tabellen verbinden

In der AdventureWorks2012-Datenbank müssen Sie der Tabelle PhoneNumberType beitreten, um zu wissen, ob eine aufgelistete Telefonnummer eine Haus -, Zell-oder Büronummer ist. Um ein Verzeichnis mit Namen, Telefonnummern und Nummern zu erstellen, müssen drei Tabellen miteinander verbunden werden., Hier ist die Beziehung:

Das Einfügen einer anderen Tabelle in unsere Abfrage ist so einfach wie das Hinzufügen einer weiteren INNEREN JOIN-Klausel zu unserer Anweisung.

SELECT P.FirstName, P.LastName, PP.PhoneNumber, PT.NameFROM Person.Person AS P INNER JOIN Person.PersonPhone AS PP ON P.BusinessEntityID = PP.BusinessEntityID INNER JOIN Person.PhoneNumberType AS PT ON PP.PhoneNumberTypeID = PT.PhoneNumberTypeIDWHERE P.LastName LIKE 'C%'ORDER BY P.LastName

Ich glaube nicht, dass es eine harte schnelle Regel gibt, wie Sie die join-Klausel formatieren, ich neige dazu, sie in ihren eigenen Zeilen zu trennen und wenn Sie die Spalten angeben, platzieren Sie zuerst die Spalte“ join from“als:

INNER JOINToTableOn FromTable.PKID = ToTable.FKID

Für alle Beispiele in diesem Artikel habe ich zuerst die Anweisung geschrieben und dann TidySQL verwendet, um sie automatisch zu formatieren.,

Self-Join

Ein Self-Join ist, wenn Sie eine Tabelle zu sich selbst verbinden. Wenn Sie einen Self-Join verwenden, ist es wichtig, die Tabelle mit einem Alias zu versehen. Angenommen, wir wollten alle Abteilungen innerhalb einer Abteilungsgruppe auflisten. Sie können dazu einen Self-Join verwenden:

SELECT D1.Name, D2.Name FROM HumanResources.Department AS D1 INNER JOIN HumanResources.Department AS D2 ON d1.GroupName = d2.GroupName

Da die Abteilungstabelle mit sich selbst verbunden wird, müssen wir die beiden Vorkommen von Department unterscheiden. Sie sind als D1 und D2 aliased. Abgesehen davon, dass die Tabellen gleich sind, sehen Sie, dass diese Art von Join nichts Bemerkenswertes ist.,

Non Equi-Joins

Ein Non equi-Join ist nur eine ausgefallene Art zu sagen, dass Ihre Join-Bedingung kein Gleichheitszeichen enthält. Möglicherweise kratzen Sie sich am Kopf und fragen sich, warum Sie einen Nicht-Equi-Join verwenden möchten. Ich stimme zu, um ehrlich zu sein, es kann schwierig sein, Beispiele zu finden; Sie existieren jedoch, und Sie werden es zu schätzen wissen, wie Sie sie verwenden, wenn Sie dies tun müssen. Ein Grund, einen Nicht-Equi-Join zu verwenden, ist, wenn Sie überprüfen müssen, ob Sie saubere Daten haben. Betrachten Sie die AdventureWorks2012-Produkttabelle. Überprüfen Sie, ob der Produktname für jedes aufgelistete Produkt eindeutig ist., Eine Möglichkeit, dies zu tun, besteht darin, die Produkttabelle anhand des Namens selbst zu verknüpfen.

SELECT P1.ProductID, P1.Name FROM Production.Product AS P1 INNER JOIN Production.Product AS P2 ON P1.Name = P2.Name ORDER BY P1.ProductNumber

Mit dieser Abfrage können wir Werte für jede Zeile vergleichen, die mit dem Produktnamen übereinstimmt. Wenn Name eindeutig ist, sollten Sie nur dann Übereinstimmungen haben, wenn die Productids gleich sind. Wenn wir also nach doppelten Produktnamen suchen, möchten wir Datensätze finden, die mit unterschiedlichen Productids übereinstimmen., Dies wird im folgenden Diagramm gezeigt

Die SQL zum Zurückgeben der doppelten Datensätze lautet:

SELECT P1.ProductID, P1.Name, P1.ProductNumberFROM Production.Product AS P1 INNER JOIN Production.Product AS P2 ON P1.Name = P2.Name AND P1.ProductID <> P2.ProductIDORDER BY P1.ProductNumber

Sie fragen sich vielleicht, was zuerst passiert. Stimmt der Computer zuerst mit den Namen überein und sucht dann, sobald dies abgeschlossen ist, nach Productids, die nicht übereinstimmen, oder wertet is irgendwie beide Bedingungen aus, während es das Ergebnis erstellt? Das Schöne an SQL ist, dass theoretisch die Art und Weise, wie Sie Ihren Code schreiben, keinen Einfluss darauf haben sollte, wie die Datenbank die Daten tatsächlich abruft. Die Reihenfolge der Joins oder Bedingungen sollte die Laufzeit einer Abfrage nicht wesentlich beeinflussen., Dies alles wird untersucht, wenn wir über die Abfrageoptimierung und die Überprüfung von Abfrageplänen sprechen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.