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

Unioni SQL: 12 domande pratiche con risposte dettagliate

In questo articolo approfondiamo il nostro corso SQL JOINS e vi forniamo 12 esercizi di join da risolvere. Ma non preoccupatevi: tutti gli esercizi hanno soluzioni e spiegazioni. Se vi bloccate, l'aiuto c'è! Dopotutto, questo corso è fatto per esercitarsi e imparare.

Le join in SQL possono essere complicate. Non si tratta solo della sintassi, ma anche di sapere quali join utilizzare in quali scenari.

I join vengono utilizzati per combinare i dati di due o più tabelle in SQL. Le tabelle possono essere unite in diversi modi e, a seconda delle tabelle, ogni modo di unirle può portare a un risultato completamente diverso. Non c'è altro modo per impararlo che la pratica. Sì, è possibile leggere le spiegazioni e gli usi tipici delle unioni in SQL. Questo aiuta di sicuro! Ma la pratica si basa sulla risoluzione di problemi e sulla ripetizione, che rendono le conoscenze più solide. Più vi eserciterete, maggiore sarà la possibilità che i problemi di dati reali che dovrete risolvere siano simili o del tutto identici a quelli che avete già risolto!

E la pratica è ciò che faremo in questo articolo! Vi mostreremo esercizi per l'utilizzo di join SQL di base e più avanzati. Se vi piacciono, il nostro corso vi piacerà ancora di più. SQL JOINs perché tutti gli esercizi sono tratti da quel corso. In totale, il corso offre 93 esercizi sulle Join SQL. Gli argomenti trattati vanno dai tipi di join in SQL, al filtraggio dei dati, all'unione di più di due tabelle, all'auto-unione di una tabella e all'utilizzo di join non equi.

Bene, allora introduciamo i set di dati e iniziamo gli esercizi, che ne dite? Sentitevi liberi di aiutarvi con l'SQL JOIN Cheat Sheet mentre procedete.

Elenco degli esercizi

Ecco un elenco di tutti gli esercizi dell'articolo:

GIUNTA INTERNA

INNER JOIN è un tipo di join SQL che restituisce solo le righe corrispondenti delle tabelle unite.

Per mostrarvi come funziona, utilizzeremo il Dataset 1 del corso.

Set di dati 1

Il dataset è composto da quattro tabelle: author, book, adaptation, e book_review.

La prima tabella mostra i dati dell'autore nelle seguenti colonne:

  • id - L'ID univoco dell'autore all'interno del database.
  • name - Il nome dell'autore.
  • birth_year - L'anno di nascita dell'autore.
  • death_year - L'anno in cui l'autore è morto (il campo è vuoto se è ancora vivo).

Ecco le prime righe della tabella:

idnamebirth_yeardeath_year
1Marcella Cole1983NULL
2Lisa Mullins18911950
3Dennis Stokes19351994
4Randolph Vasquez19572004
5Daniel Branson19651990

La seconda tabella, bookmostra i dettagli sui libri. Le colonne sono:

  • id - L'ID di un determinato libro.
  • author_id - L'ID dell'autore che ha scritto quel libro.
  • title - Il titolo del libro.
  • publish_year - L'anno di pubblicazione del libro.
  • publishing_house - Il nome della casa editrice che ha stampato il libro.
  • rating - La valutazione media del libro.

Queste sono le prime cinque righe:

idauthor_idtitlepublish_yearpublishing_houserating
1NULLSoulless girl2008Golden Albatros4.3
2NULLWeak Heart1980Diarmud Inc.3.8
34Faith Of Light1995White Cloud Press4.3
4NULLMemory Of Hope2000Rutis Enterprises2.7
56Warrior Of Wind2005Maverick4.6

La tabella adaptation ha le seguenti colonne:

  • book_id - L'ID del libro adattato.
  • type - Il tipo di adattamento (ad esempio, film, gioco, opera teatrale, musical).
  • title - Il nome dell'adattamento.
  • release_year - L'anno in cui è stato creato l'adattamento.
  • rating - La valutazione media dell'adattamento.

Ecco un'istantanea dei dati di questa tabella:

book_idtypetitlerelease_yearrating
1movieGone With The Wolves: The Beginning20083
3movieCompanions Of Tomorrow20014.2
5movieHomeless Warrior20084
2movieBlacksmith With Silver20144.3
4moviePatrons And Bearers20043.2

