Sei sulla pagina 1di 10

Linguaggio SQL - seconda parte: soluzione degli esercizi suggeriti

Esercizi delle diapositive 21 e 22 nella presentazione: LinguaggioSQL2

Considerando il database di schema:


Anagrafiche (KCodice, Nome, Indirizzo)
Movimenti (KNumero, Descrizione, Data, Importo, Codice)
con Movimenti.Codice chiave esterna associata ad Anagrafiche.KCodice, Scrivere il comando SQL
per ricavare le seguenti informazioni:

• Numero delle persone in anagrafica aventi un indirizzo prefissato


SELECT COUNT(*) AS NumeroPersone
FROM Anagrafiche
WHERE Indirizzo = “IndirizzoPrefissato”;

• Importo totale dei movimenti riferiti a un codice prefissato


SELECT SUM(Importo) AS TotaleMovimenti
FROM Movimenti
WHERE Codice = “CodicePrefissato”;

• Importo medio dei movimenti


SELECT AVG(Importo) AS MovimentoMedio
FROM Movimenti;

• Valori minimo e massimo tra gli importi dei movimenti


SELECT MIN(Importo) AS ImportoMin, MAX(Importo) AS ImportoMax
FROM Movimenti;

• Elenco dei movimenti con importo compreso tra 1000 e 2000


SELECT *
FROM Movimenti
WHERE Importo BETWEEN 1000 AND 2000;

• Media degli importi per i movimenti aventi una descrizione prefissata


SELECT AVG(Importo) AS MediaImporti
FROM Movimenti
WHERE Descrizione = “DescrizionePrefissata”;

• Valore massimo per gli importi dei movimenti di un’anagrafica di nome noto
SELECT MAX(Importo) AS ImportoMassimo
FROM Movimenti INNER JOIN Anagrafiche ON Codice = KCodice
WHERE Nome = “NomeAssegnato”;

1
Anagrafiche (KCodice, Nome, Indirizzo)
Movimenti (KNumero, Descrizione, Data, Importo, Codice)

• Elenco dei movimenti con importo superiore a 300 in ordine crescente di importo
SELECT *
FROM Movimenti
WHERE Importo > 300
ORDER BY Importo;

• Elenco delle anagrafiche con indirizzo Milano, Torino o Venezia


SELECT *
FROM Anagrafiche
WHERE Indirizzo IN (“Milano”,”Torino”,”Venezia”);

• Elenco delle anagrafiche con nome che inizia con ‘Ros’


SELECT *
FROM Anagrafiche
WHERE Nome LIKE “Ros*”;

• Nome delle anagrafiche relative a movimenti con importo compreso tra 3000 e 6000
SELECT Nome
FROM Movimenti INNER JOIN Anagrafiche ON Codice = KCodice
WHERE Importo BETWEEN 3000 AND 6000;

• Elenco delle anagrafiche che hanno l’iniziale del nome uguale ad A


SELECT *
FROM Anagrafiche
WHERE Nome LIKE “A*”;

• Elenco delle anagrafiche con iniziale del nome da A ad L


SELECT *
FROM Anagrafiche
WHERE Nome LIKE “[A-L]*”;

• Totale degli importi dei movimenti per ciascun codice anagrafico


SELECT Codice, SUM(Importo) AS TotaleMovimenti
FROM Movimenti
GROUP BY Codice;

• Importo medio dei movimenti per le anagrafiche aventi più di 20 movimenti registrati
SELECT Codice AS CodiceAnagrafica,
AVG(Importo) AS MediaMovimenti
FROM Movimenti
GROUP BY Codice
HAVING COUNT(*) > 20;

2
Anagrafiche (KCodice, Nome, Indirizzo)
Movimenti (KNumero, Descrizione, Data, Importo, Codice)

• Quante persone di Anagrafiche sono di Milano?


SELECT COUNT(*) AS AnagraficheMilano
FROM Anagrafiche
WHERE Indirizzo = ‘Milano’;

