2011-11-24 8 views
5

SQL 1: select * from t1 join t2 on t1.f1 = t2.f2Qual è la differenza tra le due notazioni di join SQL?

SQL 2: select * from t1,t2 where t1.f1 = t2.f2

I risultati che ritornano è stesso. Ci sono delle differenze tra loro? Ad esempio, nel modo in cui vengono eseguiti dal DBMS o nel piano di query?

+5

http://stackoverflow.com/questions/1018822/inner-join-versus-where-clause-any-difference –

risposta

11

Non vi è alcuna differenza operativa tra le due query.

Tuttavia, la notazione esplicita del join è lo stile migliore da apprendere e utilizzare; lascia l'altro per (ancora immutato) codice legacy.

+1

grazie per il tuo edit.my inglese non è abbastanza buono. – SleeplessKnight

6

Uno è vecchio stile e uno è nuovo (ANSI). Il motivo principale per cui ho trovato il motivo per cui si desidera utilizzare il nuovo stile è il supporto standard dei join esterni. Con il vecchio stile, i join esterni sono specifici del fornitore. Nuovo stile ha di serie:

select * from t1 left outer join t2 on t1.f1 = t2.f2 

Nel tuo esempio, SQL 1 è il nuovo e SQL 2 è il vecchio stile, btw.

+0

Si potrebbe voler indicare quale è "vecchio stile" e quale è "nuovo stile". –

+0

Buon punto. Aggiornato –

+0

specifica del fornitore significa che dipende da diversi prodotti SQL (come sqlserver e oracle)? – SleeplessKnight

1

Fondamentalmente, non vi sono differenze tra le due query in funzione.

Tuttavia, entrambi hanno lo stesso piano di esecuzione e hanno lo stesso costo, il che significa che entrambe le query richiedono tempo equivalente per l'esecuzione (stessa prestazione).

L'utilizzo dell'operatore di join è un modo moderno.

1

I due sono semanticamente equivalenti (tra le altre variazioni sul tema). Una differenza è che molti utenti su Stackoverflow sono molto vocali nell'esprimere la loro intolleranza ai join interni "vecchio stile" (il tuo SQL 2), al punto che chiunque li pubblichi rischia di essere downvoted oltre ad essere ammonito nei commenti. È anche probabile che venga applicato il termine "anti-pattern", che non ha senso. Non ho incontrato questa intolleranza di stile al di fuori della comunità SO. In effetti, i collegamenti interni "vecchio stile" sono molto comuni nella letteratura SQL.

+0

Forse perché qualcuno attivo nei tag SO SQL per un po '[vedrà] (http://stackoverflow.com/q/7442344) [lotti] (http://stackoverflow.com/q/3056271) [di] (http://stackoverflow.com/q/7330433) [esempi] (http://stackoverflow.com/q/6156757) di join cartesiani involontari che sarebbero stati evitati con la sintassi esplicita 'JOIN'. –

+0

@MartinSmith: la tua logica è imperfetta: sono stato attivo nei tag SO SQL per un po 'e non ho sviluppato un'intolleranza a questo stile;) Penso piuttosto che sia stato sviluppato per motivi psicologici; Posso tracciare paralleli con 'SELECT *' e 'NATURAL JOIN' in linea con le parole," Le cose brutte potrebbero accadere se ... " – onedaywhen

Problemi correlati