Was ist der Unterschied zwischen einer Subquery und einem Inner Join?

In diesem Rätsel werden wir lernen, wie man eine Subquery mit Hilfe von Inner Joins umschreibt. Das Wissen über eine Subquery im Vergleich zu einem Inner Join kann Ihnen bei Interviewfragen und Leistungsproblemen helfen. Obwohl Unterabfragen einzigartige Fähigkeiten haben, gibt es Zeiten, in denen es besser ist, andere SQL-Konstrukte wie Joins zu verwenden.

In diesem Artikel lernen Sie verschiedene Arten von Unterabfragen kennen und erfahren, wie jede von ihnen in eine andere Form, z. B. einen Join, umgewandelt werden kann.

Das Lösen von Rätseln ist eine gute Möglichkeit, SQL zu lernen. Es gibt nichts Besseres, als das Gelernte zu üben. Wenn Sie das Rätsel gelöst haben, posten Sie Ihre Antwort in den Kommentaren, damit wir alle voneinander lernen können. Wir diskutieren auch über Rätsel und mehr in der Essential SQL Learning Group auf Facebook. Besuchen Sie uns dort!

SQL-Rätselfrage

Abhilfe für Abfrageverwirrung…

Ein Kollege hat gerade etwas über Unterabfragen gelernt und SQL geschrieben, um Mitarbeiternamen und Geburtsdaten aus der AdventureWorks-Datenbank abzurufen. Das Problem ist, dass sie es ändern wollen und es jetzt schwer zu lesen ist!

Können Sie ihnen helfen, das folgende SQL zu vereinfachen?

SELECT E.HireDate, (SELECT FirstName FROM Person.Person P1 WHERE P1.BusinessEntityID = E.BusinessEntityID), (SELECT LastName FROM Person.Person P2 WHERE P2.BusinessEntityID = E.BusinessEntityID), E.BirthDateFROM HumanResources.Employee EWHERE (SELECT PersonType FROM Person.Person T WHERE T.BusinessEntityID = E.BusinessEntityID) = 'EM'ORDER BY HireDate, (SELECT FirstName FROM Person.Person P1 WHERE P1.BusinessEntityID = E.BusinessEntityID)

Welche Anweisung würden Sie schreiben, damit es leichter zu lesen ist und vielleicht effizienter läuft?

Subquery versus Inner Join Antwort

Bevor wir beginnen, lassen Sie uns über die bestehende Abfrage sprechen… was ist das?

Sie werden sehen, dass die Abfrage Daten aus zwei verschiedenen Tabellen kombiniert. Dabei werden Unterabfragen sowohl in der FROM- als auch in der WHERE-Klausel verwendet. Diese sind unten in Blau hervorgehoben.

SELECT E.HireDate, (SELECT FirstName FROM Person.Person P1 WHERE P1.BusinessEntityID = E.BusinessEntityID), (SELECT LastName FROM Person.Person P2 WHERE P2.BusinessEntityID = E.BusinessEntityID), E.BirthDateFROM HumanResources.Employee EWHERE (SELECT PersonType FROM Person.Person T WHERE T.BusinessEntityID = E.BusinessEntityID) = 'EM'ORDER BY HireDate, (SELECT FirstName FROM Person.Person P1 WHERE P1.BusinessEntityID = E.BusinessEntityID)

Sie sehen auch, dass die WHERE-Klausel jeder Unterabfrage die zurückgegebenen Zeilen auf diejenigen einschränkt, die der Employee.BusinessEntityID entsprechen. Dies nennt man eine korrelierte Unterabfrage.

Ich möchte auch darauf hinweisen, dass die Abfragen in FROM einen einzigen Wert (Skalar) zurückgeben müssen. Ist dies nicht der Fall, wird ein Fehler ausgelöst.

Wie Sie sich vorstellen können, ist dies gefährlich, da es schwierig sein kann, zu garantieren, dass eine Abfrage höchstens eine Zeile zurückgibt. Ich weiß, dass ich in diesem Fall sicher war, da die übereinstimmende Bedingung zwischen den Primärschlüsseln der beiden Tabellen auftritt.

Subquery versus Inner Join – Umwandlung der Abfrage

Wenn ich diese Abfrage schreiben würde, würde ich einen INNER JOIN verwenden. Hier ist die Abfrage, die ich schreiben würde:

SELECT E.HireDate, P.FirstName, P.LastName, E.BirthDateFROM HumanResources.Employee E INNER JOIN Person.Person P ON P.BusinessEntityID = E.BusinessEntityIDWHERE P.PersonType = 'EM'ORDER BY E.HireDate, P.FirstName

Welche Abfrage ist einfacher zu lesen?

Das sollte nicht weiter diskutiert werden, der INNER JOIN ist viel kürzer und meiner Meinung nach auf den Punkt gebracht. Die Join-Klausel spricht für sich selbst. Sie wissen, dass es sich um eine Verbindung zwischen zwei Tabellen handelt, während es bei der Subquery so offensichtlich ist.

Die INNER JOIN-Version ist einfacher zu pflegen.

Auch bei der Subquery-Methode wird ein Großteil des Codes wiederholt. Das mag jetzt nicht als große Sache erscheinen, aber wenn Sie jemals die Abfrage ändern müssen, ist es eine, denn wenn Sie jetzt eine Änderung vornehmen, müssen Sie sicher sein, dass Sie die gleiche Änderung an mehreren Stellen vornehmen.

SubQuery oder Inner Join? Was ist effizienter?

Hier ist der Abfrageplan für die Subquery-Version:

Subquery versus Inner Join Query Plan

Ich habe die Auswirkungen der vier Subqueries hervorgehoben. Bei dieser Anweisung führt jede Abfrage zu einer verschachtelten Schleife. Das ist nicht gut.

Wenn Sie zehn Zeilen in zwei Tabellen haben, müssen Sie die zweite Tabelle im Durchschnitt 50 Mal (100/2) für jede Zeile in der ersten Tabelle durchlaufen, um eine Übereinstimmung zu finden. Das bedeutet, dass ein Suchvorgang nicht zwei oder drei Operationen benötigt, um eine Übereinstimmung zu finden, sondern 100 * 50 = 500 Suchvorgänge.

Geschachtelte Schleifen sind eine Tatsache, aber weniger ist besser.

Und hier ist die Version für den INNER JOIN:

SET SHOWPLAN_ALL ONSELECT E.HireDate, P.FirstName, P.LastName, E.BirthDateFROM HumanResources.Employee E INNER JOIN Person.Person P ON P.BusinessEntityID = E.BusinessEntityIDWHERE P.PersonType = 'EM'ORDER BY E.HireDate, P.FirstName

Hier sehen Sie, dass es nur eine geschachtelte Schleife gibt. Das ist sicher besser als vier.

Nachdem Sie sowohl die SQL- als auch die Abfragepläne für jeden Satz von Anweisungen betrachtet haben, können Sie sehen, dass der INNER JOIN in mehrfacher Hinsicht überlegen ist; sehen Sie sich jedoch den vereinfachten Plan an!

Die eigentliche Aufgabe der Abfrage besteht darin, Spalten aus zwei Tabellen zu kombinieren; das ist es, was INNER JOINS besonders gut können. Sicher, es gibt Zeiten, in denen Unterabfragen sinnvoll sind und für Dinge verwendet werden können, die mit Joins nicht möglich sind, aber in diesem Fall macht es keinen Sinn, eine solche zu verwenden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.