Tabelle di unione SQLite: interna, naturale, esterna sinistra, croce (esempi)

Sommario:

Anonim

SQLite supporta diversi tipi di join SQL, come INNER JOIN, LEFT OUTER JOIN e CROSS JOIN. Ogni tipo di JOIN viene utilizzato per una situazione diversa, come vedremo in questo tutorial.

In questo tutorial imparerai-

  • Introduzione alla clausola JOIN di SQLite
  • INNER JOIN
  • UNISCITI ... UTILIZZANDO
  • GIUNZIONE NATURALE
  • UNISCI ESTERNO SINISTRO
  • CROSS JOIN

Introduzione alla clausola JOIN di SQLite

Quando si lavora su un database con più tabelle, spesso è necessario ottenere dati da queste più tabelle.

Con la clausola JOIN, puoi collegare due o più tabelle o sottoquery unendole. Inoltre, è possibile definire in base a quale colonna è necessario collegare le tabelle e in base a quali condizioni.

Qualsiasi clausola JOIN deve avere la seguente sintassi:

Ogni 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 verranno selezionate le righe corrispondenti che corrispondono a quella condizione a seconda del tipo di join.

Si noti che, per tutti i seguenti esempi, è necessario eseguire sqlite3.exe e aprire una connessione al database di esempio mentre scorre:

Passaggio 1) In questo passaggio,

  1. Apri Risorse del computer e vai alla seguente directory " C: \ sqlite " e
  2. Quindi apri " sqlite3.exe ":

Passaggio 2) Apri il database " TutorialsSampleDB.db " con il seguente comando:

Ora sei pronto per eseguire qualsiasi tipo di query sul database.

SQLite INNER JOIN

L'INNER JOIN restituisce solo le righe che corrispondono alla condizione di join ed elimina tutte le altre righe che non corrispondono alla condizione di join.

Esempio

Nell'esempio seguente, uniremo le due tabelle " Studenti " e " Dipartimenti " con DepartmentId per ottenere il nome del dipartimento per ogni studente, come segue:

SELEZIONAREStudenti.StudentName,Reparti.DipartimentoNomeDA StudentiINNER JOIN Dipartimenti ON Students.DepartmentId = Departments.DepartmentId;

Spiegazione del codice:

L'INNER JOIN funziona come segue:

  • Nella clausola Select, è possibile selezionare le colonne che si desidera selezionare dalle due tabelle di riferimento.
  • La clausola INNER JOIN viene scritta dopo la prima tabella a cui fa riferimento la clausola "From".
  • Quindi la condizione di join viene specificata con ON.
  • È possibile specificare alias per le tabelle di riferimento.
  • La parola INNER è facoltativa, puoi semplicemente scrivere JOIN.

Produzione:

  • L'INNER JOIN produce i record di entrambi: gli studenti e le tabelle del dipartimento che corrispondono alla condizione " S tudents.DepartmentId = Departments.DepartmentId ". Le righe senza corrispondenza verranno ignorate e non incluse nel risultato.
  • Ecco perché solo 8 studenti di 10 studenti sono stati restituiti da questa query con i dipartimenti IT, matematica e fisica. Mentre gli studenti "Jena" e "George" non sono stati inclusi, perché hanno un ID dipartimento nullo, che non corrisponde alla colonna ID dipartimento della tabella dei dipartimenti. Come segue:

SQLite ISCRIVITI ... USANDO

L'INNER JOIN può essere scritto utilizzando la clausola "USING" per evitare ridondanze, quindi invece di scrivere "ON Students.DepartmentId = Departments.DepartmentId", puoi semplicemente scrivere "USING (DepartmentID)".

Puoi usare "JOIN ... USING" ogni volta che le colonne che confronterai nella condizione di join 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 ... USANDO:

Con "JOIN

... USANDO "non scrivi una condizione di join, scrivi solo la colonna di join che è in comune tra le due tabelle unite, invece di scrivere table1" INNER JOIN table2 ON table1.cola = table2.cola "la scriviamo come" table1 JOIN table2 USING (cola) ".

Esempio

Nell'esempio seguente, uniremo le due tabelle " Studenti " e " Dipartimenti " con DepartmentId per ottenere il nome del dipartimento per ogni studente, come segue:

SELEZIONAREStudenti.StudentName,Reparti.DipartimentoNomeDA StudentiINNER JOIN Reparti USING (DepartmentId);

Spiegazione

  • A differenza dell'esempio precedente, non abbiamo scritto " ON Students.DepartmentId = Departments.DepartmentId ". Abbiamo appena scritto " USING (DepartmentId) ".
  • SQLite deduce automaticamente la condizione di join e confronta il DepartmentId da entrambe le tabelle: Studenti e Dipartimenti.
  • È possibile utilizzare questa sintassi ogni volta che le due colonne che si stanno confrontando hanno lo stesso nome.

Produzione

  • Questo ti darà lo stesso risultato esatto dell'esempio precedente:

SQLite NATURAL JOIN

UN NATURAL JOIN è simile a un JOIN ... USING, la differenza è che verifica automaticamente l'uguaglianza tra i valori di ogni colonna presente in entrambe le tabelle.

