Join (SQL): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
+F
Funzionalità collegamenti suggeriti: 2 collegamenti inseriti.
 
(45 versioni intermedie di 26 utenti non mostrate)
Riga 1:
{{F|informaticaprogrammazione|giugno 2018}}
Il '''<code>JOIN</code>''' è una clausola del linguaggio [[SQL]] che serve a combinare le tuple di due o più [[Modello relazionale|relazioni]] di un [[database]] tramite l'operazione di congiunzione dell'[[algebra relazionale]]. Lo standard [[ANSI]] definisce alcune specifiche per il linguaggio SQL sul tipo di <code>JOIN</code> da effettuare: <code>INNER</code>, <code>FULL</code>, <code>LEFT</code> e <code>RIGHT</code>, alle quali diversi [[DBMS]] aggiungono <code>CROSS</code>. In alcuni casi è possibile che una tabella possa essere combinata con se stessa, in questo caso si parlerà di ''self-join''.
 
La '''JOIN''' è una clausola del linguaggio [[SQL]] che serve a combinare le [[tuple]] di due o più [[Modello relazionale|relazioni]] di una [[base di dati]]. Lo standard [[ANSI]] definisce alcune specifiche per il linguaggio SQL sul tipo di JOIN da effettuare: {{Codice|codice=INNER JOIN|linguaggio=SQL}}, {{Codice|codice=FULL JOIN|linguaggio=SQL}}, {{Codice|codice=LEFT JOIN|linguaggio=SQL}} e {{Codice|codice=RIGHT JOIN|linguaggio=SQL}}, alle quali diversi [[DBMS]] aggiungono {{Codice|codice=CROSS JOIN|linguaggio=SQL}}. In alcuni casi è possibile che una tabella possa essere combinata con se stessa, in questo caso si parlerà di ''self-join''.
== Tabelle di esempio ==
 
== Tabelle di esempio ==
Tutti gli esempi che verranno riportati di seguito faranno uso delle seguenti due tabelle
Tutti gli esempi che verranno riportati di seguito faranno uso delle seguenti due tabelle:
 
{| class="wikitable" style="text-align:center; float:left; margin-right:5px"
Riga 21:
| Monti || 34
|-
| Grassi || <code>[[Null]]</code>{{Codice|codice=NULL|linguaggio=SQL}}
|}
 
Riga 27:
|+ Tabella Dipartimenti
|-
! <u>ID_dipartimento</u> !! Nome_dipartimento
|-
| 31 || Vendite
Riga 38:
|}
 
<code>Dipartimenti.ID_dipartimento</code> è la chiave primaria che ha una cardinalità 0:n nei confronti del campo <code>Impiegati.ID_dipartimento</code>
{{clear}}
<code>Dipartimenti.ID_dipartimento</code> è la [[chiave primaria]] che ha una [[cardinalità]] 0:n nei confronti del campo <code>Impiegati.ID_dipartimento</code>.
Nota: Il dipartimento "Promozione" della tabella "Dipartimenti" non ha alcuna corrispondenza nella tabella "Impiegati". Mentre l'impiegato "Grassi" non è stato assegnato ad alcun dipartimento (<code>[[Null]]</code>).
 
Nota: Il dipartimento <code>Promozione</code> della tabella <code>Dipartimenti</code> non ha alcuna corrispondenza nella tabella <code>Impiegati</code>. Mentre l'impiegato <code>Grassi</code> non è stato assegnato ad alcun dipartimento ([[NULL]]).
 
