Warum sollten Sie in MySQL-Abfragen join anstelle von where verwenden?


108

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?


2
Abhängig von Ihrer Verwendung hat es möglicherweise die gleichen Ergebnisse, aber mit einem JOIN können Sie andere Arten von Assoziationen durchführen.
Zneak

Beantwortet das deine Frage? INNER JOIN ON vs WHERE-Klausel
philipxy

Antworten:


160

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:

  1. Listen Sie die Tabellen in einer durch Kommas getrennten Liste in der FROM-Klausel auf
  2. 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

Aus Sicht der Leistung:


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:

  • Möglichkeit zur Steuerung der JOIN-Reihenfolge - die Reihenfolge, in der Tabellen gescannt werden
  • Möglichkeit, Filterkriterien vor dem Beitritt auf eine Tabelle anzuwenden

Aus Wartungssicht:


Es gibt zahlreiche Gründe, die ANSI-92 JOIN-Syntax über ANSI-89 zu verwenden:

  • Besser lesbar, da die JOIN-Kriterien von der WHERE-Klausel getrennt sind
  • Es ist weniger wahrscheinlich, dass JOIN-Kriterien übersehen werden
  • Konsistente Syntaxunterstützung für andere JOIN-Typen als INNER, sodass Abfragen in anderen Datenbanken einfach verwendet werden können
  • Die WHERE-Klausel dient nur als Filterung des kartesischen Produkts der verbundenen Tabellen

Aus gestalterischer Sicht:


Die ANSI-92 JOIN-Syntax ist Muster, nicht Anti-Muster:

  • Der Zweck der Abfrage ist offensichtlicher; Die von der Anwendung verwendeten Spalten sind klar
  • Es folgt der Modularitätsregel über die Verwendung strenger Typisierung, wann immer dies möglich ist. Explizit ist fast überall besser.

Fazit


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.


14
"... Jede Abfrage mit mehr als einer Tabelle erfordert eine Verknüpfung, um die Ergebnisse von Tabelle 'A' mit Tabelle 'B' zu verknüpfen. Andernfalls erhalten Sie ein kartesisches Produkt, und das möchten Sie wahrscheinlich nicht (Diese Kartesier stellen LOUSY-Produkte her.)
Scott Smith

8

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.


1
@nawfal Ich verstehe - ich bin mit der Syntax des alten Stils aufgewachsen, aber als ich mich an die neue gewöhnt hatte, wurden die Vorteile klar, zB schwieriger, versehentlich einen Cross-Join durchzuführen, expliziter, leichter zu erkennen, was ein Join ist und was ein Filter, etc ... Ich wurde süchtig.
Basic

8

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?


6

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.


3

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.


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.