La tabella finale è book_review. È composta dalle seguenti colonne:

  • book_id - L'ID del libro recensito.
  • review - Il sommario della recensione.
  • author - Il nome dell'autore della recensione.

Ecco i dati:

book_idreviewauthor
1An incredible bookSylvia Jones
1Great, although it has some flawsJessica Parker
2Dennis Stokes takes the reader for a ride full of emotionsThomas Green
3Incredible craftsmanship of the authorMartin Freeman
4Not the best book by this authorJude Falth
5Claudia Johnson at her best!Joe Marqiz
6I cannot recall more captivating plotAlexander Durham

Esercizio 1: Elenco di tutti i libri e dei loro autori

Esercizio: Mostrare il nome di ogni autore insieme al titolo del libro che ha scritto e all'anno in cui è stato pubblicato.

Soluzione:

SELECT
  name,
  title,
  publish_year
FROM author
JOIN book
  ON author.id = book.author_id;

Spiegazione della soluzione: La query seleziona il nome dell'autore, il titolo del libro e l'anno di pubblicazione. I dati provengono dalle due tabelle: author e book. Possiamo accedere a entrambe le tabelle utilizzando INNER JOIN. La query restituisce solo le righe con valori corrispondenti (valori che soddisfano la condizione di join) da entrambe le tabelle.

Per prima cosa facciamo riferimento alla tabella author nella clausola FROM. Poi aggiungiamo la clausola JOIN (che può essere scritta anche come INNER JOIN in SQL) e facciamo riferimento alla tabella book.

Le tabelle vengono unite sulla colonna comune. In questo caso, si tratta di id dalla tabella author e author_id dalla tabella book. Vogliamo unire le righe in cui queste colonne condividono lo stesso valore. Lo facciamo usando la clausola ON e specificando i nomi delle colonne. Mettiamo anche il nome della tabella prima di ogni colonna, in modo che il database sappia dove cercare. Questo principalmente perché c'è una colonna id in entrambe le tabelle, ma vogliamo la colonna id solo dalla tabella author tabella. Facendo riferimento al nome della tabella, il database saprà da quale tabella abbiamo bisogno di quella colonna.

L'output della soluzione:

Ecco l'istantanea di output. Abbiamo ottenuto tutti questi dati unendo due tabelle:

nametitlepublish_year
Marcella ColeGone With The Wolves2005
Lisa MullinsCompanions And Officers1930
Dennis StokesBlacksmith With Silver1984
Randolph VasquezFaith Of Light1995
Michael RostkovskyWarrior Of Wind2005

Esercizio 2: Elenco di autori e libri pubblicati dopo il 2005

Esercizio: Mostrare il nome di ogni autore insieme al titolo del libro che ha scritto e all'anno in cui è stato pubblicato. Mostrare solo i libri pubblicati dopo il 2005.

Soluzione:

SELECT
  name,
  title,
  publish_year
FROM author
JOIN book
  ON author.id = book.author_id
WHERE publish_year > 2005;

Spiegazione della soluzione: Questo esercizio e la sua soluzione sono quasi identici al precedente. Ciò si riflette nel fatto che la query seleziona le stesse colonne e unisce le tabelle nello stesso modo del precedente.

La differenza è che ora l'esercizio chiede di mostrare solo i libri pubblicati dopo il 2005. Per questo è necessario filtrare l'output; per farlo utilizziamo la clausola WHERE.

WHERE è una clausola che accetta le condizioni utilizzate per filtrare i dati. Viene scritta dopo aver unito le tabelle. Nel nostro esempio, filtriamo facendo riferimento alla colonna publish_year dopo WHERE e utilizzando l'operatore di confronto "maggiore di" (>) per trovare gli anni successivi al 2005.

Soluzione:

L'output mostra solo un libro pubblicato dopo il 2005.

nametitlepublish_year
Darlene LyonsTemptations In Nature2007

Esercizio 3: Mostrare i libri adattati entro 4 anni e con una valutazione inferiore a quella dell'adattamento

Esercizio: Per ogni libro, mostrare il titolo, il titolo dell'adattamento, l'anno di adattamento e l'anno di pubblicazione.

Includere solo i libri con una valutazione inferiore a quella del corrispondente adattamento. Inoltre, mostrare solo i libri per i quali è stato pubblicato un adattamento entro quattro anni dalla pubblicazione del libro.

Rinominare la colonna title dalla tabella book a book_title e la colonna title della tabella a . adaptation tabella in adaptation_title.

Soluzione:

