2010-12-11 14 views
68

Quindi ho cercato su Internet l'ultima ora, leggendo e cercando la risposta definitiva a questa semplice domanda.Qual è il comportamento predefinito MySQL JOIN, INNER o OUTER?

Qual è il JOIN predefinito in MySQL?

SELECT * FROM t1 JOIN t2 

è che lo stesso come

SELECT * FROM t1, t2 

OR 

SELECT * FROM t1 INNER JOIN t2 

anche una questione connessa, quando si utilizza "dove" clausole, è lo stesso di JOIN o INNER JOIN?

In questo momento sto pensando che un JOIN indipendente sia identico all'utilizzo delle virgole e delle clausole WHERE.

risposta

87

In MySQL scrittura JOIN non qualificato implica INNER JOIN. In altre parole, lo INNER in INNER JOIN è facoltativo. INNER e CROSS sono sinonimi in MySQL. Per chiarezza scrivo JOIN o INNER JOIN se ho una condizione di join e CROSS JOIN se non ho una condizione.

La sintassi consentita per i join è descritta nello documentation.


In questo momento sto pensando uno stand-alone JOIN non è altro che (identico a) utilizzando le virgole e dove clausole.


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

Si consiglia vivamente di utilizzare sempre utilizzando la sintassi JOIN anziché la virgola.

  • T1 JOIN T2 ON ... è più leggibile di T1, T2 WHERE ....
  • È più gestibile in quanto le relazioni e i filtri della tabella sono definiti in modo chiaro anziché combinati.
  • La sintassi JOIN è più semplice da convertire in OUTER JOIN rispetto alla sintassi della virgola.
  • Mischiare la virgola e la sintassi JOIN nella stessa istruzione può causare errori curiosi dovuti alle regole di precedenza.
  • È meno probabile che crei accidentalmente un prodotto cartesiano quando si utilizza la sintassi JOIN a causa di una clausola join dimenticata, poiché le clausole join vengono scritte accanto ai join ed è facile vedere se ne manca una.
+0

Sweet, grazie per chiarire questa semplice domanda per me :) In passato ho sempre usato virgole + dove clausole ... ma si convertiranno all'utilizzo di JOINs come suggerimento. Grazie –

+0

Hey Mark, cosa intendi per mix di JOIN e virgole. Mescolare query come questa, SELEZIONA * DA T1 SINISTRO SINISTRO (t2, t3, t4) ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)? –

+2

@Quang: Questo ad esempio fallirà: 'SELECT * FROM t1, t2 JOIN t3 ON t1.x = t3.y WHERE t1.a = t2.b' –

0

Questi sono tutti equivalenti e uguali a CROSS JOIN.

Ci sono alcune differenze tra l'uso della virgola e la sintassi [INNER | CROSS] JOIN, che potrebbe essere importante quando si uniscono più tabelle. Praticamente tutto quello che devi sapere è descritto qui nello MySQL JOIN documentation.

+0

Fondamentalmente si. – Mchl

+1

^--- la risposta alla domanda è JOIN (standalone) fondamentalmente è la stessa cosa di INNER e comma + dove clausole –