• Elenco degli indirizzi con più di 10 persone in anagrafica


SELECT Indirizzo
FROM Anagrafiche
GROUP BY Indirizzo
HAVING COUNT(*) > 10;

• Raggruppare le anagrafiche per indirizzo e fornirne il numero per ogni indirizzo


SELECT Indirizzo, COUNT(*) AS NumeroAnagrafiche
FROM Anagrafiche
GROUP BY Indirizzo;

• Nome delle anagrafiche che hanno almeno 30 movimenti registrati nella tabella dei
movimenti
SELECT Nome
FROM Anagrafiche INNER JOIN Movimenti ON KCodice = Codice
GROUP BY KCodice, Nome
HAVING COUNT(*) > 30;

• Numero di movimenti eseguiti nel 2013 da ogni soggetto di anagrafica


SELECT Codice AS CodiceAnagrafica,
COUNT(*) AS NumeroMovimenti2010
FROM Movimenti
WHERE YEAR(Data) = 2013
GROUP BY Codice;
Oppure con la seguente clausola WHERE:
WHERE Data BETWEEN #01-01-2013# AND #31-12-2013#

• Somma degli importi dei movimenti per codice e per Descrizione


SELECT Codice, Descrizione, SUM(Importo) AS SommaImporti
FROM Movimenti
GROUP BY Codice, Descrizione;

3
Anagrafiche (KCodice, Nome, Indirizzo)
Movimenti (KNumero, Descrizione, Data, Importo, Codice)

• Per ogni soggetto di anagrafica elencare codice, nome, numero dei movimenti e somma
degli importi, ordinando l’elenco per valore decrescente del numero di movimenti
SELECT KCodice, Nome,
COUNT(*) AS NumeroMovimenti,
SUM(Importo) AS SommaImporti
FROM Anagrafiche INNER JOIN Movimenti ON KCodice = Codice
GROUP BY KCodice, Nome
ORDER BY COUNT(*) DESC;

• Elencare i soggetti di anagrafica con importo medio dei movimenti superiore a 500
SELECT Nome
FROM Anagrafiche INNER JOIN Movimenti ON KCodice = Codice
GROUP BY KCodice, Nome
HAVING AVG(Importo) > 500;

• Elenco dei soggetti di anagrafica di Milano con somma degli importi superiore a 4500
SELECT Nome
FROM Anagrafiche INNER JOIN Movimenti ON KCodice = Codice
WHERE Indirizzo = ‘Milano’
GROUP BY KCodice, Nome
HAVING SUM(Importo) > 4500;

• Elenco dei soggetti di anagrafica di Milano che hanno valore medio degli importi superiore
a 600. Elenco con codice, nome e numero di movimenti
SELECT KCodice, Nome,
COUNT(*) AS NumeroMovimenti
FROM Anagrafiche INNER JOIN Movimenti ON KCodice = Codice
WHERE Indirizzo = ‘Milano’
GROUP BY KCodice, Nome
HAVING AVG(Importo) > 600;

4
Esercizi delle diapositive 23 e 24 nella presentazione LinguaggioSQL2

Dato il database di schema:


Riviste ( CodRiv, Titolo, Periodicità, Prezzo )
Abbonati ( CodAbb, Cognome, Indirizzo, Città )
Abbonamenti ( ID, Data, CodRiv, CodAbb )
dove: Abbonamenti.CodRiv è chiave esterna associata a Riviste.CodRiv e Abbonamenti.CodAbb è
chiave esterna associata ad Abbonati.CodAbb, scrivere il comando SQL per ricavare le seguenti
informazioni:

• Elenco degli abbonati (con Cognome e Indirizzo) ordinato alfabeticamente


SELECT Cognome, Indirizzo
FROM Abbonati
ORDER BY Cognome;