SELECT
  book.title AS book_title,
  adaptation.title AS adaptation_title,
  book.publish_year,
  adaptation.release_year
FROM book
JOIN adaptation
  ON book.id = adaptation.book_id
WHERE adaptation.release_year - book.publish_year <= 4
  AND book.rating < adaptation.rating;

Spiegazione della soluzione: Iniziamo a spiegare la soluzione dalle clausole FROM e JOIN. Le colonne da mostrare provengono dalle tabelle book e adaptation. Facciamo riferimento alla prima tabella in FROM e alla seconda in JOIN.

Nella clausola ON, equipariamo le due colonne ID libro e specifichiamo la tabella di ciascuna colonna. È la stessa cosa di prima, solo che i nomi delle tabelle e delle colonne sono diversi.

Ora dobbiamo selezionare le colonne richieste. Il problema è che c'è una colonna title in entrambe le tabelle. Per evitare ambiguità, la prassi migliore è quella di fare riferimento al nome della tabella prima di ogni colonna in SELECT.

Nota: quanto sopra è obbligatorio solo per le colonne ambigue. Tuttavia, è una buona idea farlo con tutte le colonne; migliora la leggibilità del codice e l'approccio rimane coerente.

Dopo aver selezionato le colonne, occorre rinominarne alcune. Lo facciamo usando la parola chiave AS e scrivendo poi un nuovo nome di colonna. In questo modo, una colonna title diventa book_title, l'altra adaptation_title. Dare degli alias ai nomi delle colonne aiuta anche a eliminare le ambiguità.

Ora dobbiamo filtrare l'output. La prima condizione è che l'adattamento sia uscito quattro anni o meno dopo il libro. Utilizziamo di nuovo WHERE e deduciamo semplicemente l'anno di pubblicazione del libro dall'anno di uscita dell'adattamento. Quindi diciamo che la differenza deve essere minore o uguale a (<=) 4.

Dobbiamo anche aggiungere la seconda condizione, in cui il libro ha una valutazione inferiore a quella dell'adattamento. È semplice! La domanda implica che sia la prima che la seconda condizione devono essere soddisfatte. L'indizio è in AND, un operatore logico che utilizziamo per aggiungere la seconda condizione. In questo caso, utilizza l'operatore "meno di" (<) per confrontare le due valutazioni.

Soluzione in uscita:

L'output mostra tre coppie libro-adattamento che soddisfano le condizioni.

book_titleadaptation_titlepublish_yearrelease_year
Memory Of HopePatrons And Bearers20002004
Music At The LakeMusic At The Lake20042007
Companion Of TomorrowLighting Faith19491952

GIUNTA A SINISTRA

Ora che avete capito il senso di INNER JOIN, passiamo a LEFT JOIN. È un tipo di join esterno che restituisce tutte le colonne della tabella di sinistra (la prima) e solo le righe corrispondenti della tabella di destra (la seconda). Se ci sono dati non corrispondenti, vengono mostrati come NULL.

Per saperne di più, consultate il nostro articolo sul LEFT JOIN.

Esercizio 4: Mostrare tutti i libri e i loro adattamenti (se presenti)

Esercizio: Mostrare il titolo di ogni libro insieme al titolo del suo adattamento e alla data di pubblicazione. Mostrare tutti i libri, indipendentemente dal fatto che abbiano avuto un adattamento.

Soluzione:

SELECT
  book.title,
  adaptation.title,
  adaptation.release_year
FROM book
LEFT JOIN adaptation
  ON book.id = adaptation.book_id;

Spiegazione della soluzione: Per prima cosa selezioniamo le colonne necessarie dalle due tabelle. Poi uniamo book (la tabella di sinistra) con adaptation (la tabella di destra) utilizzando LEFT JOIN. La sintassi del join SQL è la stessa per INNER JOIN. L'unica cosa che cambia è la parola chiave join.

Nota: SQL accetta sia LEFT JOIN che LEFT OUTER JOIN. Si tratta dello stesso comando.

Output della soluzione:

L'istantanea di output mostra i dati richiesti, con alcuni dei dati mostrati come NULL. Questi sono i libri senza l'adattamento.

titletitle-2release_year
Soulless girlGone With The Wolves: The Beginning2008
Faith Of LightCompanions Of Tomorrow2001
Warrior Of WindHomeless Warrior2008
Guarding The EmperorNULLNULL
Blacksmith With SilverNULLNULL

Esercizio 5: Mostrare tutti i libri e i loro adattamenti cinematografici