== Inner join ==
[[File:SQL Join - 07 A Inner Join B.svg|miniatura|[[Diagramma di Venn]] che rappresenta la {{Codice|codice=INNER JOIN|linguaggio=SQL}} di due tabelle]]
Una inner join crea una nuova tabella combinando i valori delle due tabelle di partenza (A and 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 inner join è la forma di join usata più di frequente nelle applicazioni e rappresenta la modalità predefinita.
Una {{Codice|codice=INNER JOIN|linguaggio=SQL}} crea una nuova tabella combinando i valori delle due tabelle di partenza (<math>A</math> e <math>B</math>) basandosi su una certa regola di confronto. La query compara ogni riga della tabella <math>A</math> con ciascuna riga della tabella <math>B</math> cercando di soddisfare la regola di confronto definita. Quando la regola di join viene soddisfatta, i valori di tutte le colonne delle tabelle <math>A</math> e <math>B</math> vengono combinate in un'unica riga nella costruzione della tabella risultante. La {{Codice|codice=INNER JOIN|linguaggio=SQL}} è la forma di join usata più di frequente nelle applicazioni e rappresenta la modalità predefinita.
 
Per esempio, la seguente query unirà le due tabelle <code>Impiegati</code> e <code>Dipartimenti</code> usando la chiave primaria <code>ID_dipartimento</code> che è la colonna presente in entrambe le tabelle. Quando <code>ID_dipartimento</code> corrisponde in entrambe le tabelle (ovvero la regola è soddisfatta), la query combinerà le colonne <code>Cognome</code>, <code>ID_dipartimento</code> e <code>Nome_dipartimento</code> in un'unica riga per la tabella risultante.
 
Esempio di {{Codice|codice=INNER JOIN|linguaggio=SQL}} in forma esplicita:
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.
 
<syntaxhighlight lang="sql" line="1">
Esempio di inner join in forma esplicita:
<source lang=sql>
SELECT *
FROM Impiegati
INNER JOIN Dipartimenti
ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
</syntaxhighlight>
</source>
 
che equivale a:
 
<source lang=sql>
<syntaxhighlight lang="sql" line="1">
SELECT *
FROM Impiegati, Dipartimenti
WHERE Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
</syntaxhighlight>
</source>
 
Risultato della query di Inner{{Codice|codice=INNER joinJOIN|linguaggio=SQL}}:
 
{| class="wikitable" style="text-align:center"
Riga 77 ⟶ 81:
|-
| Rossi || 31 || Vendite || 31
|-
|}
 
'''Nota''': l'impiegato "<code>Grassi"</code> e il dipartimento "<code>Promozione"</code> non sono presenti in quanto l'impiegato <code>Grassi</code> ha un {{Codice|codice=NULL|linguaggio=SQL}} mentre <code>[[Null]]Promozione</code> 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 Outer{{Codice|codice=OUTER joinJOIN|linguaggio=SQL}}.
 
=== 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 {{Codice|codice=<|linguaggio=SQL}}) squalifica la ''join'' come ''equi-join''. La query riportata di seguito utilizza una ''equi-join'':
 
<syntaxhighlight lang="sql" line="1">
==== Equi-join ====
La '''equi-join''', altrimenti conosciuta come '''equijoin''', 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 <code>&lt;</code>) squalifica la join come equi-join. La query riportata di seguito utilizza una equi-join:
<source lang=sql>
SELECT *
FROM Impiegati
INNER JOIN Dipartimenti
ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
</syntaxhighlight>
</source>
 
SQL fornisce una scorciatoia per definire le equi-joins, attraverso la keyword[[parola <code>riservata]] {{Codice|codice=USING</code>|linguaggio=SQL}}
 
<source lang=sql>
<syntaxhighlight lang="sql" line="1">
SELECT *
FROM Impiegati
INNER JOIN Dipartimenti
USING (ID_dipartimento)
</syntaxhighlight>
</source>
 
La ''keyword'' <code>{{Codice|codice=USING</code>|linguaggio=SQL}} è supportata da [[Microsoft SQL Server Management Studio]], [[MySQL]], [[Oracle Database|Oracle]], [[PostgreSQL]], [[SQLite]], e [[IBM DB2|DB2/400]].
 
==== Natural join ====
Una {{Codice|codice=NATURAL JOIN|linguaggio=SQL}} offre ulteriori specializzazioni di ''equi-join''. Solitamente la {{Codice|codice=JOIN|linguaggio=SQL}} confronta colonne di tabelle diverse che hanno lo stesso nome. La {{Codice|codice=NATURAL JOIN|linguaggio=SQL}} fa proprio questo.
 
