Es scheint, als würden zwei oder mehr Tabellen kombiniert. Wir können entweder join oder where verwenden. Was sind die Vorteile von einem gegenüber dem anderen?
Es scheint, als würden zwei oder mehr Tabellen kombiniert. Wir können entweder join oder where verwenden. Was sind die Vorteile von einem gegenüber dem anderen?
Antworten:
Jede Abfrage, die mehr als eine Tabelle umfasst, erfordert eine Zuordnung, um die Ergebnisse von Tabelle "A" mit Tabelle "B" zu verknüpfen. Das traditionelle (ANSI-89) Mittel, um dies zu tun, ist:
Schreiben Sie die Zuordnung zwischen den Tabellen in die WHERE-Klausel
SELECT *
FROM TABLE_A a,
TABLE_B b
WHERE a.id = b.id
Hier ist die Abfrage, die mit der ANSI-92 JOIN-Syntax neu geschrieben wurde:
SELECT *
FROM TABLE_A a
JOIN TABLE_B b ON b.id = a.id
Wenn dies unterstützt wird (Oracle 9i +, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), bietet die Verwendung der beiden Syntax keinen Leistungsvorteil gegenüber der anderen. Der Optimierer sieht sie als dieselbe Abfrage. Komplexere Abfragen können jedoch von der Verwendung der ANSI-92-Syntax profitieren:
Es gibt zahlreiche Gründe, die ANSI-92 JOIN-Syntax über ANSI-89 zu verwenden:
Die ANSI-92 JOIN-Syntax ist Muster, nicht Anti-Muster:
Ohne Vertrautheit und / oder Komfort sehe ich keinen Vorteil darin, weiterhin die ANSI-89 WHERE-Klausel anstelle der ANSI-92 JOIN-Syntax zu verwenden. Einige mögen sich darüber beschweren, dass die ANSI-92-Syntax ausführlicher ist, aber das macht sie explizit. Je expliziter, desto einfacher ist es zu verstehen und zu pflegen.
Die meisten Leute neigen dazu, die JOIN-Syntax etwas klarer zu finden, was mit was verbunden wird. Darüber hinaus hat es den Vorteil, ein Standard zu sein.
Persönlich bin ich auf WHEREs "aufgewachsen", aber je mehr ich die JOIN-Syntax verwende, desto mehr wird mir klar, wie klar das ist.
Dies sind die Probleme bei der Verwendung der where-Syntax (auch als impliziter Join bezeichnet):
Erstens ist es allzu einfach, versehentliche Cross-Joins zu erhalten, da die Join-Bedingungen nicht direkt neben den Tabellennamen liegen. Wenn Sie 6 Tabellen zusammenfügen, ist es leicht, eine in der where-Klausel zu übersehen. Sie werden feststellen, dass dies allzu oft behoben wird, wenn Sie das eindeutige Schlüsselwort verwenden. Dies ist ein großer Leistungseinbruch für die Datenbank. Mit der expliziten Join-Syntax können Sie keinen versehentlichen Cross-Join erhalten, da die Syntaxprüfung fehlschlägt.
Rechte und linke Verknüpfungen sind in einigen Datenbanken in der alten Syntax problematisch (auf dem SQl-Server wird nicht garantiert, dass Sie die richtigen Ergebnisse erhalten). Außerdem sind sie in SQL Server, den ich kenne, veraltet.
Wenn Sie einen Cross-Join verwenden möchten, ist dies aus der alten Syntax nicht ersichtlich. Dies ist unter Verwendung des aktuellen ANSII-Standards klar.
Für den Betreuer ist es viel schwieriger, mithilfe der impliziten Syntax genau zu erkennen, welche Felder Teil des Joins sind oder welche Tabellen in welcher Reihenfolge zusammengefügt werden. Dies bedeutet, dass die Überarbeitung der Abfragen möglicherweise länger dauert. Ich habe nur sehr wenige Leute gekannt, die, nachdem sie sich die Zeit genommen hatten, sich mit der expliziten Join-Syntax vertraut zu machen, jemals wieder auf den alten Weg zurückgekehrt sind.
Ich habe auch festgestellt, dass einige Leute, die diese impliziten Verknüpfungen verwenden, die Funktionsweise von Verknüpfungen nicht wirklich verstehen und daher bei ihren Abfragen falsche Ergebnisse erhalten.
Würden Sie ehrlich gesagt einen anderen Code verwenden, der vor 18 Jahren durch eine bessere Methode ersetzt wurde?
Explizite Verknüpfungen vermitteln Absichten und lassen die where-Klausel für die Filterung übrig. Es ist sauberer und Standard, und Sie können Dinge wie links außen oder rechts außen tun, was nur mit wo schwieriger zu tun ist.
Sie können WHERE nicht verwenden, um zwei Tabellen zu kombinieren. Was Sie jedoch tun können, ist zu schreiben:
SELECT * FROM A, B
WHERE ...
Das Komma hier entspricht dem Schreiben:
SELECT *
FROM A
CROSS JOIN B
WHERE ...
Würdest du das schreiben? Nein - weil es überhaupt nicht das ist, was du meinst. Sie wollen keinen Cross Join, Sie wollen einen INNER JOIN. Aber wenn Sie Komma schreiben, sagen Sie CROSS JOIN und das ist verwirrend.
Eigentlich braucht man oft sowohl "WHERE" als auch "JOIN".
"JOIN" wird verwendet, um Daten aus zwei Tabellen abzurufen - basierend auf den Werten einer gemeinsamen Spalte. Wenn Sie dieses Ergebnis dann weiter filtern möchten, verwenden Sie die WHERE-Klausel.
Beispielsweise ruft "LEFT JOIN" ALLE Zeilen aus der linken Tabelle sowie die übereinstimmenden Zeilen aus der rechten Tabelle ab. Dadurch werden die Datensätze jedoch nicht nach einem bestimmten Wert oder nach anderen Spalten gefiltert, die nicht Teil von JOIN sind. Wenn Sie dieses Ergebnis weiter filtern möchten, geben Sie die zusätzlichen Filter in der WHERE-Klausel an.