Esercizio: Mostrare tutti i libri con i loro adattamenti cinematografici. Selezionare il titolo di ogni libro, il nome della casa editrice, il titolo dell'adattamento e il tipo di adattamento. Mantenere i libri senza adattamenti nel risultato.

Soluzione:

SELECT
  book.title,
  publishing_house,
  adaptation.title,
  adaptation.type
FROM book
LEFT JOIN adaptation
  ON book.id = adaptation.book_id
WHERE type = 'movie'
  OR type IS NULL;

Spiegazione della soluzione:

La domanda chiede di mostrare tutte le righe, anche quelle senza adattamenti. È possibile che ci siano libri senza adattamenti, quindi utilizziamo LEFT JOIN.

Selezioniamo innanzitutto il titolo del libro, la casa editrice, il titolo dell'adattamento e il tipo.

Poi uniamo book (la tabella di sinistra) con adaptation (la tabella di destra) utilizzando LEFT JOIN. Uniamo le tabelle in base all'ID del libro. Tutti i libri che non soddisfano le condizioni avranno NULLs come titolo e tipo di adattamento.

Filtriamo i dati usando WHERE. La prima condizione è che il tipo di adattamento deve essere un film, quindi equipariamo la colonna tipo con un film usando il segno di uguale (=). Nota: quando si usano dati di testo nella condizione WHERE, questi devono essere racchiusi tra apici singoli ('').

La seconda condizione di filtraggio viene aggiunta utilizzando l'operatore logico OR. Essa dice che il tipo può anche essere NULL se non è un film. L'esercizio chiede di mantenere nei risultati i libri senza adattamenti.

Output della soluzione:

Ecco l'istantanea dell'output. Si può notare che mostra solo i libri adattati come film o non adattati affatto.

titlepublishing_housetitle-2type
Soulless girlGolden AlbatrosGone With The Wolves: The Beginningmovie
Faith Of LightWhite Cloud PressCompanions Of Tomorrowmovie
Warrior Of WindMaverickHomeless Warriormovie
Guarding The EmperorFlying Pen MediaNULLNULL
Blacksmith With SilverDiarmud Inc.NULLNULL

GIUNTA A DESTRA

Dove c'è LEFT JOIN, c'è anche RIGHT JOIN, giusto? Nonostante sia l'immagine speculare della LEFT JOIN, fa comunque parte della pratica delle join SQL.

È un tipo di join che restituisce tutte le colonne della tabella di destra (la seconda) e solo le righe corrispondenti della tabella di sinistra (la prima). Se ci sono dati non corrispondenti, vengono mostrati come NULL.

Esercizio 6: Mostrare tutti i libri con le loro recensioni (se presenti)

Esercizio: Unire le tabelle book_review e book utilizzando un RIGHT JOIN. Mostrare il titolo del libro, la recensione corrispondente e il nome dell'autore della recensione. Considerare tutti i libri, anche quelli che non sono stati recensiti.

Soluzione:

SELECT
  book.title,
  book_review.review,
  book_review.author
FROM book_review
RIGHT JOIN book
  ON book.id = book_review.book_id;

Spiegazione della soluzione:

Per prima cosa selezioniamo le colonne richieste. Poi facciamo come ci è stato detto: uniamo le tabelle usando RIGHT JOIN. Uniamo le tabelle in base all'ID del libro. La tabella book è la tabella giusta; vogliamo tutti i dati da essa, indipendentemente dalle recensioni.

Come si può vedere, la sintassi è la stessa di INNER JOIN e LEFT JOIN.

Nota: SQL accetta sia RIGHT JOIN che RIGHT OUTER JOIN.

Soluzione in uscita:

La query restituisce tutti i titoli dei libri, le loro recensioni e gli autori. Se non ci sono informazioni su recensioni o autori, viene mostrato un NULL.

titlereviewauthor
Soulless girlAn incredible bookSylvia Jones
Soulless girlGreat, although it has some flawsJessica Parker
Guarding The EmperorNULLNULL
Companions And OfficersNULLNULL
Blacksmith With SilverNULLNULL

GIUNZIONE COMPLETA

Ecco un altro tipo di join utile in alcuni scenari: FULL JOIN. Si tratta di una LEFT JOIN e di una RIGHT JOIN messe insieme. Mostra le righe corrispondenti da entrambe le tabelle, le righe che non hanno corrispondenza dalla tabella di sinistra e le righe che non hanno corrispondenza dalla tabella di destra. In breve, mostra tutti i dati di entrambe le tabelle.

È possibile leggere ulteriori informazioni su come e quando utilizzare FULL JOIN.

Esercizio 7: Elenco di tutti i libri e di tutti gli autori

Esercizio: Visualizzare il titolo di ogni libro e il nome del suo autore. Mostrare tutti i libri, anche quelli senza autore. Mostrare tutti gli autori, anche quelli che non hanno ancora pubblicato un libro. Utilizzare un sito FULL JOIN.

Soluzione:

SELECT
  title,
  name
FROM book
FULL JOIN author
  ON book.author_id = author.id;

Spiegazione della soluzione: La domanda richiede di mostrare tutti i libri, ma anche tutti gli autori: FULL JOIN è perfetto per farlo in modo elegante.

Selezioniamo il titolo del libro e il nome dell'autore. Quindi, FULL JOIN la tabella book con la tabella author. La condizione di unione è che l'ID dell'autore deve essere lo stesso in entrambe le tabelle. Anche in questo caso, la sintassi è la stessa dei tipi di join precedenti.

Nota: SQL accetta sia FULL JOIN che FULL OUTER JOIN.

Soluzione:

L'output mostra tutti i libri e tutti gli autori, indipendentemente dal fatto che gli autori o i libri esistano o meno in entrambe le tabelle.

titlename
Gone With The WolvesMarcella Cole
Companions And OfficersLisa Mullins
NULLDaniel Branson
Weep Of The WestNULL

Unire 3 o più tabelle

Sì, le Join SQL consentono di unire più di due tabelle. Vedremo come farlo in questa parte della pratica sulle unioni SQL. Una spiegazione più dettagliata delle unioni multiple è disponibile qui.

Abbiamo anche bisogno di un nuovo set di dati, quindi introduciamolo.

Set di dati 2

La prima tabella del dataset è department. Le sue colonne sono:

  • id - L'ID univoco del reparto.
  • name - Il nome del reparto, cioè dove viene venduto un particolare tipo di prodotto.

Ecco i dati della tabella.

idname
1fruits
2vegetables
3seafood
4deli
5bakery
6meat
7dairy

La seconda tabella è producted è composta dalle seguenti colonne:

  • id - L'ID di un determinato prodotto.
  • name - Il nome del prodotto.
  • department_id - L'ID del reparto in cui si trova il prodotto.
  • shelf_id - L'ID dello scaffale del reparto in cui si trova il prodotto.
  • producer_id - L'ID dell'azienda che produce il prodotto.
  • price - Il prezzo del prodotto.

Ecco l'istantanea dei dati:

idnamedepartment_idshelf_idproducer_idprice
1Apple11NULL0.5
2Avocado1171
3Banana1170.5
4GrapefruitNULL110.5
5Grapes1142

La tabella successiva è nutrition_data. Le sue colonne e i suoi dati sono riportati di seguito:

  • product_id - L'ID di un prodotto.
  • calories - Il potere calorifico del prodotto.
  • fat - La quantità di grassi contenuta nel prodotto.
  • carbohydrate - La quantità di carboidrati del prodotto.
  • protein - La quantità di proteine del prodotto.
product_idcaloriesfatcarbohydrateprotein
1130051
2504.531
31100301
4600151
NULL900230

La quarta tabella è denominata producer. Ha le seguenti colonne:

  • id - L'ID di un determinato produttore alimentare.
  • name - Il nome del produttore.

Di seguito sono riportati i dati di questa tabella:

idname
1BeHealthy
2HealthyFood Inc.
3SupremeFoods
4Foodie
5Gusto
6Baker n Sons
7GoodFoods
8Tasty n Healthy

L'ultima tabella del set di dati è sales_history. Ha le seguenti colonne:

  • date - La data di vendita.
  • product_id - L'ID del prodotto venduto.
  • amount - La quantità di quel prodotto venduto in un determinato giorno.

Ecco anche i dati:

dateproduct_idamount
2015-01-14114
2015-01-14113
2015-01-1522
2015-01-1626
2015-01-1738

Esercizio 8: Mostra i prodotti con meno di 150 calorie e il loro reparto

Esercizio: Elencare tutti i prodotti con meno di 150 calorie. Per ogni prodotto, indicare il nome (rinominare la colonna product) e il nome del reparto in cui si trova (nominare la colonna department).

Soluzione:

SELECT
  p.name AS product,
  d.name AS department
FROM department d
JOIN product p
  ON d.id = p.department_id
JOIN nutrition_data nd
  ON nd.product_id = p.id
WHERE nd.calories < 150;

Spiegazione della soluzione: Il principio generale di come si unisce la terza (quarta, quinta...) tabella è che si aggiunge semplicemente un'altra JOIN. Potete vedere come si fa in questo articolo che spiega le giunzioni multiple. In questo caso si procederà allo stesso modo.

Per prima cosa uniamo la tabella department con la tabella product con la tabella sull'ID del reparto usando JOIN. Ma abbiamo bisogno anche della terza tabella. Per ottenere i dati da quest'ultima, basta aggiungere un altro JOIN, che unirà la tabella product con la tabella nutrition_data tabella. La sintassi è la stessa del primo join. In questo caso, la query unisce le tabelle in base all'ID del prodotto.

Quindi si utilizza WHERE per trovare i prodotti con meno di 150 calorie. Infine, selezioniamo i nomi dei prodotti e dei reparti e rinominiamo le colonne secondo le istruzioni dell'esercizio.

Nota: probabilmente avrete notato che entrambe le colonne selezionate hanno lo stesso nome originale. E avete anche notato che abbiamo risolto questa ambiguità mettendo alcuni strani nomi di tabella abbreviati davanti a tutte le colonne della query. Questi nomi abbreviati sono gli alias delle tabelle, che si assegnano semplicemente scrivendoli dopo il nome della tabella in FROM o JOIN. Assegnando gli alias alle tabelle, si possono abbreviare i nomi delle tabelle. Pertanto, non è necessario scrivere i nomi completi (che a volte possono essere molto lunghi!), ma gli alias brevi. In questo modo si risparmia tempo e spazio.

Output della soluzione:

L'output mostra un elenco dei prodotti e del reparto a cui appartengono. Include solo i prodotti con meno di 150 calorie.

productdepartment
Applefruits
Avocadofruits
Bananafruits
Kiwifruits
Lemonfruits

Esercizio 9: Elenco di tutti i prodotti con i rispettivi produttori, reparti e carboidrati

Esercizio: Per ogni prodotto, visualizzare il:

  • Nome dell'azienda che lo ha prodotto (nominare la colonna producer_name).
  • Nome del reparto in cui si trova il prodotto (nominarlo department_name).
  • Nome del prodotto (nome product_name).
  • Numero totale di carboidrati nel prodotto.

La query dovrebbe comunque considerare i prodotti senza informazioni su producer_id o department_id.

Soluzione:


SELECT
  prod.name AS producer_name,
  d.name AS department_name,
  p.name AS product_name,
  nd.carbohydrate
FROM product p
LEFT JOIN producer prod
  ON prod.id = p.producer_id
LEFT JOIN department d
  ON d.id = p.department_id
LEFT JOIN nutrition_data nd
  ON nd.product_id = p.id;

Spiegazione della soluzione: La query seleziona le colonne richieste. Poi unisce la tabella product con la tabella producer sull'ID del produttore utilizzando LEFT JOIN. Abbiamo scelto questo tipo di join perché dobbiamo includere i prodotti senza i dati del produttore.

Poi si aggiunge un'altra LEFT JOIN. Questo aggiunge la tabella department e la unisce alla tabella product tabella. Anche in questo caso, scegliamo LEFT JOIN perché dobbiamo mostrare i prodotti che non hanno un reparto.

C'è anche un terzo join! La aggiungiamo semplicemente alla catena di join precedenti. È di nuovo LEFT JOIN, in quanto aggiungiamo la tabella nutrition_data e la uniamo alla tabella product tabella.

Questo è un argomento interessante da esplorare, quindi ecco un articolo che spiega le JOIN LEFT multiple per aiutarvi.

Soluzione in uscita:

L'output mostra tutti i prodotti con i nomi dei produttori e dei reparti e le quantità di carboidrati:

producer_namedepartment_nameproduct_namecarbohydrate
BeHealthyfruitsKiwi20
BeHealthyvegetablesBroccoli8
BeHealthymeatChickenNULL
BeHealthyNULLGrapefruit15
HealthyFood Inc.vegetablesCelery4

Se avete bisogno di maggiori dettagli, leggete come effettuare LEFT JOIN tra più tabelle in SQL.

Esercizio 10: Mostrare tutti i prodotti, i prezzi, i produttori e i reparti

Esercizio: Per ogni prodotto, mostrare il nome, il prezzo, il nome del produttore e il nome del reparto.

