SQLite Unione: Naturale Sinistra Esterno, Interno, Croce con Tabelle
⚡ Riepilogo intelligente
SQLite Le clausole JOIN combinano righe provenienti da due o più tabelle utilizzando INNER JOIN, JOIN USING, NATURAL JOIN, LEFT OUTER JOIN e CROSS JOIN, consentendo di abbinare record correlati in base a colonne condivise e di leggere i dati da un database normalizzato.
SQLite supporta diversi tipi di SQL Join, come INNER JOIN, LEFT OUTER JOIN e CROSS JOIN. Ogni tipo di JOIN viene utilizzato per una situazione diversa, come vedremo in questo tutorial.
Introduzione alla SQLite Clausola ISCRIVITI
Quando lavori su un database con più tabelle, spesso devi ottenere dati da queste più tabelle.
Con la clausola JOIN è possibile collegare due o più tabelle o sottoquery unendole. Inoltre, puoi definire in base a quale colonna collegare le tabelle e in base a quali condizioni.
Ogni clausola JOIN deve avere la seguente sintassi:
Ciascuna clausola di join contiene:
- Una tabella o una sottoquery che è la tabella di sinistra; la tabella o la sottoquery prima della clausola di join (a sinistra di essa).
- Operatore JOIN: specifica il tipo di join (INNER JOIN, LEFT OUTER JOIN o CROSS JOIN).
- Vincolo JOIN: dopo aver specificato le tabelle o le sottoquery da unire, è necessario specificare un vincolo di join, che sarà una condizione in base alla quale le righe corrispondenti che corrispondono a tale condizione verranno selezionate in base al tipo di join.
Si noti che, per tutti i seguenti SQLite Per inserire esempi di tabelle JOIN, è necessario eseguire sqlite3.exe e aprire una connessione al database di esempio come segue:
Passo 1) In questo passaggio, apri Risorse del computer e vai alla seguente directory "C:\sqlite", quindi apri "sqlite3.exe":
Passo 2) Aprire il database “TutorialsSampleDB.db” con il seguente comando:
Ora sei pronto per eseguire qualsiasi tipo di query sul database.
SQLite INNER JOIN
L'operazione INNER JOIN restituisce solo le righe che soddisfano la condizione di join ed elimina tutte le altre righe che non la soddisfano.
Esempio
Nell'esempio seguente, uniremo le due tabelle "Studenti" e "Dipartimenti" utilizzando DepartmentId per ottenere il nome del dipartimento per ogni studente, come segue:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Spiegazione del codice
L'INNER JOIN funziona come segue:
- Nella clausola Select puoi selezionare le colonne che desideri dalle due tabelle a cui si fa riferimento.
- La clausola INNER JOIN viene scritta dopo la prima tabella a cui fa riferimento la clausola "From".
- Quindi la condizione di unione viene specificata con ON.
- È possibile specificare degli alias per le tabelle a cui si fa riferimento.
- La parola INTERNA è facoltativa, puoi semplicemente scrivere JOIN.
Uscita
L'operazione INNER JOIN genera i record da entrambe le tabelle, quella degli studenti e quella dei dipartimenti, che soddisfano la condizione "Students.DepartmentId = Departments.DepartmentId". Le righe non corrispondenti verranno ignorate e non incluse nel risultato.
Ecco perché, da questa query sono stati restituiti solo 8 studenti su 10, appartenenti ai dipartimenti di informatica, matematica e fisica. Gli studenti "Jena" e "George" non sono stati inclusi perché il loro ID di dipartimento è nullo e non corrisponde alla colonna departmentId della tabella dei dipartimenti. Come segue:
SQLite ISCRIVITI…UTILIZZANDO
L'INNER JOIN può essere scritto utilizzando la clausola "USING" per evitare ridondanza, quindi invece di scrivere "ON Students.DepartmentId = Departments.DepartmentId", puoi semplicemente scrivere "USING(DepartmentID)".
Puoi utilizzare "JOIN .. USING" ogni volta che le colonne che confronterai nella condizione di unione hanno lo stesso nome. In questi casi, non è necessario ripeterli utilizzando la condizione on e indicare semplicemente i nomi delle colonne e SQLite lo rileverà.
La differenza tra INNER JOIN e JOIN .. USING:
Con “JOIN … USING” non si scrive una condizione di join, ma si specifica semplicemente la colonna di join comune alle due tabelle unite. Invece di scrivere table1 “INNER JOIN table2 ON table1.cola = table2.cola”, si scrive “table1 JOIN table2 USING(cola)”.
Esempio
Nell'esempio seguente, uniremo le due tabelle "Studenti" e "Dipartimenti" utilizzando DepartmentId per ottenere il nome del dipartimento per ogni studente, come segue:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments USING(DepartmentId);
Spiegazione
- A differenza dell'esempio precedente, non abbiamo scritto "ON Students.DepartmentId = Departments.DepartmentId". Abbiamo semplicemente scritto "USING(DepartmentId)".
- SQLite deduce automaticamente la condizione di join e confronta il DepartmentId da entrambe le tabelle: Studenti e Dipartimenti.
- Puoi utilizzare questa sintassi ogni volta che le due colonne che stai confrontando hanno lo stesso nome.
Uscita
Questo ti darà lo stesso identico risultato dell'esempio precedente:
SQLite UNIONE NATURALE
Un NATURAL JOIN è simile a un JOIN…USING, la differenza è che verifica automaticamente l'uguaglianza tra i valori di ogni colonna esistente in entrambe le tabelle.
La differenza tra INNER JOIN e NATURAL JOIN:
- Nell'INNER JOIN, è necessario specificare una condizione di join che verrà utilizzata per unire le due tabelle. Nell'INNER JOIN, invece, non è necessario specificare una condizione di join. Si inseriscono semplicemente i nomi delle due tabelle senza alcuna condizione. L'INNER JOIN verificherà automaticamente l'uguaglianza dei valori per ogni colonna presente in entrambe le tabelle. L'INNER JOIN deduce automaticamente la condizione di join.
- Nel NATURAL JOIN, tutte le colonne di entrambe le tabelle con lo stesso nome verranno abbinate tra loro. Ad esempio, se abbiamo due tabelle con due nomi di colonna in comune (le due colonne esistono con lo stesso nome nelle due tabelle), allora il join naturale unirà le due tabelle confrontando i valori di entrambe le colonne e non solo di una colonna.
Esempio
SELECT Students.StudentName, Departments.DepartmentName FROM Students Natural JOIN Departments;
Spiegazione
- Non è necessario scrivere una condizione di join con i nomi delle colonne (come abbiamo fatto in INNER JOIN). Non è stato nemmeno necessario scrivere il nome della colonna una sola volta (come abbiamo fatto in JOIN USING).
- L'unione naturale analizzerà entrambe le colonne delle due tabelle. Rileverà che la condizione dovrebbe essere composta dal confronto di DepartmentId da entrambe le tabelle Studenti e Dipartimenti.
Uscita
Il NATURAL JOIN produrrà esattamente lo stesso output degli esempi INNER JOIN e JOIN USING, perché nel nostro esempio tutte e tre le query sono equivalenti. Tuttavia, in alcuni casi, l'output di un INNER JOIN sarà diverso da quello di un NATURAL JOIN. Ad esempio, se ci sono più tabelle con lo stesso nome, il NATURAL JOIN confronterà tutte le colonne tra loro. L'INNER JOIN, invece, confronterà solo le colonne specificate nella condizione di join.
SQLite UNIONE ESTERNO SINISTRO
Lo standard SQL definisce tre tipi di OUTER JOIN: LEFT, RIGHT e FULL, ma SQLite supporta solo il naturale LEFT OUTER JOIN.
In LEFT OUTER JOIN, tutti i valori delle colonne selezionate dalla tabella di sinistra saranno inclusi nel risultato della query, quindi, indipendentemente dal fatto che il valore corrisponda o meno alla condizione di join, verrà incluso nel risultato.
Quindi, se la tabella di sinistra ha 'n' righe, i risultati della query avranno 'n' righe. Tuttavia, per i valori delle colonne provenienti dalla tabella di destra, se un valore non corrisponde alla condizione di join, conterrà un valore "null".
Quindi, otterrai un numero di righe equivalente al numero di righe nel join sinistro. In questo modo otterrai le righe corrispondenti da entrambe le tabelle (come i risultati INNER JOIN), più le righe non corrispondenti dalla tabella di sinistra.
Esempio
Nell'esempio seguente, proveremo il “LEFT JOIN” per unire le due tabelle “Studenti” e “Dipartimenti”:
SELECT Students.StudentName, Departments.DepartmentName FROM Students -- this is the left table LEFT JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Spiegazione
- SQLite La sintassi LEFT JOIN è la stessa di INNER JOIN; scrivi LEFT JOIN tra le due tabelle, quindi la condizione di join viene dopo la clausola ON.
- La prima tabella dopo la clausola from è la tabella di sinistra. Mentre la seconda tabella specificata dopo il LEFT JOIN naturale è la tabella giusta.
- La clausola OUTER è facoltativa; LEFT natural OUTER JOIN è uguale a LEFT JOIN.
Uscita
Come potete vedere, sono incluse tutte le righe della tabella degli studenti, per un totale di 10 studenti. Anche se il quarto e l'ultimo studente, Jena e George, hanno ID di dipartimento non presenti nella tabella dei dipartimenti, sono comunque inclusi.
In questi casi, il valore departmentName sia per Jena che per George sarà "null" perché la tabella dei dipartimenti non ha un departmentName che corrisponda al loro valore departmentId.
Analizziamo più nel dettaglio la query precedente utilizzando il left join, avvalendoci dei diagrammi di Venn:
La LEFT JOIN restituirà tutti i nomi degli studenti dalla tabella degli studenti, anche se lo studente ha un ID di dipartimento che non esiste nella tabella dei dipartimenti. Pertanto, la query non restituirà solo le righe corrispondenti come nel caso della INNER JOIN, ma includerà anche le righe non corrispondenti della tabella di sinistra, ovvero la tabella degli studenti.
Tieni presente che qualsiasi nome di studente che non ha un dipartimento corrispondente avrà un valore "null" per il nome del dipartimento, perché non esiste un valore corrispondente e tali valori sono i valori nelle righe non corrispondenti.
SQLite CROSS UNISCI
Un CROSS JOIN fornisce il prodotto cartesiano per le colonne selezionate delle due tabelle unite, abbinando tutti i valori della prima tabella con tutti i valori della seconda tabella.
Quindi, per ogni valore nella prima tabella, otterrai 'n' corrispondenze dalla seconda tabella dove n è il numero delle righe della seconda tabella.
A differenza di INNER JOIN e LEFT OUTER JOIN, con CROSS JOIN non è necessario specificare una condizione di join, perché SQLite non è necessario per il CROSS JOIN.
Migliori SQLite Ciò produrrà un insieme di risultati logici combinando tutti i valori della prima tabella con tutti i valori della seconda tabella.
Ad esempio, se si seleziona una colonna dalla prima tabella (colA) e un'altra colonna dalla seconda tabella (colB). La colonna A contiene due valori (1,2) e anche la colonna B contiene due valori (3,4).
Quindi il risultato del CROSS JOIN sarà di quattro righe:
- Due righe combinando il primo valore di colA che è 1 con i due valori di colB (3,4) che saranno (1,3), (1,4).
- Allo stesso modo, due righe combinando il secondo valore di colA che è 2 con i due valori di colB (3,4) che sono (2,3), (2,4).
Esempio
Nella seguente query proveremo il CROSS JOIN tra le tabelle Studenti e Dipartimenti:
SELECT Students.StudentName, Departments.DepartmentName FROM Students CROSS JOIN Departments;
Spiegazione
- Nel SQLite seleziona da più tabelle, abbiamo appena selezionato due colonne "studentname" dalla tabella degli studenti e "departmentName" dalla tabella dei dipartimenti.
- Per il cross join, non abbiamo specificato alcuna condizione di join, ma semplicemente unito le due tabelle con CROSS JOIN nel mezzo.
Uscita
Come puoi vedere, il risultato è di 40 righe; 10 valori dalla tabella studenti confrontati con i 4 dipartimenti dalla tabella dipartimenti. Come segue:
- Quattro valori per i quattro dipartimenti della tabella dei dipartimenti abbinati al primo studente Michel.
- Quattro valori per i quattro dipartimenti dalla tabella dei dipartimenti corrispondevano al secondo studente John.
- Quattro valori per i quattro dipartimenti dalla tabella dei dipartimenti abbinati al terzo studente Jack... e così via.












