Join (SQL)

Da testwiki.
Vai alla navigazione Vai alla ricerca

Template:F

La JOIN è una clausola del linguaggio SQL che serve a combinare le tuple di due o più relazioni di una base di dati. Lo standard ANSI definisce alcune specifiche per il linguaggio SQL sul tipo di JOIN da effettuare: Template:Codice, Template:Codice, Template:Codice e Template:Codice, alle quali diversi DBMS aggiungono Template:Codice. In alcuni casi è possibile che una tabella possa essere combinata con se stessa, in questo caso si parlerà di self-join.

Tabelle di esempio

Tutti gli esempi che verranno riportati di seguito faranno uso delle seguenti due tabelle:

Tabella Impiegati
Cognome ID_dipartimento
Rossi 31
Bianchi 33
Mancini 33
Santoro 34
Monti 34
Grassi Template:Codice
Tabella Dipartimenti
ID_dipartimento Nome_dipartimento
31 Vendite
33 Tecnico
34 Risorse umane
35 Promozione

Template:Clear Dipartimenti.ID_dipartimento è la chiave primaria che ha una cardinalità 0:n nei confronti del campo Impiegati.ID_dipartimento.

Nota: Il dipartimento Promozione della tabella Dipartimenti non ha alcuna corrispondenza nella tabella Impiegati. Mentre l'impiegato Grassi non è stato assegnato ad alcun dipartimento (NULL).

Inner join

Diagramma di Venn che rappresenta la Template:Codice di due tabelle

Una Template:Codice crea una nuova tabella combinando i valori delle due tabelle di partenza (A e B) basandosi su una certa regola di confronto. La query compara ogni riga della tabella A con ciascuna riga della tabella B cercando di soddisfare la regola di confronto definita. Quando la regola di join viene soddisfatta, i valori di tutte le colonne delle tabelle A e B vengono combinate in un'unica riga nella costruzione della tabella risultante. La Template:Codice è la forma di join usata più di frequente nelle applicazioni e rappresenta la modalità predefinita.

Per esempio, la seguente query unirà le due tabelle Impiegati e Dipartimenti usando la chiave primaria ID_dipartimento che è la colonna presente in entrambe le tabelle. Quando ID_dipartimento corrisponde in entrambe le tabelle (ovvero la regola è soddisfatta), la query combinerà le colonne Cognome, ID_dipartimento e Nome_dipartimento in un'unica riga per la tabella risultante.

Esempio di Template:Codice in forma esplicita:

SELECT *
FROM   Impiegati 
       INNER JOIN Dipartimenti 
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento

che equivale a:

SELECT *  
FROM   Impiegati, Dipartimenti 
WHERE  Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento

Risultato della query di Template:Codice:

Impiegati.Cognome Impiegati.ID_dipartimento Dipartimenti.Nome_dipartimento Dipartimenti.ID_dipartimento
Santoro 34 Risorse umane 34
Bianchi 33 Tecnico 33
Monti 34 Risorse umane 34
Mancini 33 Tecnico 33
Rossi 31 Vendite 31

Nota: l'impiegato Grassi e il dipartimento Promozione non sono presenti in quanto l'impiegato Grassi ha un Template:Codice mentre Promozione non compare in nessun impiegato. A volte come risultato finale si desidera avere anche i record che non hanno corrispondenza: in tal caso è possibile usare la query di tipo Template:Codice.

Equi-join

La equi-join, noto come "l'unica operazione ammissibile", ha un particolare tipo di comparatore, detto theta join, che utilizza come metodo di verifica, solamente l'uguaglianza matematica come regola di confronto. Usare altri operatori di confronto (come ad esempio Template:Codice) squalifica la join come equi-join. La query riportata di seguito utilizza una equi-join:

SELECT *
FROM   Impiegati 
       INNER JOIN Dipartimenti 
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento

SQL fornisce una scorciatoia per definire le equi-joins, attraverso la parola riservata Template:Codice

SELECT *
FROM   Impiegati 
       INNER JOIN Dipartimenti 
          USING (ID_dipartimento)

La keyword Template:Codice è supportata da Microsoft SQL Server Management Studio, MySQL, Oracle, PostgreSQL, SQLite, e DB2/400.

Natural join

Una Template:Codice offre ulteriori specializzazioni di equi-join. Solitamente la Template:Codice confronta colonne di tabelle diverse che hanno lo stesso nome. La Template:Codice fa proprio questo.