Nell'esempio che segue viene riportata la notazione {{Codice|codice=NATURAL JOIN|linguaggio=SQL}} equivalente alla prima {{Codice|codice=INNER JOIN|linguaggio=SQL}} definita:
Una [[natural join]] offre ulteriori specializzazioni di equi-join. Solitamente la join confronta colonne di tabelle diverse che hanno lo stesso nome. La natural join fa proprio questo.
 
<syntaxhighlight lang="sql" line="1">
Nell'esempio che segue viene riportata la notazione natural join equivalente alla prima inner-join definita:
<source lang=sql>
SELECT *
FROM Impiegati
NATURAL JOIN Dipartimenti
</syntaxhighlight>
</source>
 
{| class="wikitable" style="text-align:center"
Riga 126 ⟶ 132:
|}
 
==== Cross join ====
[[File:SQL Join - 08 A Cross Join B.svg|miniatura|Immagine che rappresenta la {{Codice|codice=CROSS JOIN|linguaggio=SQL}} di due tabelle]]
Una {{Codice|codice=CROSS JOIN|linguaggio=SQL}}, ''cartesian join'' o ''product'' fornisce le basi (le infrastrutture informatiche) attraverso cui tutti i tipi di {{Codice|codice=INNER JOIN|linguaggio=SQL}} operano. Il risultato di una {{Codice|codice=CROSS JOIN|linguaggio=SQL}} è il [[prodotto cartesiano]] di tutte le righe delle tabelle che concorrono alla query di ''join''. È come dire che stiamo facendo una {{Codice|codice=INNER JOIN|linguaggio=SQL}} senza impostare la regola di confronto o in cui la regola di confronto ritorna sempre vero.
 
Date le due tabelle di partenza <math>A</math> e <math>B</math>, la cross join si scrive <math>A</math> × <math>B</math>.
Una '''[[cross join]]''', '''cartesian join''' o '''product''' fornisce le basi (le infrastrutture informatiche) attraverso cui tutti i tipi di inner join operano. Il risultato di una cross join è il [[prodotto cartesiano]] di tutte le righe delle tabelle che concorrono alla query di join. È come dire che stiamo facendo una inner join senza impostare la regola di confronto o in cui la regola di confronto ritorna sempre vero.
 
Esempio di {{Codice|codice=CROSS JOIN|linguaggio=SQL}} esplicito:
Date le due tabelle di partenza A e B, la cross join si scrive A × B.
 
<syntaxhighlight lang=sql>
Esempio di cross join esplicito:
<source lang=sql>
SELECT *
FROM Impiegati CROSS JOIN Dipartimenti
</syntaxhighlight>
</source>
 
Altro esempio implicito di {{Codice|codice=CROSS JOIN|linguaggio=SQL}}:
 
<syntaxhighlight lang=sql>
Altro esempio implicito di cross join:
<source lang=sql>
SELECT *
FROM Impiegati, Dipartimenti;
</syntaxhighlight>
</source>
 
{| class="wikitable" style="text-align:center"
Riga 158 ⟶ 166:
| Santoro || 34 || Vendite || 31
|-
| Grassi || <code>[[Null]]</code> {{Codice|codice=NULL|linguaggio=SQL}}|| Vendite || 31
|-
| Rossi || 31 || Tecnico || 33
Riga 170 ⟶ 178:
| Santoro || 34 || Tecnico || 33
|-
| Grassi || <code>[[Null]]</code> {{Codice|codice=NULL|linguaggio=SQL}}|| Tecnico || 33
|-
| Rossi || 31 || Risorse umane || 34
Riga 182 ⟶ 190:
| Santoro || 34 || Risorse umane || 34
|-
| Grassi || <code>[[Null]]</code> {{Codice|codice=NULL|linguaggio=SQL}}|| Risorse umane || 34
|-
| Rossi || 31 || Promozione || 35
Riga 194 ⟶ 202:
| Santoro || 34 || Promozione || 35
|-
| Grassi || <code>[[Null]]</code> {{Codice|codice=NULL|linguaggio=SQL}}|| Promozione || 35
|}
 
