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

15 esercizi pratici su SQL Server con soluzioni

Migliorate le vostre conoscenze di SQL Server con i nostri esercizi pratici su SQL Server. Ognuno di questi 15 compiti pratici T-SQL include una soluzione dettagliata per aiutarvi a migliorare le vostre capacità di interrogazione.

Sapete che tutti dicono: "La pratica rende perfetti"? Ebbene, per SQL non potrebbe essere più vero. Il vero apprendimento avviene quando si inizia a lavorare con query, tabelle e dati. Se state cercando di affinare le vostre abilità in MS SQL Server, siete nel posto giusto. Questi 15 esercizi T-SQL adatti ai principianti sono perfetti per imparare le basi. (Se ve lo state chiedendo, T-SQL è il dialetto SQL utilizzato nei database di SQL Server).

Gli esercizi sono tratti dal nostro corso interattivo Esercizi SQL in MS SQL Server. Si tratta di un corso pratico di T-SQL per i principianti che lavorano con SQL Server. Offre oltre 80 esercizi pratici, raggruppati in sezioni dedicate alle query a tabella singola, alle funzioni aggregate, al raggruppamento e all'ordinamento dei risultati, a JOINS, alle subquery e ad altre ancora. Se vi piacciono gli esercizi di questo articolo, vi consiglio di provare il corso!

Se siete principianti e volete imparare tutto ciò che il T-SQL ha da offrire, date un'occhiata al nostro percorso di apprendimento completo SQL dalla A alla Z in MS SQL Server. La traccia contiene 7 corsi T-SQL interattivi che vi insegneranno il T-SQL moderno e completo per l'analisi dei dati.

Sezione 1: Gatti - Esercizi SQL perfetti per affilare gli artigli

Nella prima sezione lavoreremo sulla tabella Cat. Questa tabella ha le seguenti colonne:

  • Id - L'ID di un dato gatto.
  • Name - Il nome del gatto.
  • Breed - La razza del gatto (ad esempio, siamese, Cornish Rex).
  • Coloration - La colorazione del gatto (ad esempio tartaruga, nero).
  • Age - L'età del gatto.
  • Sex - Il sesso del gatto.
  • FavToy - Il giocattolo preferito del gatto.

Esercizio 1: Conoscere la tabella dei gatti

Esercizio: Selezionare tutti i dati dalla Cat tabella.

Soluzione:

SELECT * 
FROM Cat;

Soluzione: Si utilizza l'istruzione SELECT per selezionare i dati dal database. L'asterisco (*) che segue SELECT significa che si vogliono tutte le colonne della tabella. Il comando FROM Cat indica la tabella da cui prelevare le righe.

Esercizio 2: Gattini

Esercizio: Selezionare i comandi Name, Breed e Coloration per ogni gatto di età inferiore a cinque anni.

Soluzione:

SELECT 
  Name, 
  Breed, 
  Coloration 
FROM Cat 
WHERE Age < 5;

Spiegazione: Come in precedenza, si utilizza l'istruzione SELECT. Questa volta, si elencano le colonne che si desidera selezionare: Name, Breed e Coloration. Nella clausola FROM si indica il nome della tabella (Cats).

Nella clausola WHERE, specifichiamo la condizione per selezionare solo i gatti di età inferiore a 5 anni: Age < 5. Utilizziamo l'operatore < per confrontare il valore della colonna Età con il numero 5. Il database selezionerà solo i gatti che hanno meno di 5 anni. Il database selezionerà solo i gatti più giovani di 5 anni (cioè con Età inferiore a 5).

Esercizio 3: Gatti Ragdoll giovani e vecchi

Esercizio: Selezionare l'ID e il nome di ogni gatto che abbia meno di cinque anni o più di dieci anni e che sia di razza Ragdoll.

Soluzione:

SELECT Id, Name 
FROM Cat
WHERE (Age < 5 OR Age > 10)
AND Breed = 'Ragdoll';

Spiegazione: Questa query è simile alla precedente. L'unica differenza è nella clausola WHERE.

Cerchiamo gatti che abbiano meno di 5 anni o più di 10 anni. A tal fine, utilizziamo la condizione (Age < 5 OR Age > 10). Utilizziamo gli operatori di confronto < e > e li combiniamo con l'operatore logico OR. In questo modo selezioniamo i gatti che hanno meno di 5 anni o più di 10 anni.

