Corso
Che cos’è una query SQL?
SQL sta per Structured Query Language. Spesso viene pronunciato come “S-Q-L” o “sequel”. SQL è usato nella programmazione ed è progettato per gestire i dati memorizzati in un database tramite le query SQL.
Il tipo più comune di sistema di gestione di database (DBMS) è il sistema di gestione di database relazionali (RDBMS), dove memorizziamo dati strutturati, cioè dati che incorporano relazioni tra entità e variabili. Queste entità e variabili sono organizzate come un insieme di tabelle con colonne e righe. Alcuni tra gli RDBMS più popolari sono MYSQL, Oracle, IBM DB2 e Microsoft SQL Server.
I dati in un RDBMS sono archiviati in un oggetto del database chiamato tabella. Un database contiene spesso diverse tabelle. Ogni tabella è identificata da un nome univoco e contiene una raccolta di dati correlati strutturati come righe e colonne.
Una colonna è un’entità verticale; si chiamano campi e contengono tutte le informazioni associate a uno specifico campo in una tabella. Ogni riga in una tabella è detta record; è l’entità orizzontale della tabella.
La struttura di un database può ricordare molto Excel. Tuttavia, i database in generale sono più potenti dei fogli di calcolo Excel. Ecco tre motivi per cui si può dire così:
- I database possono interagire con molte altre linguaggi di programmazione, dando a chi programma più potere nel gestire e recuperare informazioni dai dati.
- I database possono elaborare più dati dei fogli di calcolo in Excel. Excel può gestire fino a 1 milione di righe di dati, mentre un database può gestirne oltre un miliardo.
- I database possono essere collegati più facilmente a internet, consentendo a centinaia di utenti e applicazioni di accedervi contemporaneamente.
Non vedi l’ora di iniziare con SQL? DataCamp ha ottimi materiali per partire; impara SQL evidenzia i percorsi che puoi seguire per affinare le tue competenze SQL!
Entriamo ora più a fondo nelle query SQL…
Una query SQL è un istruzione composta mettendo insieme vari comandi SQL. Questi comandi SQL insieme eseguono un compito specifico per accedere, gestire, modificare, aggiornare, controllare e organizzare i tuoi dati memorizzati in un database e gestiti tramite un DBMS.
Perché usare SQL?
SQL è incredibilmente versatile, ed è usato da tutti: da data scientist e ingegneri a marketer e team delle risorse umane, in pratica chiunque voglia semplicemente essere più data-literate!
Non è usato solo nelle aziende tech o limitato alle grandi imprese. Lo utilizzano direttamente o indirettamente settori di ogni dimensione. Ad esempio, chi lavora in finanza e sanità spesso usa SQL, dato l’enorme volume di dati che producono.
I dati sono la nuova materia prima, e SQL è uno strumento molto potente quando si tratta di gestire e lavorare con i big data. Ti chiedi come sfruttare al massimo SQL? Dai un’occhiata al tutorial di DataCamp Cosa puoi fare con SQL per aiutarti a rispondere alla domanda.
Come scrivere query SQL
Prima di entrare nella formulazione della query, poniamoci la domanda: “Dove scrivo ed eseguo la mia query SQL?”
Il Learn SQL hub di DataCamp può essere un buon punto di partenza per lavorare con SQL su Mac o Windows e iniziare.
Ma se vuoi semplicemente iniziare a imparare il linguaggio nativo dei database, SQL, puoi partire dal corso Introduction to SQL di DataCamp. Questo corso insegna la sintassi SQL comune a molti tipi di database, come PostgreSQL, MySQL, SQL Server e Oracle. Lavorerai con l’interfaccia SQL integrata di DataCamp e non dovrai affrontare le seccature iniziali di configurazione di un RDBMS.
DataCamp ha anche un fantastico strumento di notebook dove puoi creare i tuoi taccuini: DataLab. DataLab è un notebook collaborativo basato sul cloud che ti permette di analizzare dati, collaborare con il tuo team e condividere insight. DataLab è progettato per accompagnarti dall’apprendimento della data science alla pratica. Con i dataset integrati, puoi iniziare ad analizzare i dati in pochi minuti.
Ora diamo un’occhiata al dataset con cui lavoreremo in questo tutorial.
Inizieremo con ‘films’, una tabella SQL che contiene i dati di 10 film. Questi dati sono solo un piccolo sottoinsieme del dataset IMDb Film usato nel corso Introduction to SQL di DataCamp citato in precedenza.
|
title |
release_year |
budget |
gross |
imdb_score |
|
|
1 |
The Godfather |
1972 |
6000000 |
134821952 |
9.2 |
|
2 |
The Dark Knight |
2008 |
185000000 |
533316061 |
9 |
|
3 |
The Godfather: Part II |
1974 |
13000000 |
57300000 |
9 |
|
4 |
Schindler's List |
1993 |
22000000 |
96067179 |
8.9 |
|
5 |
Pulp Fiction |
1994 |
8000000 |
107930000 |
8.9 |
|
6 |
The Lord of the Rings: The Return of the King |
2003 |
94000000 |
377019252 |
8.9 |
|
7 |
Fight Club |
1999 |
63000000 |
37023395 |
8.8 |
|
8 |
Inception |
2010 |
160000000 |
292568851 |
8.8 |
|
9 |
Star Wars: Episode V - The Empire Strikes Back |
1980 |
18000000 |
290158751 |
8.8 |
|
10 |
The Shawshank Redemption |
1994 |
25000000 |
28341469 |
9.3 |
La tabella ‘films’ ha dieci record: i titoli dei film sono memorizzati su 10 righe. I campi sono le cinque colonne della tabella e contengono le informazioni relative al film.
- ‘title’ è il titolo del film
- ‘release_year’ è l’anno di uscita del film
- ‘budget’ è il costo di produzione del film in dollari americani
- ‘gross’ indica quanto ha incassato il film in dollari americani.
- ‘imdb_score’ mostra i punteggi derivati dai voti inviati dagli utenti di IMDb, non dai critici cinematografici.
Iniziamo l’esercizio con alcuni comandi SQL di base, usandoli per esplorare la tabella ‘films’ qui sopra. Non ci aspettiamo che tu esegua subito le query di soluzione… ma piuttosto che le usi come base per imparare alcuni concetti chiave. Quindi non preoccuparti se non hai ancora deciso su quale piattaforma eseguire le query.
Query SQL di base
Ricorda che le parole chiave o i comandi SQL non fanno distinzione tra maiuscole e minuscole; scrivere ‘select’ è lo stesso che scrivere ‘SELECT’.
Useremo un punto e virgola alla fine di ogni istruzione SQL che scriviamo. Questa è la norma in alcuni sistemi di database ed è utile per separare ciascuna istruzione SQL in modo che possano essere eseguite nella stessa chiamata al server.
Iniziamo con una domanda. D1: Quali sono i film memorizzati nella tabella?
SELECT - FROM
L’istruzione SELECT è usata per scegliere i campi che vuoi visualizzare dalla tabella del database. Per la D1, ti serve il campo ‘title’.
Il comando/parola chiave FROM specifica la tabella del database da cui vuoi estrarre i dati. Ricorda, un database può essere composto da più tabelle.
Sintassi: SELECT column1, column2, … FROM table_name;
Query SQL: SELECT title FROM films;
Risultato:
|
title |
|
|
1 |
The Godfather |
|
2 |
The Dark Knight |
|
3 |
The Godfather: Part II |
|
4 |
Schindler's List |
|
5 |
Pulp Fiction |
|
6 |
The Lord of the Rings: The Return of the King |
|
7 |
Fight Club |
|
8 |
Inception |
|
9 |
Star Wars: Episode V - The Empire Strikes Back |
|
10 |
The Shawshank Redemption |
Potresti chiederti: e se non avessi mai visto la tabella sopra e quindi non conoscessi i nomi delle colonne da specificare nell’istruzione SELECT? Ottima osservazione! Più avanti nel tutorial impareremo il magico ‘*’ (asterisco).
WHERE
D2: Quali sono i film in uscita nel 2010?
Per questa domanda, vuoi “filtrare” i film in modo da avere i titoli che soddisfano la condizione: ‘release_year’ vale 2010.
Puoi usare la clausola ‘WHERE’ per estrarre solo i record che soddisfano una condizione specificata.
Sintassi: SELECT column1, column2, … FROM table_name WHERE condition;
Query SQL: SELECT title, release_year FROM films WHERE release_year = 2010;
Risultato:
|
title |
release_year |
|
|
1 |
Inception |
2010 |
Operatori nella clausola WHERE
I seguenti operatori possono essere usati all’interno della clausola WHERE:
|
Operatore |
Descrizione |
|
= |
Uguale a |
|
> |
Maggiore di |
|
< |
Minore di |
|
>= |
Maggiore o uguale |
|
<= |
Minore o uguale |
|
<> o != |
Diverso da. |
|
BETWEEN |
Compreso in un determinato intervallo |
|
LIKE |
Ricerca di un pattern che corrisponda al modello dato |
|
IN |
Specifica più valori possibili |
Aritmetica in SQL
Puoi eseguire semplici operazioni aritmetiche in SQL usando i simboli matematici: +, -, *, /. Tuttavia, puoi eseguire operazioni tra colonne solo utilizzando questi simboli aritmetici. Puoi anche usare le parentesi per gestire l’ordine delle operazioni.
Ma niente paura: per operazioni più complesse, SQL ha le funzioni di aggregazione che consentono di eseguire operazioni all’interno della stessa riga. Tratteremo questo argomento più avanti nel tutorial.
D3: Calcola il profitto ottenuto da ciascun film nella tabella ‘films’.
Suggerimento: esegui Gross - Budget e salva il risultato in una colonna chiamata ‘movie_profit’ usando AS
Query SQL: SELECT title, (gross - budget) AS movie_profit FROM films
Risultato:
|
title |
movie_profit |
|
|
1 |
The Godfather |
128821952 |
|
2 |
The Dark Knight |
348316061 |
|
3 |
The Godfather: Part II |
44300000 |
|
4 |
Schindler's List |
74067179 |
|
5 |
Pulp Fiction |
99930000 |
|
6 |
The Lord of the Rings: The Return of the King |
283019252 |
|
7 |
Fight Club |
-25976605 |
|
8 |
Inception |
132568851 |
|
9 |
Star Wars: Episode V - The Empire Strikes Back |
272158751 |
|
10 |
The Shawshank Redemption |
3341469 |
Nota: Gli appassionati di cinema potrebbero storcere il naso per il profitto negativo di Fight Club. La formula usata ((gross - budget) AS movie_profit) è molto semplice e, dati formula e dati, il risultato è corretto.
Ma l’esempio sopra serve a ricordarti di prestare attenzione al processo di raccolta dei dati! Anche una semplice esplorazione può rivelare errori dovuti a problemi nella raccolta o nell’archiviazione (cambio di tipo di dato, ecc.), come potrebbe essere accaduto durante la creazione del dataset in uso.
Fai sempre attenzione ai dati con cui lavori!
AND, OR, NOT
La clausola WHERE può essere combinata con altre clausole condizionali usando gli operatori AND, OR e NOT. Gli operatori AND e OR sono usati per filtrare i record in base a più di una condizione, mentre NOT è usato per negare una condizione.
Vediamone l’uso con degli esempi:
D4: Quali sono i film in uscita nel 2010 e con un punteggio superiore a 9?
Sintassi: SELECT column1, column2, … FROM table_name WHERE condition1 AND condition2 AND condition3 AND condition4…..;
Query SQL: SELECT title, release_year, imdb_score FROM films WHERE release_year = 2010 AND imdb_score >= 9;
L’operatore AND mostra un record se tutte le condizioni separate da AND sono vere.
Nella tabella ‘films’ abbiamo il film ‘Inception’. È l’unico valore vero per release_year = 2010, ma è falso per imdb_score >= 9 e quindi non soddisfa entrambe le condizioni in AND. Di conseguenza, la query restituisce un insieme di risultati vuoto.
D5: Quali sono i film in uscita nel 2010 o con un punteggio superiore a 9?
Sintassi: SELECT column1, column2, … FROM table_name WHERE condition1 OR condition2 OR condition3 OR condition4…..;
Query SQL: SELECT title, release_year, imdb_score FROM films WHERE release_year = 2010 OR imdb_score >= 9;
Risultato:
|
title |
release_year |
imdb_score |
|
|
1 |
The Godfather |
1972 |
9.2 |
|
2 |
The Dark Knight |
2008 |
9 |
|
3 |
The Godfather: Part II |
1974 |
9 |
|
4 |
Inception |
2010 |
8.8 |
|
5 |
The Shawshank Redemption |
1994 |
9.3 |
L’operatore OR mostra un record se almeno una delle condizioni separate da OR è VERA.
I film: The Godfather, The Dark Knight, The Godfather: Part II, The Shawshank Redemption sono veri per imdb_score >= 9, mentre Inception è vero per release_year = 2010, e quindi rientrano nella condizione OR.
D6: Quali sono i film che hanno un anno di uscita diverso dal 2010?
Sintassi: SELECT column1, column2, … FROM table_name WHERE NOT condition1;
Query SQL: SELECT title, release_year FROM films WHERE NOT release_year = 2010;
Risultato:
|
title |
release_year |
|
|
1 |
The Godfather |
1972 |
|
2 |
The Dark Knight |
2008 |
|
3 |
The Godfather: Part II |
1974 |
|
4 |
Schindler's List |
1993 |
|
5 |
Pulp Fiction |
1994 |
|
6 |
The Lord of the Rings: The Return of the King |
2003 |
|
7 |
Fight Club |
1999 |
|
8 |
Star Wars: Episode V - The Empire Strikes Back |
1980 |
|
9 |
The Shawshank Redemption |
1994 |
Potresti anche scrivere: SELECT title, release_year FROM films WHERE release_year != 2010;
Otterresti lo stesso risultato di cui sopra. In SQL ci possono essere diversi modi per ottenere lo stesso risultato. Tuttavia, alcune query possono essere più performanti di altre. Le prestazioni possono dipendere da più fattori: la quantità di dati, i comandi usati nella query, come è strutturato il database, il tipo di dato, ecc. Si tratta di un argomento più complesso e avanzato che non tratteremo in questo tutorial sulle query SQL.
Ma se ti interessa, il corso Database Design di DataCamp approfondisce questi temi.
ORDER BY
La parola chiave ORDER BY è usata per ordinare il risultato in ordine crescente (usando la parola chiave ASC) o decrescente (usando DESC). L’ordinamento predefinito è crescente.
D7: Quali sono i film memorizzati nella tabella? Ordinali in ordine decrescente di release_year.
Sintassi: SELECT column1, column2, … FROM table_name ORDER BY column1, column2, ... ASC|DESC;
Query SQL: SELECT title, release_year FROM films ORDER BY release_year DESC;
Risultato:
|
title |
release_year |
|
|
1 |
Inception |
2010 |
|
2 |
The Dark Knight |
2008 |
|
3 |
The Lord of the Rings: The Return of the King |
2003 |
|
4 |
Fight Club |
1999 |
|
5 |
Pulp Fiction |
1994 |
|
6 |
The Shawshank Redemption |
1994 |
|
7 |
Schindler's List |
1993 |
|
8 |
Star Wars: Episode V - The Empire Strikes Back |
1980 |
|
9 |
The Godfather: Part II |
1974 |
|
10 |
The Godfather |
1972 |
LIMIT
A volte il database potrebbe impiegare molto tempo a eseguire la tua query, soprattutto se la quantità di dati archiviati è molto grande.
Un modo semplice e veloce per testare una query o campionare il tipo di risultato è usare la funzione LIMIT. LIMIT ti permette di limitare il numero di risultati ottenuti.
D8: Quali sono i 5 film più recenti memorizzati nella tabella?
Suggerimento: ordina il result set in ordine decrescente rispetto a release_year e poi usa LIMIT.
Sintassi: SELECT column1, column2, … FROM table_name LIMIT x;
Query SQL: SELECT title, release_year FROM films ORDER BY release_year DESC LIMIT 5;
Risultato:
|
title |
release_year |
|
|
1 |
Inception |
2010 |
|
2 |
The Dark Knight |
2008 |
|
3 |
The Lord of the Rings: The Return of the King |
2003 |
|
4 |
Fight Club |
1999 |
|
5 |
Pulp Fiction |
1994 |
INSERT INTO
INSERT INTO è usato per aggiungere nuovi record in una tabella del database. Puoi scrivere un’istruzione INSERT INTO in due modi:
- Specificare sia i nomi delle colonne sia i relativi valori
Sintassi: INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);
- Se stai aggiungendo valori per TUTTE le colonne della tabella, non devi specificare i nomi delle colonne nella query. Fai attenzione usando questo metodo e assicurati che l’ordine dei valori sia lo stesso dell’ordine delle colonne nella tabella.
Sintassi: INSERT INTO table_name VALUES (value1, value2, value3, ...);
D9: Aggiungi una voce per ‘The Godfather: Part III’ nella tabella con i dettagli: (‘The Godfather: Part III’, 1990, 54000000, 136900000, 7.6)
Sintassi: SELECT column1, column2, … FROM table_name ORDER BY column1, column2,... ASC|DESC;
Query SQL: INSERT INTO films (title, release_year, budget, gross, imdb_score)
VALUES (‘The Godfather: Part III’, 1970, 54000000, 136900000, 7.6);
Tabella risultante:
|
title |
release_year |
budget |
gross |
imdb_score |
|
|
1 |
The Godfather |
1972 |
6000000 |
134821952 |
9.2 |
|
2 |
The Dark Knight |
2008 |
185000000 |
533316061 |
9 |
|
3 |
The Godfather: Part II |
1974 |
13000000 |
57300000 |
9 |
|
4 |
Schindler's List |
1993 |
22000000 |
96067179 |
8.9 |
|
5 |
Pulp Fiction |
1994 |
8000000 |
107930000 |
8.9 |
|
6 |
The Lord of the Rings: The Return of the King |
2003 |
94000000 |
377019252 |
8.9 |
|
7 |
Fight Club |
1999 |
63000000 |
37023395 |
8.8 |
|
8 |
Inception |
2010 |
160000000 |
292568851 |
8.8 |
|
9 |
Star Wars: Episode V - The Empire Strikes Back |
1980 |
18000000 |
290158751 |
8.8 |
|
10 |
The Shawshank Redemption |
1994 |
25000000 |
28341469 |
9.3 |
|
11 |
The Godfather: Part III |
1970 |
54000000 |
136900000 |
7.6 |
UPDATE
Usiamo l’istruzione UPDATE per modificare i record esistenti in una tabella.
D10: Correggi release_year per ‘The Godfather: Part III’ impostandolo a 1990 invece di 1970
Sintassi: UPDATE table_name SET column1 = value1, column2 = value2, ...WHERE condition;
Query SQL: UPDATE films SET release_year = 1990 WHERE title = ‘The Godfather: Part III’;
Tabella risultante:
|
title |
release_year |
budget |
gross |
imdb_score |
|
|
1 |
The Godfather |
1972 |
6000000 |
134821952 |
9.2 |
|
2 |
The Dark Knight |
2008 |
185000000 |
533316061 |
9 |
|
3 |
The Godfather: Part II |
1974 |
13000000 |
57300000 |
9 |
|
4 |
Schindler's List |
1993 |
22000000 |
96067179 |
8.9 |
|
5 |
Pulp Fiction |
1994 |
8000000 |
107930000 |
8.9 |
|
6 |
The Lord of the Rings: The Return of the King |
2003 |
94000000 |
377019252 |
8.9 |
|
7 |
Fight Club |
1999 |
63000000 |
37023395 |
8.8 |
|
8 |
Inception |
2010 |
160000000 |
292568851 |
8.8 |
|
9 |
Star Wars: Episode V - The Empire Strikes Back |
1980 |
18000000 |
290158751 |
8.8 |
|
10 |
The Shawshank Redemption |
1994 |
25000000 |
28341469 |
9.3 |
|
11 |
The Godfather: Part III |
1990 |
54000000 |
136900000 |
7.6 |
DELETE
L’istruzione DELETE viene usata per eliminare un record esistente in una tabella.
D11: Elimina la voce per ‘The Godfather: Part III’ dalla tabella ‘films’.
Sintassi: DELETE FROM table_name WHERE condition;
Query SQL: DELETE FROM films WHERE title = ‘The Godfather: Part III’;
Tabella risultante: uguale alla tabella originale con cui abbiamo iniziato, per un totale di 10 record.
Query SQL avanzate
Ricordi che abbiamo rimandato il magico ‘*’ alla fine della D1? L’asterisco è un asterisco. È un carattere onnicomprensivo che possiamo leggere come ‘tutti’.
Tornando alla D1: Quali sono i film memorizzati nella tabella?
Abbiamo usato SELECT - FROM con la Sintassi: SELECT column1, column2, … FROM table_name;
Abbiamo usato la query: SELECT title FROM films;
Ma se non sapessi che ‘title’ è un campo nella tabella ‘films’? O il nome di qualsiasi campo nella tabella? O semplicemente vuoi tutti i campi per farti un’idea dei dati? Ecco, è qui che * torna utile.
Potremmo riscrivere la query come: SELECT * FROM films;
Questo ci restituirebbe tutti i campi disponibili nella tabella.
Caratteri jolly in SQL
LIKE
L’operatore LIKE è usato in una clausola WHERE per cercare un modello specificato in una colonna.
D12: Recupera tutti i titoli dei film che iniziano con ‘The’
Sintassi: SELECT column1, column2, … FROM table_name WHERE column1 LIKE patternToMatch;
Query SQL: Select * FROM films WHERE title LIKE ‘The%’;
Tabella risultante:
|
title |
release_year |
budget |
gross |
imdb_score |
|
|
1 |
The Godfather |
1972 |
6000000 |
134821952 |
9.2 |
|
2 |
The Dark Knight |
2008 |
185000000 |
533316061 |
9 |
|
3 |
The Godfather: Part II |
1974 |
13000000 |
57300000 |
9 |
|
4 |
The Lord of the Rings: The Return of the King |
2003 |
94000000 |
377019252 |
8.9 |
|
5 |
The Shawshank Redemption |
1994 |
25000000 |
28341469 |
9.3 |
|
Carattere jolly |
Descrizione |
Uso: esempio |
|
% (Percentuale) |
Rappresenta zero o più caratteri |
The%: The, The Godfather, Theodore |
|
_ (Underscore) |
Rappresenta un singolo carattere |
T_e: The, Tie |
|
[ ] (Parentesi quadre) |
Rappresenta un singolo carattere tra quelli in parentesi |
C[ao]t: Cat, Cot ma non Coat |
|
^ (Accento circonflesso) |
Rappresenta qualsiasi carattere non presente tra le parentesi |
Ca[^r]: Cat, Cab, Can ma non Car |
|
- (Trattino) |
Rappresenta un singolo carattere all’interno dell’intervallo specificato |
C[a-o]: Can, Cab ma non Car, Cat |
La cosa interessante è che possiamo usare i caratteri jolly in combinazione! Così puoi creare istruzioni di corrispondenza piuttosto complesse usando i caratteri jolly insieme a LIKE.
Funzioni di aggregazione
SQL è eccellente nell’aggregare i dati come faresti con una tabella pivot in Excel. Le funzioni di aggregazione possono effettuare calcoli non tra due colonne, ma all’interno di una colonna, quindi lavorando su tutte o alcune righe della stessa colonna.
Queste sono le funzioni di aggregazione in SQL:
|
Funzione |
Descrizione |
|
COUNT |
Conta il numero di record in una particolare colonna |
|
SUM |
Somma tutti i valori in una particolare colonna |
|
MIN |
Restituisce il valore più basso in una particolare colonna |
|
MAX |
Restituisce i valori più alti in una particolare colonna |
|
AVG |
Restituisce il valore medio per un gruppo selezionato |
D13: Qual è il film più recente memorizzato nella tabella?
Query SQL: SELECT title AS latest_movie, MAX(release_year) AS released_in FROM films;
Risultato:
|
latest_movie |
released_in |
|
|
1 |
Inception |
2010 |
GROUP BY
Le funzioni di aggregazione SQL aggregano su un’intera colonna. Ma se vuoi aggregare solo una parte di una colonna? Ad esempio, potresti voler contare il numero di film usciti in un anno.
È qui che ti serve la clausola GROUP BY. GROUP BY ti permette di suddividere i dati in gruppi, che possono poi essere aggregati indipendentemente l’uno dall’altro.
D13: Conta il numero di film usciti in un anno.
Query SQL: SELECT release_year, COUNT(*) AS number_of_movies FROM films GROUP BY release_year;
Risultato:
|
release_year |
number_of_movies |
|
|
1 |
1972 |
1 |
|
2 |
2008 |
1 |
|
3 |
1974 |
1 |
|
4 |
1993 |
1 |
|
5 |
1994 |
2 |
|
6 |
2003 |
1 |
|
7 |
1999 |
1 |
|
8 |
2010 |
1 |
|
9 |
1980 |
1 |
Esempi di query SQL da più tabelle
Finora abbiamo lavorato con una sola tabella alla volta. Ma la vera potenza dei database e di SQL deriva dalla capacità di lavorare con dati provenienti da più tabelle.
Il termine "database relazionale" in RDBMS deriva dal fatto che le tabelle all’interno del database sono correlate tra loro. Hanno identificatori comuni che permettono di combinare facilmente i dati di più tabelle. Qui entrano in gioco le JOIN tra tabelle SQL.
Vediamo un esempio semplice per familiarizzare con la sintassi delle JOIN e imparare anche un po’ sui diversi tipi di JOIN possibili.
Consideriamo un’altra tabella chiamata ‘movieDirectors’ che contiene il nome del regista per alcuni dei film presenti nella tabella ‘films’.
|
title |
director |
|
|
1 |
The Godfather |
Francis Ford Coppola |
|
2 |
The Godfather: Part II |
Francis Ford Coppola |
|
3 |
The Godfather: Part III |
Francis Ford Coppola |
|
4 |
Schindler's List |
Steven Spielberg |
|
5 |
The Dark Knight Rises |
Christopher Nolan |
Possiamo combinare i dati di queste due tabelle usando un identificatore comune: ‘title’.
D14: Aggiungi una colonna alla tabella ‘films’, popolandola con il nome del regista dalla tabella ‘movieDirectors’.
Sintassi: SELECT leftTable.column1, rightTable.column1, leftTable.column2…. FROM leftTable INNER JOIN rightTable ON leftTable.commonIdentifier = rightTable.commonIdentifier;
Query SQL: Select films.title, films.release_year, movieDirectors.director FROM films INNER JOIN movieDirectors ON films.title = movieDirectors.title
Risultato:
|
title |
release_year |
director |
|
|
1 |
The Godfather |
1972 |
Francis Ford Coppola |
|
2 |
The Godfather: Part II |
1974 |
Francis Ford Coppola |
|
3 |
Schindler's List |
1993 |
Steven Spielberg |
Diversi tipi di JOIN in SQL
|
JOIN |
Descrizione |
Diagramma |
|
Inner Join |
Restituisce solo i record che hanno valori corrispondenti in entrambe le tabelle |
|
|
Left (Outer) Join |
Restituisce tutti i record della tabella di sinistra e i record corrispondenti della tabella di destra |
|
|
Right (Outer) Join |
Restituisce tutti i record della tabella di destra e i record corrispondenti della tabella di sinistra |
|
|
Full (Outer) Join |
Restituisce tutti i record quando c’è una corrispondenza nella tabella di sinistra o di destra |
|
Nell’esempio di query sopra, ‘films’ è la tabella di sinistra e ‘movieDirectors’ è la tabella di destra. Quindi, con l’INNER JOIN che abbiamo eseguito, abbiamo ottenuto solo i film presenti in entrambe le tabelle. Il result set è l’intersezione delle due tabelle.
SQL UNION
Le JOIN in SQL ti permettono di combinare due dataset affiancandoli. Con SQL UNION invece puoi impilare un dataset sopra l’altro. L’operatore UNION è usato per combinare il result set di due o più istruzioni SELECT quando sono rispettate le seguenti “regole”:
- Ogni istruzione SELECT deve avere lo stesso numero di colonne.
- Le colonne devono avere tipi di dato simili.
- Le colonne usate nelle istruzioni SELECT devono essere nello stesso ordine.
Sintassi: SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2;
Consideriamo la tabella ‘movies_2000s’:
|
title |
release_year |
budget |
gross |
imdb_score |
|
|
1 |
Inception |
2010 |
160000000 |
292568851 |
8.8 |
|
2 |
The Trial of the Chicago 7 |
2020 |
35000000 |
7.7 |
Ora, se dovessimo combinare le due tabelle…
Query SQL: SELECT title FROM films UNION SELECT title FROM movies_2000s;
Risultato:
|
title |
|
|
1 |
The Godfather |
|
2 |
The Dark Knight |
|
3 |
The Godfather: Part II |
|
4 |
Schindler's List |
|
5 |
Pulp Fiction |
|
6 |
The Lord of the Rings: The Return of the King |
|
7 |
Fight Club |
|
8 |
Inception |
|
9 |
Star Wars: Episode V - The Empire Strikes Back |
|
10 |
The Shawshank Redemption |
|
12 |
The Trial of the Chicago 7 |
Avrai notato che ‘Inception’ è apparso una sola volta nel result set. Questo perché UNION seleziona solo i valori distinti; se vuoi tutti i valori, puoi usare UNION ALL.
Query SQL annidate
SQL è in grado di fare meraviglie con i dati. Le query annidate sono un altro strumento che rende SQL un linguaggio che vale la pena conoscere. Una query annidata non è altro che una query all’interno di un’altra query (un po’ come i sogni in Inception!).
Con le query annidate puoi eseguire operazioni molto complesse ma in più passaggi, mantenendo leggibilità e comprensibilità del codice.
D15: Determina la redditività media dei film nella tabella ‘films’.
Suggerimento: hai calcolato la redditività in precedenza, con la D3. Ora devi prendere il risultato di quella query e applicarvi la funzione AVG.
Query SQL annidata:
SELECT AVG(*) AS average_profit FROM
(SELECT title, (gross - budget) AS movie_profit FROM films where gross > budget);
Abbiamo rimosso il valore negativo di ‘Fight Club’ nel calcolo all’interno della query SQL interna aggiungendo gross > budget.
Nella query annidata sopra, prima viene eseguita la query interna e quindi questo result set viene usato come tabella temporanea da cui la query esterna interroga e ottiene i dati.
Non approfondiremo troppo l’argomento delle query annidate in SQL. Ma ti consigliamo vivamente di seguire il corso Intermediate SQL di DataCamp per padroneggiare le query SQL. Giocherai con l’European Soccer Database mentre impari di più sulle query annidate. Imparerai anche le istruzioni CASE e le window function: argomenti che non abbiamo potuto trattare in questo tutorial sulle query SQL.
Considerazioni finali
Hai imparato molto sulle query SQL e sei in una posizione ottima per iniziare il tuo percorso con problemi reali risolti con SQL. In questo tutorial sulle query SQL hai imparato cos’è una query SQL e come scrivere query SQL.
Hai visto la sintassi delle query e risposto ad alcune domande lungo il percorso. Siamo partiti da esempi semplici usando le istruzioni SELECT - FROM - WHERE e siamo arrivati a query SQL leggermente più complesse usando join, union e query annidate.
Abbiamo coperto molto nel tutorial, tuttavia questa NON è una lista esaustiva di tutte le possibili query SQL semplici e avanzate: ce ne sono molte altre. E ti consigliamo vivamente di seguire il percorso SQL Fundamentals di DataCamp per ottenere una comprensione più profonda e completa di SQL.
Ricorda, la pratica è la chiave per padroneggiare qualsiasi competenza e SQL non fa eccezione! La pratica porterà le tue capacità SQL da principiante ad avanzato.
Allora, inizia subito e buone query!





