Corso
Durante l’analisi dei dati in SQL, spesso avrai bisogno di consultare più tabelle e unirle per ottenere i risultati desiderati. Unire tabelle per analizzare i dati è una competenza fondamentale anche per un data scientist. In questo tutorial imparerai i diversi tipi di join che puoi eseguire in PostgreSQL. Per prima cosa vedrai i concetti preliminari delle join in SQL, poi conoscerai i vari tipi di join e le loro sintassi in PostgreSQL. Concluderai il tutorial eseguendo vari tipi di query di join utilizzando due tabelle. Per seguire al meglio, dovresti avere familiarità con le basi di SQL e sapere come scrivere semplici query in PostgreSQL. Se cerchi risorse per imparare questi argomenti, le seguenti possono essere utili -
Cominciamo.
TL;DR
-
Le join in SQL ti permettono di combinare i dati da due o più tabelle usando una colonna in comune.
-
INNER JOINrestituisce solo le righe corrispondenti, mentre le varianti diOUTER JOIN(LEFT,RIGHT,FULL) mantengono le righe non corrispondenti da uno o da entrambi i lati e riempiono i vuoti conNULL. -
CROSS JOINproduce ogni possibile combinazione di righe (il prodotto cartesiano) e laSELF JOINti permette di unire una tabella con se stessa — utile per confrontare righe all’interno dello stesso dataset. -
Le semi-join e le anti-join, scritte come sottoquery con
INoNOT IN, filtrano le righe di una tabella in base al fatto che soddisfino o meno condizioni in un’altra.
Configurare l’ambiente del database in PostgreSQL
Prima di studiare le basi delle join in SQL, è una buona idea creare alcune tabelle per le tue analisi. Ti serviranno almeno due tabelle con almeno una colonna in comune. Sebbene tu possa eseguire self-join sulla stessa tabella, ignoriamo questo aspetto per il momento.
Puoi eseguire tutte le operazioni SQL con uno strumento chiamato pgAdmin, che solitamente viene fornito con l’installazione di PostgreSQL. Apri pgAdmin e crea un database (dagli un nome a tua scelta) per creare le tabelle, se non hai già un database con cui procedere. Puoi quindi creare le seguenti due tabelle con le specifiche indicate -
- student_name (id, name)
- student_stream (id, stream)
Nota che entrambe le tabelle hanno in comune la colonna id. Puoi usare le seguenti istruzioni CREATE per creare le tabelle -
- Per student_name -
CREATE TABLE student_name ( id smallint, name "char"[] ); - Per student_stream -
CREATE TABLE student_stream ( id smallint, stream "char"[] );
Ora inseriamo alcuni record nelle tabelle.
- Per student_name -
INSERT INTO student_name(id, name) VALUES (1, 'Sayak');
INSERT INTO student_name(id, name) VALUES (2, 'Alex');
INSERT INTO student_name(id, name) VALUES (3, 'Sameer');
INSERT INTO student_name(id, name) VALUES (4, 'Rick');
- Per student_stream -
INSERT INTO student_stream(id, stream) VALUES (1, 'CS');
INSERT INTO student_stream(id, stream) VALUES (1, 'IT');
INSERT INTO student_stream(id, stream) VALUES (2, 'ECE');
INSERT INTO student_stream(id, stream) VALUES (9, 'ECE');
Le voci delle tabelle dovrebbero risultare come segue nel caso tu abbia eseguito le query sopra senza modifiche -

Ora hai pronte due tabelle semplici. Passiamo a studiare le basi delle join in SQL.
Join in SQL - Basi
Le join in SQL ti consentono di mettere insieme due o più tabelle (talvolta anche una sola) usando identificatori comuni. Prendi l’esempio delle due tabelle che hai creato sopra: entrambe hanno in comune la colonna id. Potresti chiederti a cosa servano le join in SQL. Vediamolo brevemente.
A causa dei vincoli di normalizzazione, potresti non avere tutte le informazioni necessarie in un’unica tabella. La normalizzazione non è solo auspicabile, ma necessaria per mantenere la coerenza, ridurre la ridondanza e prevenire varie anomalie di inserimento e aggiornamento. Considera di nuovo le due tabelle sopra. Supponi di voler scoprire in quali indirizzi di studio si è iscritto Sayak. Per rispondere a questa domanda, dovrai unire le due tabelle (si possono usare anche sottoquery, ma non consideriamole adesso) e poi procedere di conseguenza.
Per poter unire due tabelle deve esserci qualcosa in comune tra loro. Questo significa che entrambe devono avere almeno una colonna con lo stesso nome? O qual è esattamente la condizione?
Le tabelle che vuoi unire potrebbero non avere una colonna con lo stesso nome, ma logicamente dovrebbero essere equivalenti, cioè avere lo stesso tipo di dato. Non puoi unire due tabelle che hanno una colonna con lo stesso nome ma tipi di dato diversi. Vediamo ora i diversi tipi di join in SQL.
Diversi tipi di join in SQL
In questa sezione studierai diversi tipi di join in SQL -
- INNER JOIN
- Self-join
- OUTER JOIN
- LEFT JOIN
- RIGHT JOIN
- FULL JOIN
- CROSS JOIN
- Semi-join e Anti-join
PostgreSQL fornisce parole chiave specifiche per i tipi di join indicati in maiuscolo. Vediamoli uno per uno. Per farlo, prima studierai le join visivamente, poi eseguirai le relative query di join in PostgreSQL.
INNER JOIN
Dai un’occhiata al seguente diagramma per comprendere visivamente la INNER JOIN -