Utilizziamo poi la condizione Breed = 'Ragdoll' per selezionare solo i gatti Ragdoll. È importante notare che il valore del testo Ragdoll è inserito tra virgolette singole: 'Ragdoll'.

Infine, utilizziamo l'operatore AND per combinare le condizioni di età e razza.

Esercizio 4: Quali gatti amano giocare con le palle?

Esercizio: Selezionare tutti i dati per i gatti la cui:

  • La razza inizia con una "R".
  • La colorazione termina con una "m".
  • Il giocattolo preferito inizia con la parola "palla".

Soluzione:

SELECT *
FROM Cat
WHERE Breed LIKE 'R%'
  AND Coloration LIKE '%m'
  AND FavToy LIKE 'ball%'

Spiegazione: Per risolvere l'esercizio utilizziamo una semplice query SELECT. In SELECT, inseriamo l'asterisco * per selezionare tutte le colonne della tabella.

Utilizziamo poi AND per combinare tre condizioni WHERE. La prima condizione seleziona i gatti con nomi di razza che iniziano per R. Utilizziamo l'operatore LIKE e il carattere jolly %: Breed LIKE 'R%'. Questa condizione significa che cerchiamo le razze che iniziano con R, seguite da qualsiasi testo (vuoto o meno).

Nella seconda condizione, utilizziamo Coloration LIKE '%m' per trovare i gatti la cui colorazione finisce in "m". Nella terza condizione, utilizziamo FavToy LIKE 'ball%' per cercare i giocattoli preferiti che iniziano con "ball".

Se cercate altri esercizi di base su SQL, consultate il nostro articolo 10 esercizi per principianti su Pratica su SQL con le relative soluzioni.

Sezione 2: Giochi - Migliorate le vostre abilità SQL con i dati dei videogiochi

Ora passiamo dai gatti e ci concentriamo su qualcosa di completamente diverso: i videogiochi. Lavoreremo con la tabella Games che è composta da 9 colonne:

  • Id - L'ID di un determinato gioco.
  • Title - Il titolo del gioco (ad esempio Mario Kart).
  • Company - L'azienda che ha prodotto il gioco.
  • Type - Il genere (ad esempio, corse).
  • ProductionYear - L'anno di creazione del gioco.
  • System - La console per cui il gioco è stato rilasciato (ad esempio, Nintendo).
  • ProductionCost - Il costo di produzione del gioco.
  • Revenue - I ricavi generati da questo gioco.
  • Rating - La valutazione del gioco (da parte degli utenti).

In questa sezione ci concentreremo sull'uso delle funzioni GROUP BY e aggregate.

Esercizio 5: Costi medi di produzione di giochi di qualità

Esercizio: Mostrare il costo medio di produzione dei giochi prodotti tra il 2010 e il 2015 che hanno ottenuto una valutazione superiore a 7.

Soluzione:

SELECT 
  AVG(ProductionCost)
FROM Games
WHERE ProductionYear BETWEEN 2010 AND 2015
  AND Rating > 7;

Spiegazione: Nell'istruzione SELECT si utilizza la funzione aggregata AVG() per calcolare il costo medio di produzione. L'argomento è ProductionCost; l'espressione completa è AVG(ProductionCost).

Nella clausola WHERE, filtriamo i giochi ad alta valutazione (Rating > 7) e prodotti tra il 2010 e il 2015 (ProductionYear BETWEEN 2010 AND 2015).

Esercizio 6: Statistiche sulla produzione di giochi per anno

Esercizio: Per tutti i giochi, visualizzare quanti giochi sono stati rilasciati ogni anno (come il conteggio column), il costo medio di produzione (come la colonna AvgCost ) e il loro ricavo medio (come la colonna AvgRevenue ).

Soluzione:

SELECT
  ProductionYear,
  COUNT(*) AS count,
  AVG(ProductionCost) AS AvgCost,
  AVG(Revenue) AS AvgRevenue
FROM Games
GROUP BY ProductionYear;

Spiegazione: La sintassi di base di SELECT è già nota, quindi non la ripeteremo. In questa query, utilizziamo GROUP BY per organizzare le righe in gruppi in base a un determinato valore. In questo modo, possiamo trovare le statistiche per ogni gruppo.

