Torna all'elenco degli articoli Articoli
Tempo di lettura: 4 minuti

JOIN SQL

Una JOIN SQL è un metodo per recuperare dati da due o più tabelle di database. Questo articolo presenta una panoramica di base sull'aspetto dei dati di una particolare join SQL. Un modo popolare di comprendere le unioni SQL è quello di visualizzarle utilizzando i diagrammi di Venn, per cui ogni esempio ha il diagramma di Venn corrispondente, l'istruzione SELECT appropriata e la tabella dei risultati.

Esistono alcuni tipi principali di join SQL:

  • INNER JOIN
  • [LEFT | RIGHT | FULL] OUTER JOIN
  • NATURAL JOIN
  • CROSS JOIN

Distinguiamo l'implementazione di questi join in base agli operatori di join:

  • equi e
  • theta, che verranno descritti in seguito.
tipi di join sql

Per gli scopi di questo articolo, parliamo di join con un semplice esempio. Supponiamo di avere due tabelle di base, TabellaA e TabellaB, riempite con alcuni dati di esempio. Poiché uniremo le tabelle sulla colonna name, distingueremo le righe con lo stesso nome evidenziandole in rosso.

Due esempi di tabelle del database, SQL JOIN

Nelle sezioni seguenti vedremo cosa succede a questi dati quando vengono implementati diversi tipi di join.

CROSS JOIN

Una CROSS JOIN è un prodotto cartesiano di TabellaA e TabellaB. Ogni riga della TabellaA viene abbinata a ogni riga della TabellaB; ecco perché una CROSS JOIN non ha senso nella maggior parte delle situazioni.

Diagramma di Venn che illustra la CROSS JOIN SQL

SELECT *
FROM tableA
CROSS JOIN tableB;

Esempio di funzionamento dell'SQL CROSS JOIN su due tabelle

TabellaA e TabellaB contengono 4 righe. La tabella risultante avrà 4 * 4 = 16 righe e avrà il seguente aspetto:

La tabella che è il risultato di SQL CROSS JOIN

INNER JOIN

Una INNER JOIN unisce SOLO le righe corrispondenti in ENTRAMBE le tabelle. Una JOIN senza altre parole chiave (come INNER, OUTER, LEFT, ecc.) è una INNER JOIN. I risultati vengono trovati nell'area di sovrapposizione.

Diagramma di Venn che illustra l'INNER JOIN di SQL
 
SELECT *
FROM tableA
INNER JOIN tableB
  ON tableA.name = tableB.name

Esempio di funzionamento di SQL INNER JOIN su due tabelle

La tabella risultante sarà la seguente:

La tabella che è il risultato di una INNER JOIN SQL

OUTER JOIN

FULL OUTER JOIN restituisce le righe corrispondenti e non corrispondenti di entrambe le tabelle (è un'unione di entrambe). Se non c'è corrispondenza, il lato mancante conterrà null.

Diagramma di Venn che illustra l'SQL FULL OUTER JOIN

 
SELECT *
FROM TableA
FULL OUTER JOIN TableB
  ON TableA.name = TableB.name;

Esempio di funzionamento dell'SQL FULL OUTER JOIN su due tabelle

La tabella risultante sarà la seguente:

La tabella che è il risultato di una giunzione SQL FULL OUTER JOIN

Una LEFT OUTER JOIN restituisce tutte le righe della tabella di sinistra (TabellaA) con le righe corrispondenti della tabella di destra (TabellaB) o null - se non c'è corrispondenza nella tabella di destra.

I risultati si trovano nell'intero cerchio di sinistra:

Diagramma di Venn che illustra la giunzione SQL LEFT OUTER JOIN

SELECT *
FROM TableA
LEFT OUTER JOIN TableB
  ON tableA.name = tableB.name;

Esempio di come funziona l'SQL LEFT OUTER JOIN su due tabelle

La tabella risultante sarà la seguente:

La tabella che è il risultato di SQL LEFT OUTER JOIN

Una RIGHT OUTER JOIN restituisce tutte le righe della tabella di destra (TabellaB) con le righe corrispondenti della tabella di sinistra (TabellaA) o null - se non c'è corrispondenza nella tabella di sinistra.

I risultati si trovano nell'intero cerchio di destra:

Diagramma di Venn che illustra l'SQL RIGHT OUTER JOIN

SELECT *
FROM tableA
RIGHT OUTER JOIN tableB
  ON tableA.name = tableB.name

Esempio di funzionamento dell'SQL RIGHT OUTER JOIN su due tabelle

La tabella risultante sarà la seguente:

La tabella che è il risultato di SQL RIGHT OUTER JOIN

Giunzioni basate su operatori

Implementazione dell'equi-join

Questa giunzione viene effettuata utilizzando l'operatore di uguaglianza (=) per confrontare i valori della PrimaryKey di una tabella e i valori della Foreign Key di un'altra tabella.

SELECT *
FROM TableA
INNER/OUTER JOIN TableB
  ON TableA.PK =TableB.Fk;

Implementazione della giunzione teta (non equa)

È la stessa cosa della JOIN equi, ma consente tutti gli altri operatori come >, &lt, >= ecc.

SELECT *
FROM TableA 
INNER/OUTER JOIN TableB
  ON tableA.Pk <= tableB.Fk;

Implementazione dell'autogiunzione

Questo tipo di JOIN viene solitamente utilizzato in caso di relazioni unarie, in cui una tabella viene combinata con se stessa.

SELECT *
FROM TableA A1
JOIN TableA A2
  ON A1.Pk = A2.Fk;

NATURAL JOIN

Una join NATURAL è un tipo di join EQUI. Non è necessario utilizzare una clausola ON. Le colonne con lo stesso nome nelle tabelle associate appaiono una sola volta.

SELECT * 
FROM tableA
NATURAL JOIN tableB

Manipolando le parole chiave si possono escludere dati specifici.

Una OUTER EXCLUDING JOIN restituisce tutti i record della TabellaA e tutti i record della TabellaB che non corrispondono.

Diagramma di Venn che illustra la CONGIUNZIONE ESTERNA EXCLUDENTE SQL
SELECT *
FROM tableA
FULL OUTER JOIN tableB
  ON tableA.name = tableB.name
WHERE tableA.name IS NULL
  OR tableB.name IS NULL

Esempio di funzionamento di SQL OUTER EXCLUDING JOIN su due tabelle

La tabella risultante sarà la seguente:

La tabella che è il risultato di una JOIN EXCLUDENTE SQL OUTER

Una LEFT EXCLUDING JOIN restituisce tutti i record della TabellaA che non corrispondono a nessun record della TabellaB.

Diagramma di Venn che illustra il collegamento SQL LEFT EXCLUDING JOIN

SELECT *
FROM tableA
LEFT JOIN tableB
  ON tableA.name = tableB.name
WHERE tableB.name IS NULL

Esempio di funzionamento di SQL LEFT EXCLUDING JOIN su due tabelle

La tabella risultante sarà la seguente:

La tabella che è il risultato di SQL LEFT EXCLUDING JOIN

Una RIGHT EXCLUDING JOIN restituisce tutti i record della TabellaB che non corrispondono a nessun record della TabellaA.

Diagramma di Venn che illustra la GIUNTA ESCLUSIVA DESTRA di SQL

SELECT *
FROM tableA
RIGHT JOIN tableB
  ON tableA.name = tableB.name
WHERE tableA.name IS NULL

Esempio di funzionamento della RIGHT EXCLUDING JOIN SQL su due tabelle

La tabella risultante sarà la seguente:

La tabella che è il risultato di SQL RIGHT EXCLUDING JOIN