• Titolo, Periodicità e Prezzo delle riviste ordinato per valori decrescenti di Prezzo
SELECT Titolo, Periodicità, Prezzo
FROM Riviste
ORDER BY Prezzo DESC;

• Numero delle riviste e degli abbonati in archivio


SELECT COUNT(*) AS NumeroRiviste
FROM Riviste;
SELECT COUNT(*) AS NumeroAbbonati
FROM Abbonati;

• Numero degli abbonamenti sottoscritti per una rivista di cui si conosce il Titolo
SELECT COUNT(*) AS NumeroAbbonamenti
FROM Riviste R INNER JOIN Abbonamenti A ON R.CodRiv = A.CodRiv
WHERE Titolo = ‘TitoloDellaRivista’;

• Prezzo medio, minimo e massimo delle riviste trimestrali


SELECT AVG(Prezzo) AS PrezzoMedio,
MIN(Prezzo) AS PrezzoMinimo,
MAX(Prezzo) AS PrezzoMassimo
FROM Riviste
WHERE Periodicità = ‘Trimestrale’;

• Importo complessivo degli abbonamenti sottoscritti da abbonati di Milano


SELECT SUM(Prezzo) AS ImportoTotaleMilano
FROM Abbonati A, Abbonamenti M, Riviste R
WHERE A.CodAbb = M.CodAbb AND M.CodRiv = R.CodRiv AND
Città = ‘Milano’;

5
Riviste ( CodRiv, Titolo, Periodicità, Prezzo )
Abbonati ( CodAbb, Cognome, Indirizzo, Città )
Abbonamenti ( ID, Data, CodRiv, CodAbb )

• Elenco degli abbonamenti sottoscritti nel primo trimestre del 2012 con: titolo rivista, codice
abbonato e data, ordinato per data crescente
SELECT Titolo, CodAbb, Data
FROM Riviste R INNER JOIN Abbonamenti A ON R.CodRiv = A.CodRiv
WHERE Data BETWEEN #01-01-2012# AND #31-03-2012#
ORDER BY DATA;

• Numero di riviste alle quali è abbonato un abbonato di cui si conosce il cognome


SELECT COUNT(DISTINCT CodRiv) AS NumeroRiviste
FROM Abbonati A INNER JOIN Abbonamenti M ON A.CodAbb = M.CodAbb
WHERE Cognome = ‘CognomeNoto’;
In Access la sintassi COUNT ( DISTINCT ... ) non è ammessa e bisogna ricorrere a:
SELECT COUNT(*) AS NumeroRiviste
FROM Riviste
WHERE CodRiv IN ( SELECT DISTINCT CodRiv
FROM Abbonati A INNER JOIN Abbonamenti M
ON A.CodAbb = M.CodAbb
WHERE Cognome = ‘CognomeNoto’ );

• Numero degli abbonati di Bergamo


SELECT COUNT(*) AS NumeroAbbonati
FROM Abbonati
WHERE Città = ‘Bergamo’;

• Elenco delle riviste per le quali non è precisata la periodicità ordinato per Titolo
SELECT CodRiv, Titolo, Prezzo
FROM Riviste
WHERE Periodicità IS NULL
ORDER BY Titolo;

• Numero di abbonamenti sottoscritti nel 2013 a una rivista di cui si conosce il codice
SELECT COUNT(*) AS Abbonamenti2013
FROM Abbonamenti
WHERE CodRiv = ‘CodiceNoto’ AND YEAR(Data) = 2013;

• Numero degli abbonamenti sottoscritti per ogni rivista (con codice rivista)
SELECT CodRiv, COUNT(*) AS NumeroAbbonamenti
FROM Abbonamenti
GROUP BY CodRiv;

6
Riviste ( CodRiv, Titolo, Periodicità, Prezzo )
Abbonati ( CodAbb, Cognome, Indirizzo, Città )
Abbonamenti ( ID, Data, CodRiv, CodAbb )