In SELECT, sono elencate le espressioni ProductionYear e le seguenti:

  • COUNT(*) per contare le righe in ogni gruppo.
  • AVG(ProductionCost) per calcolare il costo medio di produzione di ciascun gruppo.
  • AVG(Revenue) per calcolare il ricavo medio di ogni gruppo.

Dopo FROM, aggiungiamo GROUP BY. Poiché vogliamo calcolare le statistiche per ogni anno di produzione, usiamo GROUP BY ProductionYear.

Esercizio 7: Statistiche sulla produzione aziendale

Esercizio: Per ogni azienda, selezionare il nome, il numero di giochi prodotti (colonna NumberOfGames ) e il costo medio di produzione (colonna AvgCost ). Nota: mostrare solo le aziende che hanno prodotto più di un gioco.

Soluzione:

SELECT Company,
  COUNT(*) AS NumberOfGames,
  AVG(ProductionCost) AS AvgCost
FROM Games
GROUP BY Company
HAVING COUNT(Company) > 1; 

Spiegazione: In questa query vengono selezionati i dati dalla tabella Games tabella. Selezioniamo Company, COUNT(*) per contare le righe di questa azienda e AVG(ProductionCost) per calcolare il costo medio di produzione di tutti i giochi prodotti da questa azienda.

Utilizziamo poi GROUP BY Company per raggruppare i giochi prodotti da ciascuna azienda. Infine, si utilizza la clausola HAVING per limitare i risultati alle aziende che hanno prodotto più di un gioco.

Esercizio 8: Identificare i giochi validi

Esercizio: Siamo interessati ai giochi validi prodotti tra il 2000 e il 2009. Un buon gioco è un gioco che ha una valutazione superiore a 6 ed è stato redditizio (ha guadagnato più dei suoi costi di produzione).

Per ogni azienda, indicare il nome dell'azienda, le entrate totali derivanti dai giochi validi prodotti tra il 2000 e il 2009 (colonna RevenueSum ) e il numero di giochi validi prodotti in questo periodo (colonna NumberOfGames ). Mostrare solo le aziende con ricavi da giochi validi superiori a 4 000 000.

Soluzione:

SELECT
  Company,
  COUNT(*) AS NumberOfGames,
  SUM(Revenue) AS RevenueSum
FROM Games
WHERE ProductionYear BETWEEN 2000 AND 2009
  AND Rating > 6
  AND Revenue - ProductionCost > 0
GROUP BY Company
HAVING SUM(Revenue) > 4000000;

Spiegazione: In SELECT, si elenca Company per ottenere il nome dell'azienda, COUNT(*) per contare il numero di giochi prodotti da questa azienda e SUM(Revenue) per calcolare le entrate totali dell'azienda.

In WHERE, applichiamo i filtri a livello di riga menzionati nell'esercizio:

  • ProductionYear BETWEEN 2000 AND 2009 per trovare i giochi prodotti tra il 2000 e il 2009.
  • Rating > 6 trovare i giochi con una valutazione superiore a 6
  • Revenue - ProductionCost > 0 per trovare i giochi con ricavi superiori ai costi di produzione.

Raggruppiamo le righe utilizzando GROUP BY Company. Infine, utilizziamo HAVING per trovare le aziende con ricavi totali superiori a 4000000.

Esercizio 9: Profitto lordo per azienda

Esercizio: Per tutte le aziende presenti nella tabella, indicare il loro nome e la somma degli utili lordi per tutti gli anni. Per semplificare il problema, si supponga che l'utile lordo sia Revenue - ProductionCost; mostrare questa colonna come GrossProfitSum.

Assicurarsi che i risultati inizino con l'azienda che ha avuto il profitto lordo più alto.

Soluzione:

SELECT
  Company,
  SUM(Revenue - ProductionCost) AS GrossProfitSum
FROM Games
GROUP BY Company
ORDER BY SUM(Revenue - ProductionCost) DESC;

Spiegazione: Nell'istruzione SELECT sono elencati i valori Company e SUM(Revenue - ProductionCost). L'espressione Revenue - ProductionCost calcola il profitto lordo per ogni gioco e SUM(Revenue - ProductionCost) somma questo profitto tra più giochi.