Alias le colonne product_name, product_price, producer_name, e department_name, rispettivamente. Includere tutti i prodotti, anche quelli senza produttore o reparto. Includere anche i produttori e i reparti senza prodotto.

Soluzione:

SELECT
  p.name AS product_name,
  p.price AS product_price,
  prod.name AS producer_name,
  d.name AS department_name
FROM product p
FULL JOIN producer prod
  ON p.producer_id = prod.id
FULL JOIN department d
  ON d.id = p.department_id;

Spiegazione della soluzione: Questo esercizio richiede l'uso di FULL JOIN, poiché abbiamo bisogno di tutti i dati delle tabelle che utilizzeremo: product, producer, e department.

La sintassi è la stessa degli esempi precedenti. È sufficiente unire le diverse tabelle (product e producer) sull'ID del produttore e utilizziamo un tipo diverso di join: FULL JOIN.

Il secondo FULL JOIN unisce la tabella product con la tabella department tabella.

Dopo aver selezionato le colonne necessarie e averle rinominate, si ottiene il seguente output.

Output della soluzione:

La soluzione mostra tutti i dati delle tabelle e delle colonne selezionate:

product_nameproduct_priceproducer_namedepartment_name
Chicken5.5BeHealthymeat
Broccoli2.5BeHealthyvegetables
Kiwi0.3BeHealthyfruits
Grapefruit0.5BeHealthyNULL
Cucumber0.7HealthyFood Inc.vegetables

Autogiunzione

Un self-join non è un tipo distinto di SQL JOIN - qualsiasi join può essere usato per unire una tabella. È semplicemente una join utilizzata per unire la tabella con se stessa. Dando alias diversi alla stessa tabella, questa viene trattata come due tabelle diverse quando viene auto-unita.

Per maggiori dettagli, consultare la nostra guida illustrata all'auto-giunzione SQL.

Set di dati 3

Il dataset di questo esempio è costituito da una sola tabella: workshop_workers. Ha le seguenti colonne.

  • id - L'ID del lavoratore.
  • name - Nome e cognome del lavoratore.
  • specialization - La specializzazione del lavoratore.
  • master_id - L'ID del supervisore del lavoratore.
  • experience - Gli anni di esperienza del lavoratore.
  • project_id - L'ID del progetto a cui il lavoratore è attualmente assegnato.

Ecco i dati:

idnamespecializationmaster_idexperienceproject_id
1Mathew ConnwoodworkingNULL201
2Kate Brownwoodworking141
3John Doeincrusting531
4John Kowalskywatchmaking723
5Suzan GregowitchincrustingNULL154

Esercizio 11: Elenco di tutti i lavoratori e dei loro supervisori diretti

Esercizio: Mostrare i nomi di tutti i lavoratori insieme ai nomi dei loro supervisori diretti. Rinominare le colonne apprentice_name e master_name, rispettivamente. Considerare solo i lavoratori che hanno un supervisore (cioè un padrone).

Soluzione:

SELECT
  apprentice.name AS apprentice_name,
  master.name AS master_name
FROM workshop_workers apprentice
JOIN workshop_workers master
  ON apprentice.master_id = master.id;

Spiegazione della soluzione: Cominciamo a spiegare l'auto-giunzione. Il principio generale è lo stesso delle join regolari. Facciamo riferimento alla tabella in FROM e le diamo un alias, apprentice. Poi si utilizza JOIN e si fa riferimento alla stessa tabella. Questa volta, diamo alla tabella l'alias master. In pratica, facciamo finta che una tabella contenga i dati degli apprendisti e l'altra quelli del master.

Le tabelle vengono unite in base all'ID master della tabella apprentice e l'ID della tabella master tabella.

Questo esempio è un uso tipico di una self-join: la tabella ha una colonna (master_id) che fa riferimento a un'altra colonna della stessa tabella (id). Entrambe le colonne mostrano l'ID del lavoratore. Quando c'è NULL in master_id, significa che il lavoratore non ha un master. In altre parole, è il master.

Dopo l'auto-giunzione, è sufficiente selezionare le colonne necessarie e rinominarle.

Output della soluzione:

L'output mostra tutti gli apprendisti e i loro diretti supervisori.

apprentice_namemaster_name
Kate BrownMathew Conn
John DoeSuzan Gregowitch
John KowalskyJoe Darrington
Peter ParkerJoe Darrington
Mary SmithMathew Conn
Carlos BellSuzan Gregowitch
Dennis WrightJoe Darrington

Giunti non equi