== Outer join ==
Una {{Codice|codice=OUTER JOIN|linguaggio=SQL}} 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 {{Codice|codice=OUTER JOIN|linguaggio=SQL}} si suddividono in {{Codice|codice=LEFT OUTER JOIN|linguaggio=SQL}}, {{Codice|codice=RIGHT OUTER JOIN|linguaggio=SQL}}, e {{Codice|codice=FULL OUTER JOIN|linguaggio=SQL}}, 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'' {{Codice|codice=JOIN|linguaggio=SQL}}.
 
=== Nota sulle clausole WHERE e ON ===
Una [[outer join]] 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 outer join si suddividono in ''left outer join'', ''right outer join'', e ''full outer join'', 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).
Si sottolinea come esista un ordine di esecuzione tra le condizioni specificate nella {{Codice|codice=WHERE|linguaggio=SQL}} e quelle presenti nella {{Codice|codice=ON|linguaggio=SQL}}.
 
Specificatamente le clausole presenti nella {{Codice|codice=ON|linguaggio=SQL}} sono valutate anteriormente all'esecuzione della {{Codice|codice=JOIN|linguaggio=SQL}} mentre le clausole nella where sono valutate successivamente all'esecuzione della {{Codice|codice=JOIN|linguaggio=SQL}}.
(In questo caso ''left'' (sinistra) e ''right'' (destra) si riferiscono ai due lati della keyword <code>JOIN</code>.)
 
=== Left outer join ===
[[File:SQL Join - 01b A Left Join B.svg|miniatura|[[Diagramma di Venn]] che rappresenta la {{Codice|codice=LEFT OUTER JOIN|linguaggio=SQL}} di due tabelle]]
 
Il risultato di una query ''left{{Codice|codice=LEFT outerOUTER join''JOIN|linguaggio=SQL}} (o semplicemente '''left{{Codice|codice=LEFT join'''JOIN|linguaggio=SQL}}) per le tabelle <math>A</math> e <math>B</math> contiene sempre tutti i record della tabella di sinistra ("''left"'') <math>A</math>, mentre vengono estratti dalla tabella di destra ("''right"'') <math>B</math> solamente le righe che trovano corrispondenza nella regola di confronto della join. Questo significa che se la clausola <code>{{Codice|codice=ON</code>|linguaggio=SQL}} trova 0 (zero) righe in <math>B</math>, la join{{Codice|codice=JOIN|linguaggio=SQL}} mostrerà una riga risultante con valore {{Codice|codice=NULL|linguaggio=SQL}} in tutte le colonne corrispondenti al risultato per le colonne di <math>B</math>.
 
Esempio di una left outer join:
 
<sourcesyntaxhighlight lang="sql" line="1">
SELECT *
FROM Impiegati LEFT OUTER JOIN Dipartimenti
ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
</syntaxhighlight>
</source>
 
