Mi chiedo come differenziare tutti questi diversi join ...
Mi chiedo come differenziare tutti questi diversi join ...
Risposte:
Esempio semplice : supponiamo che tu abbia una Studentstabella e una Lockerstabella. 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 LockerNumbercolonna 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 lockernumbercampo 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 SQLquery complete
Esistono tre tipi base di join:
INNERjoin 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.CROSSjoin 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.OUTERjoin 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 OUTERparola 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:
NULLper 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 JOINe RIGHT JOINsono tipi di OUTER JOINs.
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