Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8...

24
Basi di Dati Esercitazione SQL 19 maggio 2005 Paolo Papotti

Transcript of Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8...

Page 1: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Basi di Dati Esercitazione SQL

19 maggio 2005

Paolo Papotti

Page 2: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 2

Esercitazione 2

Considerando la seguente base di dati:

Fornitori (CodiceFornitore, Nome, Indirizzo, Città)

Prodotti (CodiceProdotto, Nome, Marca, Modello)

Catalogo (CodiceFornitore, CodiceProdotto, Costo)

formulare in SQL una interrogazione per ciascuno dei seguenti punti:

1. Trovare il numero dei fornitori che lavorano a Roma.

2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del prodotto e Nome del fornitore presso cui èvenduto, e ordinarlo come ascendente rispetto al codice e al costo del prodotto (prima rispetto al codice poi al costo).

3. Trovare il costo del prodotto più caro venduto a Milano.

4. Trovare il costo medio dei prodotti forniti in ciascuna città(visualizzare costo e città).

Page 3: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 3

Esercitazione 2

Considerando la seguente base di dati:

Fornitori (CodiceFornitore, Nome, Indirizzo, Città)

Prodotti (CodiceProdotto, Nome, Marca, Modello)

Catalogo (CodiceFornitore, CodiceProdotto, Costo)

formulare in SQL una interrogazione per ciascuno dei seguenti punti:

5. Trovare il numero dei prodotti a catalogo per ogni città.

6. Trovare il codice del prodotto più costoso tra quelli distribuiti dai fornitori presenti a Roma.

7. Trovare i nomi dei fornitori che distribuiscono tutti i prodottipresenti nel catalogo.

8. Trovare presso quale fornitori conviene comprare i singoli prodotti (chi vende a meno un determinato prodotto?); mostrare: Nome del fornitore, Codice e Costo del prodotto.

Page 4: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 4

Le Relazioni

Fornitori

Nome CodiceFornitore Indirizzo CittàLadroni 001 Via Ostense RomaRisparmietti 002 Viale Marconi RomaTeloporto 010 Via Roma Milano

CodiceProdotto Nome Marca Modello0001 Notebook IBM 390 x0002 Desktop IBM 5100003 Desktop ACER 730

Prodotti

Catalogo

CodiceFornitore CodiceProdotto Costo001 0002 € 3.200001 0003 € 2.200002 0001 € 1.900002 0002 € 2.500002 0003 € 1.800010 0001 € 2.200010 0003 € 2.000

Page 5: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 5

1. Trovare il numero dei fornitori che lavorano a Roma.

Esercizio 1

SQL:

Page 6: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 6

Soluzione Esercizio 1

SQL:

SELECT count(*)FROM Fornitori WHERE Citta = ‘Roma';

1. Trovare il numero dei fornitori che lavorano a Roma.

Page 7: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 7

2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del prodotto e Nome del fornitore presso cui èvenduto, e ordinarlo come ascendente rispetto al codice e al costo del prodotto (prima rispetto al codice poi al costo).

Esercizio 2

SQL:

Page 8: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 8

2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del prodotto e Nome del fornitore presso cui èvenduto, e ordinarlo come ascendente rispetto al codice e al costo del prodotto (prima rispetto al codice poi al costo).

Soluzione Esercizio 2

SQL:

SELECT C.CodiceProdotto, C.Costo, F.Nome

FROM Catalogo AS C, Fornitori AS F

WHERE C.CodiceFornitore = F.CodiceFornitore

ORDER BY C.CodiceProdotto ASC, C.Costo ASC

Page 9: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 9

3. Trovare il costo del prodotto più caro venduto a Milano.

Esercizio 3

SQL:

Page 10: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 10

3. Trovare il costo del prodotto più caro venduto a Milano.

Soluzione Esercizio 3

SQL:

SELECT max(Costo) FROM Catalogo C JOIN Fornitori F ON F.CodiceFornitore=C.CodiceFornitoreWHERE Citta = 'Milano';

Page 11: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 11

4. Trovare il costo medio dei prodotti forniti in ciascuna città(visualizzare costo e città).

Esercizio 4

SQL:

Page 12: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 12

4. Trovare il costo medio dei prodotti forniti in ciascuna città(visualizzare costo e città).

Soluzione Esercizio 4

SQL:

SELECT avg(Costo) AS CostoMedio, F.CittaFROM Catalogo AS C, Fornitori AS FWHERE C.CodiceFornitore=F.CodiceFornitoreGROUP BY F.Citta

Page 13: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 13

Costo Città€ 2.200 Roma€ 3.200 Roma€ 1.900 Roma€ 2.500 Roma€ 1.800 Roma€ 2.200 Milano€ 2.000 Milano

Notiamo che l‘interrogazione:

Soluzione Esercizio 4

SELECT Costo, F.CittaFROM Catalogo AS C, Fornitori AS FWHERE C.CodiceFornitore=F.CodiceFornitore