{| class="wikitable" style="text-align:center"
Riga 226 ⟶ 236:
| Monti || 34 || Risorse umane || 34
|-
| Grassi || {{Codice|codice=NULL|linguaggio=SQL}} || {{Codice|codice=NULL|linguaggio=SQL}} || {{Codice|codice=NULL|linguaggio=SQL}}
| ''Grassi'' || <code>[[Null]]</code> || <code>[[Null]]</code> || <code>[[Null]]</code>
|-
| Mancini || 33 || Tecnico || 33
Riga 232 ⟶ 242:
 
=== Right outer join ===
[[File:SQL Join - 03b A Right Join B.svg|miniatura|[[Diagramma di Venn]] che rappresenta la {{Codice|codice=RIGHT OUTER JOIN|linguaggio=SQL}} di due tabelle]]
Una {{Codice|codice=RIGHT OUTER JOIN|linguaggio=SQL}} (o {{Codice|codice=RIGHT JOIN|linguaggio=SQL}}) semplicemente ricalca il funzionamento della {{Codice|codice=LEFT OUTER JOIN|linguaggio=SQL}}, ma invertendo l'ordine delle tabelle interessate.
 
Il risultato di una query {{Codice|codice=RIGHT OUTER JOIN|linguaggio=SQL}} per le tabelle <math>A</math> e <math>B</math> contiene sempre tutti i record della tabella di destra (''right'') <math>B</math>, mentre vengono estratti dalla tabella di sinistra (''left'') <math>A</math> solamente le righe che trovano corrispondenza nella regola di confronto della {{Codice|codice=JOIN|linguaggio=SQL}}. Questo significa che se la clausola {{Codice|codice=ON|linguaggio=SQL}} trova zero righe in <math>A</math>, la {{Codice|codice=JOIN|linguaggio=SQL}} mostrerà una riga risultante con valore {{Codice|codice=NULL|linguaggio=SQL}} in tutte le colonne corrispondenti al risultato per le colonne di <math>A</math>.
Una '''right outer join''' (o '''right join''') semplicemente ricalca il funzionamento della left outer join, ma invertendo l'ordine delle tabelle interessate.
 
Esempio di una {{Codice|codice=RIGHT OUTER JOIN|linguaggio=SQL}}:
Il risultato di una query ''right outer join'' 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 join. Questo significa che se la clausola <code>ON</code> trova 0 (zero) righe in A, la join mostrerà una riga risultante con valore NULL in tutte le colonne corrispondenti al risultato per le colonne di A.
 
<syntaxhighlight lang="sql" line="1">
Esempio di una right outer join:
 
<source lang=sql>
SELECT *
FROM Impiegati RIGHT OUTER JOIN Dipartimenti
ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
</syntaxhighlight>
</source>
 
{| class="wikitable" style="text-align:center"
Riga 258 ⟶ 268:
| Rossi || 31 || Vendite || 31
|-
| <code>[[Null]]</code> {{Codice|codice=NULL|linguaggio=SQL}}|| <code>[[Null]]</code> {{Codice|codice=NULL|linguaggio=SQL}}|| ''Promozione'' || ''35''
|}
 
In pratica sono utilizzate maggiormente le query di left{{Codice|codice=LEFT outerOUTER joinJOIN|linguaggio=SQL}} rispetto a quelle di right{{Codice|codice=RIGHT outerOUTER joinJOIN|linguaggio=SQL}}, ma possono verificarsi rari casi in cui in query molto complesse ci sia la necessità di utilizzare contemporaneamente il criterio di left{{Codice|codice=LEFT outerOUTER joinJOIN|linguaggio=SQL}} e di right{{Codice|codice=RIGHT outerOUTER joinJOIN|linguaggio=SQL}}.
 
Lo stesso risultato della precedente right{{Codice|codice=RIGHT outerOUTER joinJOIN|linguaggio=SQL}} si può ripetere usando il tipo left{{Codice|codice=LEFT outerOUTER joinJOIN|linguaggio=SQL}}:
 
<sourcesyntaxhighlight lang="sql" line="1">
SELECT *
FROM Dipartimenti LEFT OUTER JOIN Impiegati
ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
</syntaxhighlight>
</source>
 
=== Full outer join ===
[[File:SQL Join - 05b A Full Join B.svg|miniatura|[[Diagramma di Venn]] che rappresenta la {{Codice|codice=FULL OUTER JOIN|linguaggio=SQL}} di due tabelle]]
Una {{Codice|codice=FULL OUTER JOIN|linguaggio=SQL}} combina i risultati delle due tabelle <math>A</math> e <math>B</math> tenendo conto di tutte le righe delle tabelle, anche di quelle che non hanno corrispondenza tra di loro.
 
Il risultato di una query {{Codice|codice=FULL OUTER JOIN|linguaggio=SQL}} per le tabelle <math>A</math> e <math>B</math> contiene sempre tutti i record della tabella di sinistra (''left'') <math>A</math>, estraendo dalla tabella di destra (''right'') <math>B</math> solamente le righe che trovano corrispondenza nella regola di confronto della join; inoltre verranno estratti tutti i record della tabella di sinistra (''left'') <math>A</math> che non trovano corrispondenza nella tabella di destra (''right'') <math>B</math> impostando a {{Codice|codice=NULL|linguaggio=SQL}} i valori di tutte le colonne della tabella <math>B</math> e tutti i record della tabella di destra (''right'') <math>B</math> che non trovano corrispondenza nella tabella di sinistra (''left'') <math>A</math> impostando a {{Codice|codice=NULL|linguaggio=SQL}} i valori di tutte le colonne della tabella <math>A</math>.
Una '''[[full outer join]]''' 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.
 
Esempio di una {{Codice|codice=FULL OUTER JOIN|linguaggio=SQL}}:
Il risultato di una query ''full outer join'' 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 NULL 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 NULL i valori di tutte le colonne della tabella A.
 
<syntaxhighlight lang="sql" line="1">
Esempio di una full outer join:
 
<source lang=sql>
SELECT *
FROM Impiegati
FULL OUTER JOIN Dipartimenti
ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
</syntaxhighlight>
</source>
 
{| class="wikitable" style="text-align:center"
Riga 295 ⟶ 305:
| Santoro || 34 || Risorse umane || 34
|-
| ''Grassi'' || {{Codice|codice=NULL|linguaggio=SQL}} || {{Codice|codice=NULL|linguaggio=SQL}} || {{Codice|codice=NULL|linguaggio=SQL}}
| ''Grassi'' || <code>[[Null]]</code> || <code>[[Null]]</code> || <code>[[Null]]</code>
|-
| Mancini || 33 || Tecnico || 33
Riga 301 ⟶ 311:
| Rossi || 31 || Vendite || 31
|-
| <code>[[Null]]</code> {{Codice|codice=NULL|linguaggio=SQL}}|| <code>[[Null]]</code>{{Codice|codice=NULL|linguaggio=SQL}} || ''Promozione'' || ''35''
|}
 
Alcuni database (come adper esempio MySQL) non supportano direttamente questa funzionalità, ma la si può emulare attraverso la combinazione di left{{Codice|codice=LEFT OUTER JOIN|linguaggio=SQL}} e right{{Codice|codice=RIGHT outerOUTER joinJOIN|linguaggio=SQL}} per mezzo della keywordparola [[Unionriservata (SQL){{Codice|union]]codice=UNION|linguaggio=SQL}}.
 
La creazione di una query di full{{Codice|codice=FULL outerOUTER joinJOIN|linguaggio=SQL}} si realizzerà come segue:
 
<sourcesyntaxhighlight lang="sql" line="1">
SELECT *
FROM Impiegati
Riga 319 ⟶ 329:
ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
WHERE Impiegati.ID_dipartimento IS NULL
</syntaxhighlight>
</source>
 
Allo stesso modo senza utilizzare nemmeno la query di right{{Codice|codice=RIGHT outerOUTER joinJOIN|linguaggio=SQL}}:
 
<sourcesyntaxhighlight lang="sql" line="1">
SELECT Impiegati.*, Dipartimenti.*
FROM Impiegati
Riga 334 ⟶ 344:
ON Impiegati.ID_dipartimento = Dipartimenti.ID_dipartimento
WHERE Impiegati.ID_dipartimento IS NULL
</syntaxhighlight>
</source>
 
== Self-join ==
La ''self-join'' serve a unire una tabella con se stessa.
 
La self-join serve ad unire una tabella con se stessa.
 
== Voci correlate ==
Riga 344 ⟶ 353:
* [[SQL]]
 
== Altri progetti ==
==Collegamenti esterni==
{{interprogetto|preposizione=sulla}}
* [https://kb.askmonty.org/it/introduzione-alle-join/ Introduzione alle JOIN] nella knowledgebase di AskMonty
 
== Collegamenti esterni ==
* {{FOLDOC||join}}
* {{Cita web | url = https://kb.askmonty.org/it/introduzione-alle-join/ | titolo = Introduzione alle JOIN (nella knowledgebase di AskMonty) | accesso = 18 ottobre 2022 | urlarchivio = https://archive.is/20121220173307/https://kb.askmonty.org/it/introduzione-alle-join/ | dataarchivio = 20 dicembre 2012 }}
 
{{Principali linguaggi di programmazione}}
{{portale|informatica}}
 
[[Categoria:Linguaggi di interrogazione]]
[[Categoria:SQL]]