Nell'esempio che segue viene riportata la notazione Template:Codice equivalente alla prima Template:Codice definita:

SELECT *
FROM   Impiegati 
       NATURAL JOIN Dipartimenti
ID_dipartimento Impiegati.Cognome Dipartimenti.Nome_dipartimento
34 Monti Risorse umane
33 Bianchi Tecnico
34 Santoro Risorse umane
33 Mancini Tecnico
31 Rossi Vendite

Cross join

Immagine che rappresenta la Template:Codice di due tabelle

Una Template:Codice, cartesian join o product fornisce le basi (le infrastrutture informatiche) attraverso cui tutti i tipi di Template:Codice operano. Il risultato di una Template:Codice è il prodotto cartesiano di tutte le righe delle tabelle che concorrono alla query di join. È come dire che stiamo facendo una Template:Codice senza impostare la regola di confronto o in cui la regola di confronto ritorna sempre vero.

Date le due tabelle di partenza A e B, la cross join si scrive A × B.

Esempio di Template:Codice esplicito:

SELECT *
FROM   Impiegati CROSS JOIN Dipartimenti

Altro esempio implicito di Template:Codice:

SELECT *
FROM   Impiegati, Dipartimenti;
Impiegati.Cognome Impiegati.ID_dipartimento Dipartimenti.Nome_dipartimento Dipartimenti.ID_dipartimento
Rossi 31 Vendite 31
Bianchi 33 Vendite 31
Mancini 33 Vendite 31
Monti 34 Vendite 31
Santoro 34 Vendite 31
Grassi Template:Codice Vendite 31
Rossi 31 Tecnico 33
Bianchi 33 Tecnico 33
Mancini 33 Tecnico 33
Monti 34 Tecnico 33
Santoro 34 Tecnico 33
Grassi Template:Codice Tecnico 33
Rossi 31 Risorse umane 34
Bianchi 33 Risorse umane 34
Mancini 33 Risorse umane 34
Monti 34 Risorse umane 34
Santoro 34 Risorse umane 34
Grassi Template:Codice Risorse umane 34
Rossi 31 Promozione 35
Bianchi 33 Promozione 35
Mancini 33 Promozione 35
Monti 34 Promozione 35
Santoro 34 Promozione 35
Grassi Template:Codice Promozione 35

Outer join

Una Template:Codice non richiede che ci sia corrispondenza esatta tra le righe di due tabelle. La tabella risultante da una outer join trattiene tutti quei record che non hanno alcuna corrispondenza tra le tabelle. Le Template:Codice si suddividono in Template:Codice, Template:Codice, e Template:Codice, in base a quale sia la tabella di cui intendiamo trattenere i valori in caso di mancata corrispondenza della regola di confronto da (sinistra, destra, o entrambi). In questo caso left (sinistra) e right (destra) si riferiscono ai due lati della keyword Template:Codice.

Nota sulle clausole WHERE e ON

Si sottolinea come esista un ordine di esecuzione tra le condizioni specificate nella Template:Codice e quelle presenti nella Template:Codice.

Specificatamente le clausole presenti nella Template:Codice sono valutate anteriormente all'esecuzione della Template:Codice mentre le clausole nella where sono valutate successivamente all'esecuzione della Template:Codice.

Left outer join

Diagramma di Venn che rappresenta la Template:Codice di due tabelle

Il risultato di una query Template:Codice (o semplicemente Template:Codice) per le tabelle A e B contiene sempre tutti i record della tabella di sinistra (left) A, mentre vengono estratti dalla tabella di destra (right) B solamente le righe che trovano corrispondenza nella regola di confronto della join. Questo significa che se la clausola Template:Codice trova zero righe in B, la Template:Codice mostrerà una riga risultante con valore Template:Codice in tutte le colonne corrispondenti al risultato per le colonne di B.

Esempio di una left outer join:

SELECT *  
FROM   Impiegati  LEFT OUTER JOIN Dipartimenti  
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
Impiegati.Cognome Impiegati.ID_dipartimento Dipartimenti.Nome_dipartimento Dipartimenti.ID_dipartimento
Bianchi 33 Tecnico 33
Rossi 31 Vendite 31
Santoro 34 Risorse umane 34
Monti 34 Risorse umane 34
Grassi Template:Codice Template:Codice Template:Codice
Mancini 33 Tecnico 33