Raggruppiamo quindi i dati per azienda (GROUP BY Company) e ordiniamo i risultati in base al profitto lordo totale in ordine decrescente. Infine, ordiniamo per profitto lordo; specifichiamo l'ordine decrescente (10-1 invece di 1-10) in modo che il profitto più alto venga prima.

Potete trovare altri esercizi specifici per GROUP BY in 10 esercizi GROUP BY Pratica su SQL con le relative soluzioni.

Sezione 3: L'arte del JOIN

In questa sezione ci concentreremo sulle JOIN. Lavoreremo con un database contenente dati su opere d'arte. Il database contiene tre tabelle.

La tabella Artist ha le seguenti colonne:

  • Id - L'ID di un determinato artista.
  • Name - Il nome dell'artista.
  • BirthYear - L'anno di nascita dell'artista.
  • DeathYear - L'anno di morte dell'artista.
  • ArtisticField - Il settore preferito dall'artista (ad esempio, pittura, scultura).

La tabella PieceOfArt ha le seguenti colonne:

  • Id - L'ID di una determinata opera d'arte.
  • Name - Il nome dell'opera.
  • ArtistId - L'ID dell'artista che ha creato l'opera.
  • MuseumId - L'ID del museo che ospita l'opera.

La tabella Museo è composta dalle seguenti tre colonne:

  • Id - L'ID di un dato museo.
  • Name - Il nome del museo.
  • Country - Il paese in cui si trova il museo.

Esercizio 10: Elenco di tutte le opere d'arte

Esercizio: Mostrate i nomi di tutte le opere d'arte, insieme ai nomi dei loro creatori e ai nomi dei musei che le ospitano.

Non includere le opere perdute (cioè quelle senza ID del museo) e quelle con un artista sconosciuto. Nominare le colonne PieceOfArtName, ArtistName, e MuseumName.

Soluzione:

SELECT
  A.Name AS ArtistName,
  M.Name AS MuseumName,
  Poa.Name AS PieceOfArtName
FROM Museum M
JOIN PieceOfArt Poa
  ON M.Id = Poa.MuseumId
JOIN Artist A
  ON A.Id = Poa.ArtistId;

Spiegazione: Vogliamo elencare tutte le opere d'arte per le quali abbiamo informazioni complete (artista, museo). Questo ci dice che dobbiamo usare INNER JOIN per unire le tabelle.

Utilizziamo la parola chiave JOIN, che è equivalente a INNER JOIN. Per prima cosa uniamo le tabelle Museum e PieceOfArt sull'ID del museo. Poi uniamo la tabella Artist sull'ID dell'artista.

Per informazioni sull'unione di più tabelle, consultare Come unire 3 tabelle (o più) in SQL.

Esercizio 11: Opere di artisti del XIX secolo (e successivi)

Esercizio: Trovare gli artisti che hanno vissuto più di 50 anni e sono nati dopo il 1800. Mostrare il loro nome e il nome delle opere d'arte che hanno creato. Rinominare le colonne ArtistName e PieceName, rispettivamente.

Soluzione:

SELECT
  A.Name AS ArtistName,
  Poa.Name AS PieceName
FROM Artist A
JOIN PieceOfArt Poa
  ON A.Id = Poa.ArtistId
WHERE DeathYear - BirthYear > 50
  AND BirthYear > 1800;

Spiegazione: Si uniscono le tabelle Artist e PieceOfArt in base all'ID dell'artista. Nella clausola WHERE filtriamo gli artisti che hanno vissuto più di 50 anni. Per farlo, calcoliamo l'età dell'artista con l'espressione DeathYear - BirthYear e la filtriamo con il confronto DeathYear - BirthYear > 50.

Filtriamo anche gli artisti del XIX secolo o successivi con la condizione BirthYear > 1800. Combiniamo le due condizioni con l'operatore AND.

Esercizio 12: Produttività degli artisti

Esercizio: Mostrate i nomi degli artisti insieme al numero di anni in cui sono vissuti (nome della colonna YearsLived) e al numero di opere che hanno creato (nome della colonna NumberOfCreated).

Mostrare solo gli artisti che hanno creato almeno un'opera d'arte.

Soluzione:

