Guida Completa ai Tipi di JOIN in SQL: INNER, OUTER, LEFT, RIGHT e CROSS JOIN con Esempi

INDICE

INTRODUZIONE

Per capire le differenze tra i vari tipi di JOIN in SQL, immaginiamo di lavorare su un database che include due tabelle chiamate Studenti e Corsi. Queste tabelle sono collegate tramite il campo IdCorso, che identifica il corso al quale ogni studente è iscritto (sebbene alcuni studenti possano non essere associati a nessun corso, come vedremo).

— Creazione della tabella Corsi
CREATE TABLE Corsi (
IdCorso INT PRIMARY KEY,
NomeCorso VARCHAR(100) NOT NULL
);

— Popolamento della tabella Corsi con alcuni dati di esempio
INSERT INTO Corsi (IdCorso, NomeCorso)
VALUES (1, ‘Matematica’), (2, ‘Informatica’), (3, ‘Fisica’), (4, ‘Chimica’);

— Creazione della tabella Studenti
CREATE TABLE Studenti (
IdStudente INT PRIMARY KEY,
Nome VARCHAR(50) NOT NULL,
Cognome VARCHAR(50) NOT NULL,
IdCorso INT, — Campo che rappresenta la relazione con la tabella Corsi
FOREIGN KEY (IdCorso) REFERENCES Corsi(IdCorso)
);

— Popolamento della tabella Studenti con alcuni dati di esempio
INSERT INTO Studenti (IdStudente, Nome, Cognome, IdCorso)
VALUES (1, ‘Mario’, ‘Rossi’, 1),
(2, ‘Luigi’, ‘Bianchi’, 2),
(3, ‘Anna’, ‘Verdi’, NULL), — Studente senza corso
(4, ‘Marco’, ‘Neri’, 3),
(5, ‘Sara’, ‘Gialli’, NULL); — Altro studente senza corso

Inner Join

L’INNER JOIN seleziona tutte le righe delle tabelle coinvolte in cui esista una corrispondenza tra i valori delle colonne specificate nella clausola ON. Per esempio:

sintassi

SELECT S.IdStudente, S.Nome, S.Cognome, C.NomeCorso FROM Studenti S INNER JOIN Corsi C ON S.IdCorso = C.IdCorso

Otteniamo i seguenti dati:

Questa query restituirà solo le righe degli studenti che hanno un corso associato. Gli studenti che non risultano iscritti a nessun corso (ad esempio, con IdCorso nullo o inesistente nella tabella Corsi) verranno esclusi.

Notare che i risultati sono identici a questa query (nota anche con il nome di self join):

SELECT S.IdStudente, S.Nome, S.Cognome, C.NomeCorso FROM Studenti S, Corsi C WHERE S.IdCorso = C.IdCorso

La differenza tra i due è che l’inner join è più performante. 

OUTER JOIN

SPIEGARE I DIVERSI TIPI DI OUTER JOIN

LEFT OUTER JOIN

Il LEFT OUTER JOIN seleziona tutte le righe della tabella che si trova a sinistra della clausola JOIN, anche se non esistono corrispondenze nella tabella di destra. Questo è utile per mostrare tutti gli studenti, indipendentemente dal fatto che siano iscritti a un corso:

SELECT * FROM Studenti S LEFT JOIN Corsi C ON S.IdCorso = C.IdCorso

RIGHT OUTER JOIN

Con il RIGHT OUTER JOIN, otteniamo tutte le righe della tabella a destra della clausola JOIN, includendo anche i corsi che non hanno studenti iscritti. Ecco un esempio:

SELECTFROM Studenti S RIGHT JOIN Corsi C ON S.IdCorso = C.IdCorso

FULL OUTER JOIN

Il FULL OUTER JOIN combina i risultati di LEFT e RIGHT, restituendo tutte le righe di entrambe le tabelle, a prescindere dalla corrispondenza tra di esse. Questo è l’ideale per vedere sia tutti gli studenti sia tutti i corsi, inclusi quelli senza associazioni:

SELECT * FROM Studenti S FULL JOIN Corsi C ON S.IdCorso = C.IdCorso

CROSS JOIN

Infine, il CROSS JOIN combina ogni riga della prima tabella con ciascuna riga della seconda tabella, generando tutte le possibili combinazioni. Per esempio:

SELECT * FROM Studenti S CROSS JOIN Corsi C

RAPPRESENTAZIONE TRAMITE INSIEMI

Per capire meglio la differenza tra i vari tipi di join possiamo anche ragionare tramite gli insiemi:

INNER JOIN

L’INNER JOIN restituisce solo gli elementi che si trovano in entrambi gli insiemi (o tabelle). Questo corrisponde all’intersezione tra i due cerchi che rappresentano le tabelle.

Esempio: Studenti iscritti a un corso. L’INNER JOIN seleziona solo le righe che hanno una corrispondenza sia in Studenti sia in Corsi.

LEFT OUTER JOIN

Il LEFT OUTER JOIN restituisce tutte le righe della tabella di sinistra (insieme sinistro) e solo quelle corrispondenti della tabella di destra. Gli elementi dell’insieme sinistro senza corrispondenza appaiono con valori nulli per le colonne della tabella destra.

Esempio: Tutti gli studenti, indipendentemente dal fatto che siano iscritti a un corso. Gli studenti senza un corso associato avranno valori nulli nelle colonne di Corsi.

RIGHT OUTER JOIN

Il RIGHT OUTER JOIN funziona in modo opposto al LEFT JOIN: restituisce tutte le righe della tabella di destra (insieme destro) e solo quelle corrispondenti della tabella di sinistra. Gli elementi dell’insieme destro senza corrispondenza appaiono con valori nulli per le colonne della tabella sinistra.

Esempio: Tutti i corsi, inclusi quelli senza studenti iscritti. I corsi senza studenti mostrano valori nulli nelle colonne di Studenti.

FULL OUTER JOIN

Il FULL OUTER JOIN combina i risultati di LEFT e RIGHT JOIN. Include tutte le righe di entrambe le tabelle, sia quelle con corrispondenze che quelle senza.

Esempio: Tutti gli studenti e tutti i corsi, mostrando valori nulli laddove non ci sono corrispondenze tra Studenti e Corsi.

CROSS JOIN

Il CROSS JOIN restituisce il prodotto cartesiano tra i due insiemi, combinando ciascun elemento del primo insieme con tutti gli elementi del secondo insieme. Non richiede una condizione di corrispondenza.

Esempio: Tutte le possibili combinazioni di studenti e corsi, indipendentemente da qualsiasi corrispondenza tra le tabelle.

VIDEO

Di seguito trovate il link per rivedere la spiegazione in formato video:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *