sql >> Database >  >> RDS >> Mysql

Waarom in MySQL-query's join gebruiken in plaats van waar?

Elke zoekopdracht waarbij meer dan één tabel betrokken is, vereist enige vorm van associatie om de resultaten van tabel "A" aan tabel "B" te koppelen. De traditionele (ANSI-89) manier om dit te doen is:

  1. Maak een lijst van de betrokken tabellen in een door komma's gescheiden lijst in de FROM-clausule
  2. Schrijf de associatie tussen de tabellen in de WHERE-clausule

    SELECT *
      FROM TABLE_A a,
           TABLE_B b
     WHERE a.id = b.id
    

Hier is de query opnieuw geschreven met behulp van de ANSI-92 JOIN-syntaxis:

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

Vanuit een prestatieperspectief:

Waar ondersteund (Oracle 9i+, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), is er geen prestatievoordeel bij het gebruik van de ene syntaxis boven de andere. De optimizer ziet ze als dezelfde query. Maar complexere zoekopdrachten kunnen baat hebben bij het gebruik van de ANSI-92-syntaxis:

  • Mogelijkheid om de JOIN-volgorde te beheren - de volgorde waarin tafels worden gescand
  • Mogelijkheid om filtercriteria toe te passen op een tafel voordat u zich aanmeldt

Vanuit een onderhoudsperspectief:

Er zijn talloze redenen om de syntaxis van ANSI-92 JOIN te gebruiken in plaats van ANSI-89:

  • Leesbaarder, omdat de JOIN-criteria los staan ​​van de WHERE-clausule
  • Minder kans om JOIN-criteria te missen
  • Consistente syntaxisondersteuning voor andere JOIN-typen dan INNER, waardoor query's gemakkelijk te gebruiken zijn in andere databases
  • WHERE-clausule dient alleen als filtratie van het cartesiaanse product van de samengevoegde tabellen

Vanuit een ontwerpperspectief:

ANSI-92 JOIN-syntaxis is patroon, niet anti-patroon:

  • Het doel van de zoekopdracht is duidelijker; de kolommen die door de applicatie worden gebruikt zijn duidelijk
  • Het volgt de modulariteitsregel over het gebruik van strikt typen waar mogelijk. Expliciet is bijna overal beter.

Conclusie

Afgezien van vertrouwdheid en/of comfort, zie ik geen enkel voordeel in het blijven gebruiken van de ANSI-89 WHERE-clausule in plaats van de ANSI-92 JOIN-syntaxis. Sommigen klagen misschien dat de ANSI-92-syntaxis uitgebreider is, maar dat maakt het juist expliciet. Hoe explicieter, hoe gemakkelijker het is om het te begrijpen en te onderhouden.



  1. Hoe PostgreSQL-query's loggen?

  2. Toegang tot het SQL Server-exemplaar herstellen zonder opnieuw op te starten

  3. Hoe MySQL Workbench op Windows te installeren

  4. Hoe echo ik een Resource-id #6 van een MySql-antwoord in PHP?