SELECT
  A.Name,
  DeathYear - BirthYear AS YearsLived,
  COUNT(Poa.ArtistId) AS NumberOfCreated
FROM Artist A
JOIN PieceOfArt Poa
  ON A.Id = Poa.ArtistId
GROUP BY A.Name, DeathYear - BirthYear;

Spiegazione: Questa query SQL seleziona il nome dell'artista, il numero di anni di vita (DeathYear - BirthYear) e il numero totale di opere create COUNT(Poa.ArtistId).

I dati vengono uniti in base all'ID dell'artista tra la tabella Artist e la tabella PieceOfArt tabella. I risultati sono raggruppati in base al nome dell'artista e alla sua durata di vita.

Due cose sono importanti da notare. Innanzitutto, è necessario includere l'espressione DeathYear - BirthYear nella clausola GROUP BY, poiché questa espressione non è aggregata. Altrimenti il database potrebbe lanciare un errore. (Si può leggere l'errore in Come risolvere l'errore 'Not a GROUP BY Expression' e Come risolvere l'errore "must appear in the GROUP BY clause") .

In secondo luogo, poiché stiamo usando INNER JOIN, abbiamo già la garanzia di ottenere gli artisti che hanno creato almeno un'opera d'arte. Gli artisti che non hanno opere d'arte saranno omessi da questo JOIN.

Potete trovare altri esercizi di SQL JOIN in SQL Joins: 12 domande pratiche con risposte dettagliate.

Sezione 4: Un carrello di dati

In questa ultima sezione lavoreremo con i dati di un database di un negozio. Il database ha cinque tabelle:

Categories memorizza i nomi delle categorie di prodotti:

  • Id - l'ID di una determinata categoria
  • Name - Il nome della categoria.

Products memorizza le informazioni sui prodotti:

  • Id - L'ID di un determinato prodotto.
  • Name - Il nome del prodotto.
  • CategoryId - L'ID della categoria a cui appartiene il prodotto.
  • Price - Il prezzo del prodotto.

Clients memorizza le informazioni di base sull'acquirente:

  • Id - L'ID di un determinato cliente.
  • FirstName - Il nome del cliente.
  • LastName - Il cognome del cliente.

Orders registra le informazioni di base sugli ordini:

  • Id - L'ID di un determinato ordine.
  • ClientId - L'ID del cliente che ha effettuato l'ordine.
  • Year - L'anno in cui è stato effettuato l'ordine.

Infine, la tabella OrderItems contiene i dati relativi agli articoli che compongono ogni ordine. Si tratta di una tabella associativa che collega i dati delle tabelle Orders e Products e della tabella. È composta dalle seguenti colonne:

  • OrderId - L'ID dell'ordine.
  • ProductId - L'ID del prodotto nell'ordine precedente.
  • Quantity - La quantità del prodotto in questo ordine.
  • Price - Il prezzo totale del prodotto in questo ordine.

Esercizio 13: ricavi per ogni ordine

Esercizio: Per ogni ordine, selezionare l'ID (nome della colonna OrderId), il nome e il cognome del cliente che ha effettuato l'ordine e il ricavo totale generato da questo ordine (nome della colonna Revenue).

Nota: il fatturato dell'ordine è la somma della colonna Price per ogni articolo dell'ordine.

Soluzione:

SELECT
  O.Id AS OrderId,
  C.FirstName,
  C.LastName,
  SUM(Oi.Price) AS Revenue
FROM Orders AS O
JOIN OrderItems AS Oi
  ON O.Id = Oi.OrderId
JOIN Clients AS C
  ON O.ClientId = C.Id
GROUP BY O.Id, C.FirstName, C.LastName;

Spiegazione: In questa query, si uniscono le tabelle Orders, OrderItems, e Clients.

In SELECT, selezioniamo quattro espressioni: l'ID dell'ordine, il nome e il cognome del cliente e la somma dei prezzi di tutti gli articoli dell'ordine. In GROUP BY, raggruppiamo i dati per ID dell'ordine e per nome e cognome del cliente. In questo modo si ottiene il fatturato totale per ogni ordine con le informazioni (nome e cognome) sul cliente.

Esercizio 14: Chi ha riacquistato i prodotti?

Esercizio: Selezionare il nome e il cognome dei clienti che hanno riacquistato i prodotti (cioè che hanno acquistato lo stesso prodotto in più di un ordine). Includere i nomi di tali prodotti e il numero degli ordini di cui facevano parte (denominare la colonna OrderCount).

Soluzione:

SELECT
  Cli.FirstName,
  Cli.LastName,
  P.Name,
  COUNT(O.Id) AS OrderCount
FROM Clients cli
JOIN Orders O
  ON Cli.Id = O.ClientId
JOIN OrderItems Oi
  ON O.Id = Oi.OrderId
JOIN Products P
  ON P.Id = Oi.ProductId
GROUP BY Cli.FirstName, Cli.LastName, P.Name
HAVING COUNT(O.Id) > 1

Spiegazione: Qui uniamo quattro tabelle: Clients, Orders, OrderItems, e Products.

In SELECT, selezioniamo il nome e il cognome del cliente, il nome del prodotto e il numero di ordini in cui questo prodotto è stato acquistato da questo cliente. Raggruppiamo la tabella in base ai dati del cliente (nome e cognome) e al nome del prodotto. In questo modo, gli acquisti di questo cliente per questo prodotto vengono raggruppati.

In HAVING, filtriamo le righe in cui il conteggio degli ordini è superiore a 1. Questo ci permette di selezionare i clienti che hanno acquistato lo stesso prodotto in più di un acquisto.

Esercizio 15: Quanto ha speso ogni cliente per categoria?

Esercizio: Selezionare il nome e il cognome di ciascun cliente, il nome della categoria in cui ha effettuato l'acquisto (in uno qualsiasi dei suoi ordini) e l'importo totale speso per questa categoria di prodotti (denominare questa colonna TotalAmount).

Soluzione:

SELECT
  Cli.FirstName,
  Cli.LastName,
  C.Name,
  SUM(OI.Price) as TotalAmount
FROM Categories AS C
JOIN Products AS P
  ON C.Id = P.CategoryId
JOIN OrderItems AS OI
  ON P.Id = OI.ProductId
JOIN Orders AS O
  ON O.Id = OI.OrderId
JOIN Clients Cli
  ON Cli.Id = O.ClientId
GROUP BY Cli.FirstName, Cli.LastName, C.Name

Soluzione: Uniamo le tabelle Categories, Products, OrderItems, Orders, e Clients. Selezioniamo il nome e il cognome del cliente, il nome della categoria e la somma dei prezzi degli articoli ordinati. Questo ci permette di calcolare quanto denaro ha speso ogni cliente per ogni categoria.

Raggruppiamo i risultati per nome e cognome del cliente e per nome della categoria. In questo modo, tutti gli articoli acquistati per ogni cliente e per ogni categoria vengono raggruppati.

Ulteriori pratiche su SQL Server

Ho avuto modo di esplorare il variegato mondo dei dati con T-SQL. Dalla scoperta dei segreti del comportamento dei gatti all'analisi delle strategie di gioco e all'apprezzamento dell'arte attraverso i numeri, SQL è stato il mio strumento di fiducia. Ha cambiato il mio modo di considerare le domande e di scoprire le storie nascoste nei dati che ci circondano.

Volete fare più pratica con SQL Server? Consultate queste fantastiche risorse:

Se siete pronti ad approfondire le vostre competenze, il nostro corso Esercizi SQL in MS SQL Server è proprio quello che fa per voi. È stato progettato per rafforzare le vostre basi e aumentare la vostra capacità di analizzare e interpretare i dati in modo efficace. Con ogni esercizio, vi sentirete più sicuri e abili nell'affrontare query complesse.

Pratica di SQL Server

Per coloro che desiderano esplorare ogni aspetto di SQL, il nostro percorso completo SQL dalla A alla Z in MS SQL Server copre tutto, dalle basi alle tecniche avanzate. Si tratta di un percorso di apprendimento perfetto per chiunque voglia padroneggiare SQL Server e prendere decisioni informate sulla base dei dati. Che siate principianti o vogliate rispolverare le vostre competenze, queste risorse vi aiuteranno ad avere successo nel mondo dei dati.

Non aspettate oltre: iniziate oggi stesso a padroneggiare SQL Server e sbloccate il pieno potenziale dei vostri dati!