Differenza tra JOIN e INNER JOIN


999

Entrambi questi join mi daranno gli stessi risultati:

SELECT * FROM table JOIN otherTable ON table.ID = otherTable.FK

vs

SELECT * FROM table INNER JOIN otherTable ON table.ID = otherTable.FK

C'è qualche differenza tra le dichiarazioni in termini di prestazioni o altro?

Differisce tra diverse implementazioni SQL ?



6
Come nota a margine: CROSS JOIN è un buon tipo di join (differisce da INNER JOIN).
Serge,

Risposte:


1093

Sono funzionalmente equivalenti, ma INNER JOINpossono essere un po 'più chiari da leggere, specialmente se la query ha altri tipi di join (cioè LEFTo RIGHTo CROSS) inclusi in essa.


11
Questo è vero per tutte le basi di dati (ad esempio SQL, Postgres?) Qualcuno conosce un link alla documentazione che spiega questo?
Chogg,


14
La query è abbastanza chiara semplicemente scrivendo JOIN, INNER è solo rumore.
Ivanzinho,

22
Forse sono un purista, ma penso che sia meglio essere espliciti che impliciti quando si scrive SQL. INNER JOIN è più leggibile, specialmente nelle query complesse.
Bruceskyaus,

3
@Ivanzinho: i tratti della tastiera non sono la misura della complessità della query o del programma. La complessità della vita reale deriva dalla manutenibilità, in cui la leggibilità gioca un ruolo importante. Il fatto che quando dice INNER JOIN, puoi essere sicuro di ciò che fa e che dovrebbe essere proprio questo, mentre un semplice JOIN ti lascerà, o qualcun altro, chiedendoti cosa dicesse lo standard sull'implementazione ed era l'INNER / ESTERNO / SINISTRA escluso per incidente o per scopo.
Tuukka Haapaniemi,

243

No, non c'è differenza, puro zucchero sintattico .


22
Non chiamerei questo zucchero sintattico. Tipo di join "Predefinito", "scorciatoia" o "alias", forse.
mk12

62
In informatica, lo zucchero sintattico è sintassi all'interno di un linguaggio di programmazione progettato per rendere le cose più facili da leggere o da esprimere . Credo che la capacità di omettere INNERrientri in questa definizione.
Quassnoi,

14
Se applichi la definizione in modo molto letterale, sì, ma l'ho sempre vista riservata a tipi di sintassi più interessanti, non solo nomi alternativi per le cose.
MK12,

10
@Quassnoi il semplice fatto che questa domanda viene posta, spettacoli absense di INNERfa non rendere la query più facile da leggere. Per quanto ne so, JOINpotrebbe significare anche LEFT JOINse non fosse chiarito dalle risposte qui.
martennis,

2
@Quassnoi La frase introduttiva wiki citata nel tuo commento è vera per lo zucchero sintattico, ma è inadeguata come definizione. Lo Sugaring sintattico riguarda una sintassi più semplice per casi speciali di sintassi complessa. È più appropriato dire che INNER è una "parola di rumore".
philipxy,

143

INNER JOIN = JOIN

INNER JOIN è l' impostazione predefinita se non si specifica il tipo quando si utilizza la parola JOIN.

Puoi anche utilizzare LEFT OUTER JOIN o RIGHT OUTER JOIN, nel qual caso la parola OUTER è facoltativa oppure puoi specificare CROSS JOIN.

O

Per un join interno, la sintassi è:

SELEZIONA ...
DA TabellaA
[INNER] UNISCITI TabellaB

(in altre parole, la parola chiave "INTERNO" è facoltativa - i risultati sono gli stessi con o senza di essa)



54

Allo stesso modo con OUTER JOINs, la parola "OUTER"è facoltativa. È la parola chiave LEFTo RIGHTche rende JOINan "OUTER" JOIN.

Tuttavia per qualche motivo uso sempre "OUTER"come in LEFT OUTER JOINe mai LEFT JOIN, ma non uso mai INNER JOIN, ma piuttosto uso solo "JOIN":

SELECT ColA, ColB, ...
FROM MyTable AS T1
     JOIN MyOtherTable AS T2
         ON T2.ID = T1.ID
     LEFT OUTER JOIN MyOptionalTable AS T3
         ON T3.ID = T1.ID

23
Sono l'opposto di te: dico sempre "INNER JOIN" ma non uso mai OUTER; quindi "LEFT JOIN" e "RIGHT JOIN". Immagino che mantenga costante il numero dei miei personaggi!
Stephen Holt,

10
@ Jonathan. Non esiste un concetto di direzione su un join interno. I join esterni possono produrre set di risultati senza eguali e questi possono variare in base alla direzione. Gli interni richiedono un adattamento, quindi la direzione non ha importanza.
Karl Kieninger,

32

Come già indicato dalle altre risposte, non c'è differenza nel tuo esempio.

La parte rilevante della grammatica è documentata qui

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

Mostrando che tutti sono opzionali. La pagina lo chiarisce ulteriormente

INNERSpecifica che vengono restituite tutte le coppie di righe corrispondenti. Elimina le righe senza eguali da entrambe le tabelle. Quando non viene specificato alcun tipo di join, questo è il valore predefinito .

La grammatica indica anche che c'è una volta in cui INNER è richiesto però. Quando si specifica un suggerimento di join.

Vedi l'esempio sotto

CREATE TABLE T1(X INT);
CREATE TABLE T2(Y INT);

SELECT *
FROM   T1
       LOOP JOIN T2
         ON X = Y;

SELECT *
FROM   T1
       INNER LOOP JOIN T2
         ON X = Y;

inserisci qui la descrizione dell'immagine

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.