Nell’esempio sopra, la colonna presa in considerazione è la colonna id. INNER JOIN ignorerà le altre colonne per cui i valori non sono comuni in entrambe le tabelle. Eseguiamo ora una query in PostgreSQL che effettui una INNER JOIN tra le due tabelle - student_name e student_stream.
Eseguendo la seguente query, otterrai il risultato mostrato nella figura sopra -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
INNER JOIN student_stream AS s2
ON s1.id = s2.id;
s1 e s2 sono alias delle due tabelle. Hai usato la parola chiave ON insieme a INNER JOIN. La query può essere eseguita anche usando la parola chiave USING -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
INNER JOIN student_stream AS s2
USING (id);
La Self Join ti permette di unire la stessa tabella. Ma quando può essere utile? Supponi di avere una tabella con le seguenti colonne -
- Country
- Continent
Ora vuoi elencare due paesi in modo che i loro continenti siano gli stessi. La figura seguente dovrebbe darti un’idea dei risultati attesi -

OUTER JOIN
OUTER JOIN può essere ulteriormente suddivisa in tre tipi -
LEFT JOIN o Left Outer JOIN: Il seguente diagramma ti dà un’idea chiara della LEFT JOIN in SQL -

Nota che, a differenza di INNER JOIN, LEFT JOIN recupera i record dalla tabella di sinistra (rispetto all’ordine specificato nella query) per i quali non esiste alcuna corrispondenza nella tabella di destra. Questo, a sua volta, indica che Sameer e Rick non si sono iscritti ad alcun indirizzo di studio. La query corrispondente sarà -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
LEFT JOIN student_stream AS s2
ON s1.id = s2.id;
RIGHT JOIN o Right Outer JOIN : la RIGHT JOIN è esattamente l’opposto della LEFT JOIN -

RIGHT JOIN può aiutarti a trovare gli indirizzi di studio per i quali nessuno studente si è iscritto. La query in questo caso sarebbe -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
RIGHT JOIN student_stream AS s2
ON s1.id = s2.id;
FULL JOIN o Full Outer JOIN: FULL JOIN ti permette di combinare LEFT JOIN e RIGHT JOIN in un’unica operazione -

La query corrispondente sarebbe -
SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
FULL JOIN student_stream AS s2
ON s1.id = s2.id;
Nota che puoi eseguire tutte le query di OUTER JOIN sopra usando la parola chiave USING. Vediamo ora la CROSS JOIN.
CROSS JOIN
CROSS JOIN è essenzialmente il prodotto cartesiano tra due insiemi espresso in SQL. Supponi di aver bisogno di tutte le combinazioni possibili tra due tabelle o anche all’interno di una singola tabella. Ti servirà CROSS JOIN per farlo. La figura seguente presenta visivamente questo concetto -

Hai già due tabelle per provarla. Per ottenere tutte le combinazioni possibili tra le colonne id delle tabelle student_name e student_stream, puoi eseguire la seguente query -
SELECT s1.id, s2.id
FROM student_name AS s1
CROSS JOIN student_stream AS s2;
E otterrai il seguente risultato -

Vediamo ora gli altri due tipi di join per i quali PostgreSQL non fornisce parole chiave dirette.
Semi-join e Anti-join
Considera le tabelle che hai creato in precedenza nel tutorial:

Le query di Semi Join sono generalmente eseguite sotto forma di sottoquery, in cui le righe vengono prelevate dalla prima tabella in base a una condizione (o a un insieme di condizioni) che è verificata nella seconda tabella. Supponiamo che la tabella di sinistra sia la prima e la tabella di destra sia la seconda.
Le query di Anti Join sono l’esatto opposto. Nell’Anti Join, le righe vengono prelevate dalla prima tabella in base a una condizione (o a un insieme di condizioni) che non è verificata nella seconda tabella. Ecco un diagramma per comprendere visivamente questo concetto -

La query per realizzare la Semi Join sarebbe -
select id, name
from student_name
where id IN
(select id from student_stream where stream
IN ('CS', 'IT', 'ECE'));
Allo stesso modo, la query che realizza l’Anti Join, in questo caso, sarebbe -
select id, name
from student_name
where id NOT IN
(select id from student_stream where stream
IN ('CS', 'IT', 'ECE'));
Nota l’uso di NOT nella query sopra.
Porta al livello successivo la tua maestria con le join in SQL
Questo è tutto per il tutorial. Hai studiato diversi tipi di join in SQL e ti sei familiarizzato con le loro sintassi in PostgreSQL. Se vuoi esercitarti con sfide sulle join in SQL, dovresti seguire il corso Joining Data in SQL di DataCamp. In effetti, alcuni materiali del corso sono stati utilizzati come riferimento per realizzare questo tutorial.
Scrivi le tue domande nella sezione Comments.