Right outer join

Diagramma di Venn che rappresenta la Template:Codice di due tabelle

Una Template:Codice (o Template:Codice) semplicemente ricalca il funzionamento della Template:Codice, ma invertendo l'ordine delle tabelle interessate.

Il risultato di una query Template:Codice per le tabelle A e B contiene sempre tutti i record della tabella di destra (right) B, mentre vengono estratti dalla tabella di sinistra (left) A solamente le righe che trovano corrispondenza nella regola di confronto della Template:Codice. Questo significa che se la clausola Template:Codice trova zero righe in A, la Template:Codice mostrerà una riga risultante con valore Template:Codice in tutte le colonne corrispondenti al risultato per le colonne di A.

Esempio di una Template:Codice:

SELECT * 
FROM   Impiegati RIGHT OUTER JOIN Dipartimenti 
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
Impiegati.Cognome Impiegati.ID_dipartimento Dipartimenti.Nome_dipartimento Dipartimenti.ID_dipartimento
Monti 34 Risorse umane 34
Bianchi 33 Tecnico 33
Santoro 34 Risorse umane 34
Mancini 33 Tecnico 33
Rossi 31 Vendite 31
Template:Codice Template:Codice Promozione 35

In pratica sono utilizzate maggiormente le query di Template:Codice rispetto a quelle di Template:Codice, ma possono verificarsi rari casi in cui in query molto complesse ci sia la necessità di utilizzare contemporaneamente il criterio di Template:Codice e di Template:Codice.

Lo stesso risultato della precedente Template:Codice si può ripetere usando il tipo Template:Codice:

SELECT * 
FROM   Dipartimenti LEFT OUTER JOIN Impiegati
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento

Full outer join

Diagramma di Venn che rappresenta la Template:Codice di due tabelle

Una Template:Codice combina i risultati delle due tabelle A e B tenendo conto di tutte le righe delle tabelle, anche di quelle che non hanno corrispondenza tra di loro.

Il risultato di una query Template:Codice per le tabelle A e B contiene sempre tutti i record della tabella di sinistra (left) A, estraendo dalla tabella di destra (right) B solamente le righe che trovano corrispondenza nella regola di confronto della join; inoltre verranno estratti tutti i record della tabella di sinistra (left) A che non trovano corrispondenza nella tabella di destra (right) B impostando a Template:Codice i valori di tutte le colonne della tabella B e tutti i record della tabella di destra (right) B che non trovano corrispondenza nella tabella di sinistra (left) A impostando a Template:Codice i valori di tutte le colonne della tabella A.

Esempio di una Template:Codice:

SELECT *  
FROM   Impiegati 
       FULL OUTER JOIN Dipartimenti 
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
Impiegati.Cognome Impiegati.ID_dipartimento Dipartimenti.Nome_dipartimento Dipartimenti.ID_dipartimento
Monti 34 Risorse umane 34
Bianchi 33 Tecnico 33
Santoro 34 Risorse umane 34
Grassi Template:Codice Template:Codice Template:Codice
Mancini 33 Tecnico 33
Rossi 31 Vendite 31
Template:Codice Template:Codice Promozione 35

Alcuni database (come per esempio MySQL) non supportano direttamente questa funzionalità, ma la si può emulare attraverso la combinazione di Template:Codice e Template:Codice per mezzo della parola riservata Template:Codice.

La creazione di una query di Template:Codice si realizzerà come segue:

SELECT *
FROM   Impiegati 
       LEFT JOIN Dipartimenti 
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
UNION
SELECT *
FROM   Impiegati
       RIGHT JOIN Dipartimenti
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
WHERE  Impiegati.ID_dipartimento IS NULL

Allo stesso modo senza utilizzare nemmeno la query di Template:Codice:

SELECT Impiegati.*, Dipartimenti.*
FROM   Impiegati 
       LEFT JOIN Dipartimenti 
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
UNION
SELECT Impiegati.*, Dipartimenti.*
FROM   Dipartimenti
       LEFT JOIN Impiegati
          ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
WHERE  Impiegati.ID_dipartimento IS NULL

Self-join

La self-join serve a unire una tabella con se stessa.

Voci correlate

Altri progetti

Template:Interprogetto

Collegamenti esterni

Template:Principali linguaggi di programmazione Template:Portale