L'ultimo argomento che affronteremo in questa esercitazione sulle unioni SQL sono le unioni non equi. Le giunzioni utilizzate finora sono chiamate giunzioni equi perché utilizzano il segno di uguaglianza (=) nella condizione di unione. Le giunzioni non equi sono tutte le altre giunzioni che utilizzano altri operatori - operatori di confronto (<, >, <=, >=, !=, <>), l'operatore BETWEEN o qualsiasi altra condizione logica - per unire le tabelle.

Set di dati 4

Utilizzeremo un set di dati composto da due tabelle. La prima tabella è car. Ecco le sue colonne:

  • id - L'ID dell'auto nel database.
  • model - Il modello dell'auto.
  • brand - La marca dell'auto.
  • original_price - Il prezzo originale dell'auto da nuova.
  • mileage - Il chilometraggio totale dell'auto.
  • prod_year - L'anno di produzione dell'auto.

I dati si presentano così:

idmodelbrandoriginal_pricemileageprod_year
1SpeedsterTeiko80,000150,0001999
2RoadmasterTeiko110,00030,0001980
3SundryTeiko40,00025,0001991
4FuruDomus50,00010,0002002
5EmperorDomus65,000140,0002005
6KingDomus200,0006,0001981
7EmpressDomus60,0007,6001997
8FuryTatsu150,00013,0001993

La seconda tabella è charity_auction con queste colonne:

  • car_id - L'ID dell'auto.
  • initial_price - Il prezzo iniziale (cioè di partenza) dell'auto.
  • final_price - Il prezzo effettivo di vendita dell'auto.
  • buyer_id - L'ID della persona che ha acquistato l'auto.

Ecco i dati:

car_idinitial_pricefinal_pricebuyer_id
165,000NULLNULL
335,00050,0001
550,000120,0003
6350,000410,0004
765,000NULLNULL

Esercizio 12: Mostrare le auto con un chilometraggio superiore a quello di un'auto specifica

Esercizio: Mostrare il modello, la marca e il prezzo finale di ogni auto venduta all'asta. Considerare solo le auto vendute che hanno un chilometraggio superiore a quello dell'auto con id = 4.

Soluzione:

SELECT
  car.model,
  car.brand,
  car.final_price
FROM car
JOIN charity_auction ca
  ON car.id = ca.car_id
JOIN car car2
  ON car.mileage > car2.mileage
WHERE car2.id = 4
  AND final_price IS NOT NULL;

Spiegazione della soluzione: Selezioniamo il modello di auto, la marca e il prezzo finale.

Nel primo JOIN, uniamo la tabella car con la tabella charity_auction tabella. Le tabelle vengono unite quando gli ID delle auto sono uguali. Questa è la nostra equi JOIN regolare.

Aggiungiamo il secondo JOIN, che è un self-join. Aggiunge la tabella car in modo da poter filtrare i dati utilizzando la condizione di join non equi. La condizione restituirà tutte le auto della tabella car e tutte le auto della tabella car2 con il chilometraggio più basso. Si tratta di una condizione non-equi, poiché utilizza l'operatore "maggiore di" ( > ). La sintassi è la stessa, ma questa volta c'è > invece di =.

Infine, dobbiamo filtrare i dati utilizzando WHERE. Non ci interessa confrontare il chilometraggio di tutte le auto. Vogliamo mostrare le auto che hanno un chilometraggio superiore a quello dell'auto con id = 4. Questo è ciò che fa la prima condizione di filtraggio.

Aggiungiamo un'altra condizione di filtraggio che dice che il prezzo finale non deve essere NULL, cioè che l'auto deve essere stata venduta all'asta.

Risultato della soluzione:

Il risultato mostra due auto:

modelbrandfinal_price
SundryTeiko50,000
EmperorDomus120,000

SQL JOINs La pratica rende perfetti. Più pratica? Più perfetto!

Dodici esercizi di join SQL rappresentano una buona quantità di pratica. Grazie a questi esercizi, potrete imparare e mettere in pratica tutti gli argomenti più comuni relativi alle join che mettono in difficoltà gli utenti principianti e intermedi.

Ora non vi resta che continuare! Quando ci si esercita ancora di più, si diventa ancora più perfetti. Se vi sono piaciuti i nostri esercizi, potete trovarne altri nel nostro corso SQL JOINS o nell'articolo sulle domande del colloquio SQL JOIN.

Speriamo che riusciate a superare tutti gli esercizi che vi aspettano!