restituisce:

media: € 2.320

media: € 2.100

Page 14: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 14

5. Trovare il numero dei prodotti a catalogo in ogni città

Esercizio 5

SQL:

Page 15: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 15

5. Trovare il numero dei prodotti a catalogo in ogni città.

Soluzione Esercizio 5

SQL:

SELECT Citta, count(distinct CodiceProdotto)FROM Catalogo C JOIN Fornitori F ON F.CodiceFornitore=C.CodiceFornitoreGROUP BY F.Citta;

Page 16: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 16

6. Trovare il codice del prodotto più costoso tra quelli distribuiti dai fornitori presenti a Roma.

Esercizio 6

SQL:

Page 17: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 17

6. Trovare il codice del prodotto più costoso tra quelli distribuiti dai fornitori presenti a Roma.

Soluzione Esercizio 6

SQL:

SELECT DISTINCT C.CodiceProdottoFROM Fornitori AS F, Catalogo AS CWHERE F.CodiceFornitore = C.CodiceFornitoreAND F.Citta = 'Roma'AND C.Costo =

(SELECT MAX(costo)FROM Fornitori F1, Catalogo C1WHERE F1.CodiceFornitore =

C1.CodiceFornitoreAND F1.Citta = 'Roma')

Page 18: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 18

dove:

Soluzione Esercizio 6

SELECT MAX(costo)FROM Fornitori F1, Catalogo C1WHERE

F1.CodiceFornitore = C1.CodiceFornitoreAND F1.Citta = 'Roma'

N.B. Gli op. aggregati non fanno selezione, restituiscono valori su insieme. Non è quindi un query valida:

SELECT C.CodiceProdotto, MAX(costo)[…]

MaxCosto€ 3.200

Page 19: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 19

Esercizio 7

7. Trovare i nomi dei fornitori che distribuiscono tutti i prodottipresenti nel catalogo.

Osservazioni:

Il quesito può essere riformulato nella seguente maniera:

• trovare i nomi dei fornitori per i quali non esiste un prodotto in catalogo che non distribuiscono.

Page 20: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 20

Soluzione Esercizio 7

7. Trovare i nomi dei fornitori che distribuiscono tutti i prodottipresenti nel catalogo.

Algebra Relazionale:

πNome((πCF(Fornitori)- R )⋈ Fornitore )

dove:

R:= πCF (( (πCF(Fornitori)⋈ πCP(Catalogo))

– π CF,CP(Catalogo) ) )

R corrisponde ai CF dei Fornitori ai quali manca almeno un prodotto di quelli in catalogo.

Page 21: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 21

7. Trovare i nomi dei fornitori che distribuiscono tutti i prodottipresenti nel catalogo.

Soluzione Esercizio 7

SQL:

SELECT DISTINCT F1.NomeFROM Fornitori F1WHERE F1.CodiceFornitore NOT IN (

SELECT DISTINCT F.CodiceFornitoreFROM Prodotti P, Fornitori FWHERE (F.CodiceFornitore, P.CodiceProdotto) NOT IN (

SELECT DISTINCT E.CodiceFornitore, E.CodiceProdottoFROM Catalogo E))

1

2

3

NomeRisparmietti

Page 22: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 22

7. Trovare i nomi dei fornitori che distribuiscono tutti i prodottipresenti nel catalogo.

Soluzione Esercizio 7

SQL:

SELECT DISTINCT F.NomeFROM Fornitori AS FWHERENOT EXISTS (

SELECT P.CodiceProdottoFROM Prodotti P WHERE NOT EXISTS (

SELECT C.CodiceProdottoFROM Catalogo C WHERE C.CodiceFornitore = F.CodiceFornitore AND C.CodiceProdotto = P.CodiceProdotto));

1

2

3

NomeRisparmietti

Page 23: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 23

8. Trovare presso quale fornitori conviene comprare i singoli prodotti (chi vende a meno un determinato prodotto?); mostrare: Nome del fornitore, Codice e Costo del prodotto.

Esercizio 8

SQL:

Page 24: Esercitazione SQLatzeni/didattica/BDN/20042005/Esercitazione... · Esercitazione Basi di Dati SQL 8 2. Costruire l’elenco dei prodotti venduti, visualizzando Codice e Costo del

Esercitazione Basi di Dati SQL 24

8. Trovare presso quali fornitori conviene comprare i singoli prodotti (chi vende a meno un determinato prodotto?); mostrare: Nome del fornitore, Codice e Costo del prodotto.

Soluzione Esercizio 8

SQL:

SELECT F1.Nome, C1.CodiceProdotto, C1.CostoFROM CATALOGO AS C1, FORNITORI AS F1WHERE C1.CODICEFORNITORE = F1.CODICEFORNITOREAND C1.Costo = (

SELECT min(C.Costo)FROM Catalogo AS CWHERE C1.CodiceProdotto = C.CodiceProdotto

)