Mi chiedo come differenziare tutti questi diversi join ...
Mi chiedo come differenziare tutti questi diversi join ...
Risposte:
Esempio semplice : supponiamo che tu abbia una Students
tabella e una Lockers
tabella. In SQL, la prima tabella specificata in un join Students
, è la tabella SINISTRA e la seconda Lockers
, è DESTRA tabella .
Ogni studente può essere assegnato a un armadietto, quindi c'è una LockerNumber
colonna nelStudent
tabella. Più di uno studente potrebbe essere potenzialmente in un unico armadietto, ma soprattutto all'inizio dell'anno scolastico, potresti avere alcuni studenti in arrivo senza armadietti e alcuni armadietti che non hanno studenti assegnati.
Per il bene di questo esempio, supponiamo che tu abbia 100 studenti , 70 dei quali hanno armadietti. Hai un totale di 50 armadietti , 40 dei quali hanno almeno 1 studente e 10 armadietti non hanno studenti.
INNER JOIN equivale a " mostrami tutti gli studenti con armadietti ".
Mancano studenti senza armadietti o armadietti senza studenti.
Restituisce 70 righe
LEFT OUTER JOIN sarebbe " mostrami tutti gli studenti, con il loro armadietto corrispondente se ne hanno uno ".
Questo potrebbe essere un elenco di studenti generale o potrebbe essere utilizzato per identificare gli studenti senza armadietto.
Restituisce 100 righe
GIUSTO ESTERNO UNISCITI sarebbe " mostrami tutti gli armadietti e gli studenti assegnati loro se ce ne sono ".
Questo potrebbe essere usato per identificare gli armadietti a cui non sono stati assegnati studenti o gli armadietti che hanno troppi studenti.
Restituisce 80 righe (elenco di 70 studenti nei 40 armadietti, più i 10 armadietti senza studente)
FULL OUTER JOIN sarebbe sciocco e probabilmente non molto utile.
Qualcosa del tipo " mostrami tutti gli studenti e tutti gli armadietti e abbinali dove puoi "
Restituisce 110 righe (tutti i 100 studenti, compresi quelli senza armadietti. Inoltre i 10 armadietti senza studente)
CROSS JOIN è anche abbastanza sciocco in questo scenario.
Non utilizza il lockernumber
campo collegato nella tabella degli studenti, quindi fondamentalmente si finisce con un grande elenco gigante di ogni possibile accoppiamento studente-armadietto, indipendentemente dal fatto che esista effettivamente.
Restituisce 5000 righe (100 studenti x 50 armadietti). Potrebbe essere utile (con filtro) come punto di partenza per abbinare i nuovi studenti con gli armadietti vuoti.
SELECT * FROM students RIGHT OUTER JOIN lockers...
si tradurrebbe in un risultato diverso rispetto a SELECT * FROM lockers RIGHT OUTER JOIN students...
. Ottima risposta, ma mi piacerebbe vederlo aggiornato con SQL
query complete
Esistono tre tipi base di join:
INNER
join confronta due tabelle e restituisce risultati solo dove esiste una corrispondenza. I record della 1a tabella vengono duplicati quando corrispondono a risultati multipli nella 2a. I join INNER tendono a ridurre le serie di risultati, ma poiché i record possono essere duplicati, ciò non è garantito.CROSS
join confronta due tabelle e restituisce ogni possibile combinazione di righe da entrambe le tabelle. È possibile ottenere molti risultati da questo tipo di join che potrebbero non essere significativi, quindi utilizzare con cautela.OUTER
join confronta due tabelle e restituisce dati quando è disponibile una corrispondenza o valori NULL in caso contrario. Come con il join INNER, questo duplicherà le righe in una tabella quando corrisponde a più record nell'altra tabella. I join ESTERNI tendono ad ampliare i set di risultati, poiché non rimuoveranno da soli alcun record dal set. È inoltre necessario qualificare un join OUTER per determinare quando e dove aggiungere i valori NULL:
LEFT
significa mantenere tutti i record della 1a tabella, non importa quale e inserire valori NULL quando la 2a tabella non corrisponde. RIGHT
significa il contrario: mantenere tutti i record della seconda tabella, non importa cosa, e inserire i valori NULL quando la prima tabella non corrisponde. FULL
significa mantenere tutti i record da entrambe le tabelle e inserire un valore NULL in entrambe le tabelle se non vi è corrispondenza.Spesso vedi la OUTER
parola chiave omessa dalla sintassi. Invece sarà solo "LEFT JOIN", "RIGHT JOIN" o "FULL JOIN". Questo viene fatto perché i join INNER e CROSS non hanno alcun significato rispetto a LEFT, RIGHT o FULL, e quindi questi sono sufficienti da soli per indicare inequivocabilmente un join OUTER.
Ecco un esempio di quando potresti voler usare ogni tipo:
INNER
: Si desidera restituire tutti i record dalla tabella "Invoice", insieme alle "InvoiceLines" corrispondenti. Ciò presuppone che ogni fattura valida disponga di almeno una riga.OUTER
: Si desidera restituire tutti i record "InvoiceLines" per una fattura particolare, insieme ai corrispondenti record "InventoryItem". Si tratta di un'azienda che vende anche servizi, in modo tale che non tutti InvoiceLines disporranno di un IventoryItem.CROSS
: Hai una tabella di cifre con 10 righe, ognuna con valori compresi tra "0" e "9". Si desidera creare una tabella degli intervalli di date a cui unirsi, in modo da finire con un record per ogni giorno all'interno dell'intervallo. Unendo CROSS a questa tabella ripetutamente con se stesso, puoi creare tutti gli interi consecutivi di cui hai bisogno (dato che inizi dalla 10 alla 1a potenza, ogni join aggiunge 1 all'esponente). Quindi utilizzare la funzione DATEADD () per aggiungere quei valori alla data di base per l'intervallo.Esistono solo 4 tipi:
NULL
per ogni valore nella tabella a destra. Ciò significa che ogni riga della tabella a sinistra apparirà almeno una volta nell'output. Una "unione incrociata" o "unione cartesiana" è semplicemente un'unione interna per la quale non sono state specificate condizioni di unione, risultando in tutte le coppie di righe in uscita.
Grazie a RusselH per aver segnalato i join FULL, che avevo omesso.
Differenza JOIN SQL:
Molto semplice da ricordare:
INNER JOIN
mostra solo i record comuni ad entrambe le tabelle.
OUTER JOIN
tutto il contenuto di entrambe le tabelle viene unito o abbinato o meno.
LEFT JOIN
è lo stesso di LEFT OUTER JOIN
- (Seleziona i record dalla prima tabella (più a sinistra) con i record della tabella di destra corrispondenti.)
RIGHT JOIN
è uguale a RIGHT OUTER JOIN
- (Seleziona i record dalla seconda tabella (più a destra) con i corrispondenti record della tabella di sinistra.)
Dai un'occhiata a Join (SQL) su Wikipedia
join sinistro / destro (esterno): date due tabelle restituisce tutte le righe presenti nella tabella sinistra o destra del join, più le righe dall'altro lato verranno restituite quando la clausola join è una corrispondenza o verrà restituito null per quelle colonne
Esterno completo: date due tabelle restituisce tutte le righe e restituisce valori null quando la colonna sinistra o destra non è presente
Join incrociati: join cartesiani e possono essere pericolosi se non utilizzati con attenzione
Renderlo più visibile potrebbe aiutare. Un esempio:
Tabella 1:
ID_STUDENT STUDENT_NAME
1 Raony
2 Diogo
3 Eduardo
4 Luiz
Tavolo 2:
ID_STUDENT LOCKER
3 l1
4 l2
5 l3
Cosa ottengo quando lo faccio:
-Inner join of Table 1 and Table 2:
- Inner join returns both tables merged only when the key
(ID_STUDENT) exists in both tables
ID_STUDENT STUDENT_NAME LOCKER
3 Eduardo l1
4 Luiz l2
-Left join of Table 1 and Table 2:
- Left join merges both tables with all records form table 1, in
other words, there might be non-populated fields from table 2
ID_ESTUDANTE NOME_ESTUDANTE LOCKER
1 Raony -
2 Diogo -
3 Eduardo l1
4 Luiz l2
-Right join of table 1 and table 2:
- Right join merges both tables with all records from table 2, in
other words, there might be non-populated fields from table 1
ID_STUDENT STUDENT_NAME LOCKER
3 Eduardo l1
4 Luiz l2
5 - l3
-Outter join of table 1 and table 2:
- Returns all records from both tables, in other words, there
might be non-populated fields either from table 1 or 2.
ID_STUDENT STUDENT_NAME LOCKER
1 Raony -
2 Diogo -
3 Eduardo l1
4 Luiz l2
5 - l3
LEFT JOIN
e RIGHT JOIN
sono tipi di OUTER JOIN
s.
INNER JOIN
è l'impostazione predefinita: le righe di entrambe le tabelle devono corrispondere alla condizione di join.
Join interno : mostra solo le righe, quando contiene i dati di entrambe le tabelle.
Join esterno : (sinistra / destra) : Mostra il tutto seguito da sinistra / destra tabella con le righe abbinato ( s ), se esiste o no.
All'inizio devi capire cosa fa Join? Colleghiamo più tabelle e otteniamo risultati specifici dalle tabelle unite. Il modo più semplice per farlo è il cross join .
Diciamo che la tabella A ha due colonne A e B. E la tabella B ha tre colonne C e D. Se applichiamo il cross join, si produrranno molte righe senza significato. Quindi dobbiamo abbinare usando la chiave primaria per ottenere dati reali.
Sinistra: restituirà tutti i record dalla tabella di sinistra e i record corrispondenti dalla tabella di destra.
Destra: tornerà di fronte al join di sinistra. Restituirà tutti i record dalla tabella di destra e i record corrispondenti dalla tabella di sinistra.
Interno: è come un incrocio. Restituirà solo i record corrispondenti da entrambe le tabelle.
Esterno: E questo è come l'unione. Restituirà tutto il record disponibile da entrambe le tabelle.
Alcune volte non abbiamo bisogno di tutti i dati e dovremmo anche solo bisogno di dati o record comuni. possiamo facilmente ottenerlo usando questi metodi di join. Ricorda anche i join destro e sinistro sono quelli esterni.
Puoi ottenere tutti i record semplicemente usando il cross join. Ma potrebbe essere costoso quando si tratta di milioni di dischi. Quindi rendilo semplice usando il join sinistro, destro, interno o esterno.
Grazie