Join (SQL): differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m →Collegamenti esterni: |date ----> |data |
Funzionalità collegamenti suggeriti: 2 collegamenti inseriti. |
||
(23 versioni intermedie di 11 utenti non mostrate) | |||
Riga 1:
{{F|
Il '''<code>JOIN</code>''' è 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 <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''.▼
▲
== Tabelle di esempio ==▼
▲== Tabelle di esempio ==
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 ||
|}
Riga 27:
|+ Tabella Dipartimenti
|-
!
|-
| 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
== 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
Per esempio, la seguente query unirà le due tabelle
Esempio di
<syntaxhighlight lang="sql" line="1">
SELECT *
FROM Impiegati
Riga 56 ⟶ 59:
che equivale a:
<syntaxhighlight lang="sql" line="1">
SELECT *
FROM Impiegati, Dipartimenti
Riga 62 ⟶ 66:
</syntaxhighlight>
Risultato della query di
{| class="wikitable" style="text-align:center"
Riga 77 ⟶ 81:
|-
| Rossi || 31 || Vendite || 31
|}
=== Equi-join ===
La
<syntaxhighlight lang="sql" line="1">
SELECT *
FROM Impiegati
Riga 91 ⟶ 95:
</syntaxhighlight>
SQL fornisce una scorciatoia per definire le equi-joins, attraverso la
<syntaxhighlight lang="sql" line="1">
SELECT *
FROM Impiegati
Riga 99 ⟶ 104:
</syntaxhighlight>
La ''keyword''
=== Natural join ===
Una
Nell'esempio che segue viene riportata la notazione
▲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:
▲<syntaxhighlight lang=sql>
SELECT *
FROM Impiegati
NATURAL JOIN Dipartimenti </syntaxhighlight>
Riga 127 ⟶ 133:
=== 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
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>
SELECT *
Riga 138 ⟶ 145:
</syntaxhighlight>
Altro esempio implicito di
<syntaxhighlight lang=sql>
SELECT *
Riga 158 ⟶ 166:
| Santoro || 34 || Vendite || 31
|-
| Grassi ||
|-
| Rossi || 31 || Tecnico || 33
Riga 170 ⟶ 178:
| Santoro || 34 || Tecnico || 33
|-
| Grassi ||
|-
| Rossi || 31 || Risorse umane || 34
Riga 182 ⟶ 190:
| Santoro || 34 || Risorse umane || 34
|-
| Grassi ||
|-
| Rossi || 31 || Promozione || 35
Riga 194 ⟶ 202:
| Santoro || 34 || Promozione || 35
|-
| Grassi ||
|}
== Outer join ==
Una
▲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
▲'''NOTA sulle clausole WHERE e ON:'''
▲Si sottolinea come esista un ordine di esecuzione tra le condizioni specificate nella WHERE e quelle presenti nella ON.
▲Specificatamente le clausole presenti nella ON sono valutate ANTERIORMENTE all'esecuzione del join mentre le clausole nella where sono valutate SUCCESSIVAMENTE all'esecuzione del join.
=== 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
Esempio di una left outer join:
<syntaxhighlight lang="sql" line="1">
SELECT *
FROM Impiegati LEFT OUTER JOIN Dipartimenti
Riga 232 ⟶ 236:
| Monti || 34 || Risorse umane || 34
|-
| Grassi || {{Codice|codice=NULL|linguaggio=SQL}} || {{Codice|codice=NULL|linguaggio=SQL}} || {{Codice|codice=NULL|linguaggio=SQL}}
|-
| Mancini || 33 || Tecnico || 33
Riga 238 ⟶ 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
Il risultato di una query
▲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">▼
▲<syntaxhighlight lang=sql>
SELECT *
FROM Impiegati RIGHT OUTER JOIN Dipartimenti
Riga 264 ⟶ 268:
| Rossi || 31 || Vendite || 31
|-
|
|}
In pratica sono utilizzate maggiormente le query di
Lo stesso risultato della precedente
<syntaxhighlight lang="sql" line="1">
SELECT *
FROM Dipartimenti LEFT OUTER JOIN Impiegati
Riga 278 ⟶ 282:
=== 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
Il risultato di una query
▲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">▼
▲<syntaxhighlight lang=sql>
SELECT *
FROM Impiegati
Riga 301 ⟶ 305:
| Santoro || 34 || Risorse umane || 34
|-
| ''Grassi'' || {{Codice|codice=NULL|linguaggio=SQL}} || {{Codice|codice=NULL|linguaggio=SQL}} || {{Codice|codice=NULL|linguaggio=SQL}}
|-
| Mancini || 33 || Tecnico || 33
Riga 307 ⟶ 311:
| Rossi || 31 || Vendite || 31
|-
|
|}
Alcuni database (come
La creazione di una query di
<syntaxhighlight lang="sql" line="1">
SELECT *
FROM Impiegati
Riga 327 ⟶ 331:
</syntaxhighlight>
Allo stesso modo senza utilizzare nemmeno la query di
<syntaxhighlight lang="sql" line="1">
SELECT Impiegati.*, Dipartimenti.*
FROM Impiegati
Riga 343 ⟶ 347:
== Self-join ==
▲La self-join serve ad unire una tabella con se stessa.
== Voci correlate ==
Riga 350 ⟶ 353:
* [[SQL]]
== Altri progetti ==
==Collegamenti esterni==▼
{{interprogetto|preposizione=sulla}}
▲== 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:SQL]]
|