La differenza tra INNER JOIN e NATURAL JOIN:

  • I n INNER JOIN, è necessario specificare una condizione di join che il join interno usi per unire le due tabelle. Mentre nel join naturale non scrivi una condizione di join. Devi solo scrivere i nomi delle due tabelle senza alcuna condizione. Quindi il join naturale verificherà automaticamente l'uguaglianza tra i valori per ogni colonna esistente in entrambe le tabelle. Il join naturale deduce automaticamente la condizione di join.
  • In NATURAL JOIN, tutte le colonne di entrambe le tabelle con lo stesso nome verranno confrontate 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), il join naturale unirà le due tabelle confrontando i valori di entrambe le colonne e non solo di una colonna.

Esempio

SELEZIONAREStudenti.StudentName,Reparti.DipartimentoNomeDA StudentiDipartimenti Natural JOIN;

Spiegazione

  • Non è necessario scrivere una condizione di join con i nomi delle colonne (come abbiamo fatto in INNER JOIN). Non abbiamo nemmeno bisogno di scrivere il nome della colonna una volta (come abbiamo fatto in JOIN USING).
  • Il join naturale analizzerà entrambe le colonne dalle due tabelle. Rileverà che la condizione dovrebbe essere composta dal confronto di DepartmentId da entrambe le due tabelle Studenti e Dipartimenti.

Produzione

  • Il Natural JOIN ti darà lo stesso esatto output dell'output che abbiamo ottenuto dagli esempi INNER JOIN e JOIN USING. Perché nel nostro esempio tutte e tre le query sono equivalenti. Ma in alcuni casi, l'output sarà diverso dall'unione interna quindi in un join naturale. Ad esempio, se sono presenti più tabelle con gli stessi nomi, il join naturale abbinerà tutte le colonne l'una contro l'altra. Tuttavia, il join interno corrisponderà solo alle colonne nella condizione di join (maggiori dettagli nella sezione successiva; la differenza tra il join interno e il join naturale).

SQLite LEFT OUTER JOIN

Lo standard SQL definisce tre tipi di OUTER JOIN: LEFT, RIGHT e FULL ma SQLite supporta solo 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 valore che corrisponde 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 qualsiasi valore che 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 di INNER JOIN), più le righe non corrispondenti dalla tabella di sinistra.

Esempio

Nell'esempio seguente, proveremo con "LEFT JOIN" per unire le due tabelle "Students" e "Dipartimenti":

SELEZIONAREStudenti.StudentName,Reparti.DipartimentoNomeDA Studenti: questa è la tabella a sinistraSINISTRA ISCRIVITI A Dipartimenti ON Students.DepartmentId = Departments.DepartmentId;

Spiegazione

  • 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 a sinistra. Mentre la seconda tabella specificata dopo il join sinistro è la tabella destra.
  • La clausola OUTER è facoltativa; LEFT OUTER JOIN è uguale a LEFT JOIN.

Produzione

  • Come puoi vedere sono incluse tutte le righe della tabella studenti che sono 10 studenti in totale. Anche se il quarto e ultimo studente, Jena e George DepartmentIds non esistono nella tabella Dipartimenti, sono inclusi anche loro.
  • E in questi casi, il valore departmentName sia per Jena che per George sarà "null" perché la tabella dei reparti non ha un departmentName che corrisponda al loro valore departmentId.

Diamo alla query precedente usando il join sinistro una spiegazione più approfondita usando i diagrammi di Van:

Il LEFT JOIN darà tutti i nomi degli studenti dalla tabella degli studenti anche se lo studente ha un ID dipartimento che non esiste nella tabella dei dipartimenti. Quindi, la query non ti darà solo le righe corrispondenti come INNER JOIN, ma ti darà la parte extra che ha le righe non corrispondenti dalla tabella di sinistra che è la tabella degli studenti.

Tieni presente che qualsiasi nome di studente che non ha un dipartimento corrispondente avrà un valore "nullo" per il nome del dipartimento, perché non esiste un valore corrispondente e quei valori sono i valori nelle righe non corrispondenti.

SQLite CROSS JOIN

UN CROSS JOIN fornisce il prodotto cartesiano per le colonne selezionate delle due tabelle unite, facendo corrispondere 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 di righe della seconda tabella.

A differenza di INNER JOIN e LEFT OUTER JOIN, con CROSS JOIN non è necessario specificare una condizione di join, poiché SQLite non ne ha bisogno per CROSS JOIN.

SQLite produrrà risultati logici impostati combinando tutti i valori della prima tabella con tutti i valori della seconda tabella.

Ad esempio, se hai selezionato una colonna dalla prima tabella (colA) e un'altra colonna dalla seconda tabella (colB). La colA contiene due valori (1,2) e la colB contiene anche 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 sarà (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 a CROSS JOIN tra le tabelle Studenti e Dipartimenti:

SELEZIONAREStudenti.StudentName,Reparti.DipartimentoNomeDA StudentiDipartimenti CROSS JOIN;

Spiegazione

  • Nella clausola select, 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 solo le due tabelle combinate con CROSS JOIN al centro di esse.

Produzione:

Come puoi vedere, il risultato è 40 righe; 10 valori della tabella degli studenti confrontati con i 4 dipartimenti della tabella dei dipartimenti. Come segue:

  • Quattro valori per i quattro dipartimenti dalla tabella dei dipartimenti abbinati al primo studente Michel.
  • Quattro valori per i quattro dipartimenti dalla tabella dei dipartimenti abbinati al secondo studente John.
  • Quattro valori per i quattro dipartimenti dalla tabella dei dipartimenti sono stati abbinati al terzo studente Jack.

    … e così via.

Sommario

Utilizzando SQLite JOIN, è possibile collegare insieme una o più tabelle o sottoquery per selezionare colonne da entrambe le tabelle o sottoquery.