Qual è il comportamento predefinito di MySQL JOIN, INNER o OUTER?


92

Quindi ho cercato su Internet l'ultima ora, leggendo e cercando la risposta definitiva a questa semplice domanda.

Qual è il JOIN predefinito in MySQL?

SELECT * FROM t1 JOIN t2

È lo stesso di

SELECT * FROM t1, t2

OR

SELECT * FROM t1 INNER JOIN t2

Anche una domanda correlata, quando usi le clausole "WHERE", è uguale a JOIN o INNER JOIN?

In questo momento sto pensando che un JOIN autonomo è identico all'uso di virgole e clausole WHERE.

Risposte:


125

In MySQL la scrittura JOINnon qualificata implica INNER JOIN. In altre parole, INNERin INNER JOINè opzionale. INNERe CROSSsono sinonimi in MySQL. Per chiarezza scrivo JOINo INNER JOINse ho una condizione di adesione e CROSS JOINse non ho una condizione.

La sintassi consentita per i join è descritta nella documentazione .


In questo momento sto pensando che un JOIN autonomo non è altro che (identico a) l'utilizzo di virgole e clausole WHERE.


L'effetto è lo stesso, ma la storia dietro di loro è diversa. La sintassi della virgola è dallo standard ANSI-89. Tuttavia ci sono una serie di problemi con questa sintassi così nello standard ANSI-92 è stata introdotta la parola chiave JOIN.

Consiglio vivamente di utilizzare sempre la sintassi JOIN invece della virgola.

  • T1 JOIN T2 ON ...è più leggibile di T1, T2 WHERE ....
  • È più gestibile perché le relazioni tra le tabelle ei filtri sono chiaramente definiti piuttosto che mescolati insieme.
  • La sintassi JOIN è più facile da convertire in OUTER JOIN rispetto alla sintassi virgola.
  • Mescolare la virgola e la sintassi JOIN nella stessa istruzione può dare strani errori a causa delle regole di precedenza.
  • È meno probabile che crei accidentalmente un prodotto cartesiano quando si utilizza la sintassi JOIN a causa di una clausola di join dimenticata, perché le clausole di join sono scritte accanto ai join ed è facile vedere se ne manca una.

Dolce, grazie per aver chiarito questa semplice domanda per me :) In passato ho sempre usato le virgole + le clausole where ... ma passerò all'uso dei JOIN secondo il tuo consiglio. Grazie
Quang Van

Ehi Mark, cosa intendi per mix di JOIN e virgole. Mescola query come questa, SELEZIONA * DA t1 SINISTRA UNISCI (t2, t3, t4) SU (t2.a = t1.a AND t3.b = t1.be t4.c = t1.c)?
Quang Van

2
@Quang: questo ad esempio fallirà:SELECT * FROM t1, t2 JOIN t3 ON t1.x=t3.y WHERE t1.a = t2.b
Mark Byers

0

Queste sono tutte equivalenti, e anche uguale a, CROSS JOIN.

Esistono alcune differenze tra l'utilizzo della virgola e della [INNER | CROSS] JOINsintassi, che potrebbero essere importanti quando si uniscono più tabelle. Praticamente tutto ciò che devi sapere è descritto qui nella documentazione di MySQLJOIN .


1
^ --- la risposta alla domanda è JOIN (standalone) fondamentalmente è la stessa cosa per INNER e virgola + clausole dove
Quang Van
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.