Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum in MySQL-Abfragen join anstelle von where verwenden?

Jede Abfrage, die mehr als eine Tabelle betrifft, erfordert eine Form der Zuordnung, um die Ergebnisse von Tabelle „A“ mit Tabelle „B“ zu verknüpfen. Das traditionelle (ANSI-89) Mittel dazu ist:

  1. Listen Sie die beteiligten Tabellen in einer kommagetrennten 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 ANSI-92 JOIN-Syntax neu geschrieben wurde:

SELECT *
  FROM TABLE_A a
  JOIN TABLE_B b ON b.id = a.id

Aus Leistungssicht:

Wo unterstützt (Oracle 9i+, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), bringt die Verwendung einer der beiden Syntaxen gegenüber der anderen keinen Leistungsvorteil. Der Optimierer sieht sie als dieselbe Abfrage. Komplexere Abfragen können jedoch von der Verwendung der ANSI-92-Syntax profitieren:

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

Aus Wartungsperspektive:

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

  • Lesbarer, da das JOIN-Kriterium von der WHERE-Klausel getrennt ist
  • Weniger Verfehlung der JOIN-Kriterien
  • Konsistente Syntaxunterstützung für andere JOIN-Typen als INNER, wodurch Abfragen einfach in anderen Datenbanken verwendet werden können
  • WHERE-Klausel dient nur als Filterung des kartesischen Produkts der verknüpften Tabellen

Aus Design-Perspektive:

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, wann immer möglich strikte Typisierung zu verwenden. Explizit ist fast überall besser.

Schlussfolgerung

Mangels 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 deutlich. Je expliziter, desto einfacher ist es zu verstehen und zu pflegen.