• Numero degli abbonamenti sottoscritti per ogni rivista (con codice e titolo rivista)
SELECT CodRiv, Titolo, COUNT(*) AS NumeroAbbonamenti
FROM Abbonamenti A INNER JOIN Riviste R ON A.CodRiv = R.CodRiv
GROUP BY R.CodRiv, Titolo;

• Valore totale abbonamenti per ogni rivista


SELECT A.CodRiv, SUM(Prezzo) AS ValoreAbbonamenti
FROM Abbonamenti A INNER JOIN Riviste R ON A.CodRiv = R.CodRiv
GROUP BY A.CodRiv;

• Valore totale abbonamenti per ogni rivista per le sole riviste per le quali sono stati
sottoscritti più di 3000 abbonamenti
SELECT R.CodRiv, SUM(Prezzo) AS ValoreAbbonamenti
FROM Abbonamenti A INNER JOIN Riviste R ON A.CodRiv = R.CodRiv
GROUP BY R.CodRiv
HAVING COUNT(*) > 3000;

• Elenco delle riviste con: titolo, numero degli abbonamenti sottoscritti e valore complessivo
degli abbonamenti, ordinato per numero decrescente di abbonamenti
SELECT Titolo,
COUNT(*) AS NumeroAbbonamenti,
SUM(Prezzo) AS ValoreAbbonamenti
FROM Abbonamenti A INNER JOIN Riviste R ON A.CodRiv = R.CodRiv
GROUP BY R.CodRiv, Titolo
ORDER BY COUNT(*) DESC;

• Numero degli abbonamenti sottoscritto da ogni abbonato


SELECT A.CodAbb, Cognome, COUNT(*) AS NumeroAbbonamenti
FROM Abbonati A INNER JOIN Abbonamenti M ON A.CodAbb = M.CodAbb
GROUP BY A.CodAbb, Cognome;

• Suddividere le riviste per periodicità e per ogni periodicità precisare il numero riviste e il
prezzo medio delle riviste che hanno quella periodicità
SELECT Periodicità,
COUNT(*) AS NumeroRiviste,
AVG(Prezzo) AS PrezzoMedio
FROM Riviste
GROUP BY Periodicità;

7
Esercizi della diapositiva 51 nella presentazione LinguaggioSQL2

Riviste ( CodRiv, Titolo, Periodicità, Prezzo )


Abbonati ( CodAbb, Cognome, Indirizzo, Città )
Abbonamenti ( ID, Data, CodRiv, CodAbb )

• Qual è la rivista che costa di più?


SELECT Titolo, Prezzo
FROM Riviste
WHERE Prezzo = ( SELECT MAX(Prezzo)
FROM Riviste );

• In quale città è stato sottoscritto il maggior numero di abbonamenti nel 2013?


Si costruisce l’interrogazione Abbonamenti PerCittà che elenca, per ogni città, il numero di
abbonamenti sottoscritti nel 2013:
SELECT Città, COUNT(*) AS NumeroAbbonamenti
FROM Abbonati A INNER JOIN Abbonamenti M ON A.CodAbb = M.CodAbb
WHERE YEAR(Data) = 2013
GROUP BY Città;
e si procede come nel caso dell’interrogazione precedente:
SELECT Città, NumeroAbbonamenti
FROM AbbonamentiPerCittà
WHERE NumeroAbbonamenti = ( SELECT MAX(NumeroAbbonamenti)
FROM AbbonamentiPerCittà );

• Quali sono le riviste mensili di prezzo inferiore al prezzo medio di tali riviste?
SELECT Titolo, Prezzo
FROM Riviste
WHERE Periodicità = ‘Mensile’
AND Prezzo < ( SELECT AVG(Prezzo)
FROM Riviste
WHERE Periodicità = ‘Mensile’ );

• Qual è la rivista settimanale meno costosa?


SELECT Titolo, Prezzo
FROM Riviste
WHERE Periodicità = ‘Settimanale’
AND Prezzo = ( SELECT MIN(Prezzo)
FROM Riviste
WHERE Periodicità = ‘Settimanale’ );

8
Riviste ( CodRiv, Titolo, Periodicità, Prezzo )
Abbonati ( CodAbb, Cognome, Indirizzo, Città )
Abbonamenti ( ID, Data, CodRiv, CodAbb )

• In quale città è stato sottoscritto il maggior numero di abbonamenti?


Si costruisce l’interrogazione Abbonamenti PerCittà che elenca, per ogni città, il numero di
abbonamenti sottoscritti:
SELECT Città, COUNT(*) AS NumeroAbbonamenti
FROM Abbonati A INNER JOIN Abbonamenti M ON A.CodAbb = M.CodAbb
GROUP BY Città;
e si ricade nei casi precedenti:
SELECT Città, NumeroAbbonamenti
FROM AbbonamentiPerCittà
WHERE NumeroAbbonamenti = ( SELECT MAX(NumeroAbbonamenti)
FROM AbbonamentiPerCittà );

• Quale rivista ha ottenuto i maggiori ricavi?


Si costruisce l’interrogazione RicaviPerRivista che elenca, per ogni rivista, la somma dei ricavi:
SELECT R.CodRiv AS CodiceRivista, Titolo,
SUM(Prezzo) AS TotaleRicavi
FROM Riviste R INNER JOIN Abbonamenti A ON R.CodRiv = A.CodRiv
GROUP BY R.CodRIv, Titolo;
e, come nei casi precedenti, si interroga la query RicaviPerRivista:
SELECT Titolo, TotaleRicavi
FROM RicaviPerRivista
WHERE TotaleRicavi = ( SELECT MAX(TotaleRicavi)
FROM RicaviPerRivista );

• Quale rivista ha ottenuto il maggior numero di abbonamenti?


Si costruisce l’interrogazione AbbonamentiPerRivista che elenca, per ogni rivista, il numero di
abbonamenti sottoscritti:
SELECT R.CodRiv AS CodiceRivista, Titolo,
COUNT(*) AS NumeroAbbonamenti
FROM Riviste R INNER JOIN Abbonamenti A ON R.CodRiv = A.CodRiv
GROUP BY R.CodRIv, Titolo;
e, come nei casi precedenti, si interroga la query AbbonamentiPerRivista:
SELECT Titolo, NumeroAbbonamenti
FROM AbbonamentiPerRivista
WHERE NumeroAbbonamenti = ( SELECT MAX(NumeroAbbonamenti)
FROM AbbonamentiPerRivista );

9
Riviste ( CodRiv, Titolo, Periodicità, Prezzo )
Abbonati ( CodAbb, Cognome, Indirizzo, Città )
Abbonamenti ( ID, Data, CodRiv, CodAbb )

• Quante riviste hanno prezzo superiore al prezzo medio?


SELECT COUNT(*) AS NumeroRiviste
FROM Riviste
WHERE Prezzo > ( SELECT AVG(Prezzo)
FROM Riviste );

• Chi è l’abbonato che ha sottoscritto il primo abbonamento? (ovvero: l’abbonamento più in


là nel tempo)
Per semplicità l’abbonato è identificato il solo codice CodAbb.
SELECT TOP 1 CodAbb, ID
FROM Abbonamenti
WHERE Data = ( SELECT MIN(Data)
FROM Abbonamenti )
ORDER BY ID;

• Da chi è stato sottoscritto l’ultimo abbonamento a una rivista di cui si conosce il codice?
Per semplicità l’abbonato è identificato il solo codice CodAbb.
SELECT TOP 1 CodAbb, ID
FROM Abbonamenti
WHERE CodRiv = ‘CodiceNoto’ AND
Data = ( SELECT MAX(Data)
FROM Abbonamenti
WHERE Data = ‘CodiceNoto’ )
ORDER BY ID DESC;

10

Potrebbero piacerti anche