![Page 1: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/1.jpg)
SQL avanzato 1
Interrogazioni
complesse
![Page 2: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/2.jpg)
SQL avanzato 2
Classificazione delle interrogazioni complesse
• Query con ordinamento
• Query con aggregazione
• Query con raggruppamento
• Query binarie
• Query annidate
![Page 3: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/3.jpg)
SQL avanzato 3
Esempio : gestione ordini
cliente COD-CLI NOME INDIRIZZO P-IVA
COD-ORD COD-CLI DATA IMPORTO
COD-ORD COD-PROD QTA
COD-PROD NOME PREZZO prodotto
dettaglio
ordine
![Page 4: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/4.jpg)
SQL avanzato 4
Istanza di ordine ordine
COD-ORD
1
2
3
4
5
6
COD-CLI
3
4
3
1
1
3
DATA
1997-06-01
1997-08-03
1997-09-01
1997-07-01
1997-08-01
1997-09-03
IMPORTO
50.000
8.000
5.500
12.000
1.500
27.000
![Page 5: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/5.jpg)
SQL avanzato 5
Query con ordinamento
SELECT * FROM ORDINE
WHERE IMPORTO > 100 ORDER BY DATA
COD-ORD
1
4
5
2
3
6
COD-CLI
3
1
1
4
3
3
DATA
1997-06-01
1997-07-01
1997-08-01
1997-08-03
1997-09-01
1997-09-03
IMPORTO
50.000
12.000
1.500
8.000
5.500
27.000
![Page 6: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/6.jpg)
SQL avanzato 6
Order by
COD-ORD
4
5
1
6
3
2
COD-CLI
1
1
3
3
3
4
DATA
1997-07-01
1997-08-01
1997-06-01
1997-09-03
1997-09-01
1997-08-03
IMPORTO
12.000
1.500
50.000
5.500
27.000
8.000
SELECT * FROM ORDINE
WHERE IMPORTO > 100
ORDER BY COD-CLI
![Page 7: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/7.jpg)
SQL avanzato 7
Order by
SELECT COD-CLI, IMPORTO/1.000
FROM ORDINE
WHERE IMPORTO > 10.000
ORDER BY 2
(ordina sulla SECONDA colonna)
Nel caso si voglia ordinare sui valori
di una colonna risultato di una espressione
si usa una notazione “posizionale”
![Page 8: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/8.jpg)
SQL avanzato 8
Order by
COD-ORD
5
4
6
3
1
2
COD-CLI
1
1
3
3
3
4
DATA
1997-08-01
1997-07-01
1997-09-03
1997-09-01
1997-06-01
1997-08-03
IMPORTO
1.500
12.000
27.000
5.500
50.000
8.000
.......
ORDER BY COD-CLI ASC, DATA DESC
![Page 9: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/9.jpg)
SQL avanzato 9
Query aggregate
Utilizzano le funzioni aggregate:
SUM sommatoria
AVG media
MIN minimo
MAX massimo
COUNT cardinalità
(I NULL sono esclusi)
![Page 10: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/10.jpg)
SQL avanzato 10
Query con massimo
SELECT MAX(IMPORTO) AS MAX-IMP
FROM ORDINE
MAX-IMP
50.000
• Selezionare l’importo massimo degli
ordini.
![Page 11: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/11.jpg)
SQL avanzato 11
Query con sommatoria
SELECT SUM(IMPORTO) AS SOMMA-IMP
FROM ORDINE
WHERE COD-CLIENTE = 1
SOMMA-IMP
13.500
• Selezionare la somma degli importi degli
ordini relativi al cliente numero 1.
![Page 12: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/12.jpg)
SQL avanzato 12
Query con raggruppamento
si aggiungono le clausole
GROUP-BY (raggruppamento)
HAVING (selezione dei gruppi)
SELECT …..
FROM …..
WHERE …..
GROUP BY …..
HAVING …..
![Page 13: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/13.jpg)
SQL avanzato 13
Query con raggruppamento
• Selezionare la somma degli importi degli
ordini successivi al 10-6-97 per quei clienti
che hanno emesso almeno 2 ordini.
SELECT COD-CLI, SUM (IMPORTO)
FROM ORDINE
WHERE DATA > '1997-06-10'
GROUP BY COD-CLI
HAVING COUNT (IMPORTO) >= 2
![Page 14: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/14.jpg)
SQL avanzato 14
Passo 1: Valutazione WHERE
COD-ORD
2
3
4
5
6
COD-CLI
4
3
1
1
3
DATA
1997-08-03
1997-09-01
1997-07-01
1997-08-01
1997-09-03
IMPORTO
8.000
5.500
12.000
1.500
27.000
( WHERE DATA > '1997-06-10’ )
![Page 15: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/15.jpg)
SQL avanzato 15
Passo 2 : Raggruppamento
COD-ORD
4
5
3
6
2
COD-CLI
1
1
3
3
4
DATA
1997-07-01
1997-08-01
1997-09-01
1997-09-03
1997-08-03
IMPORTO
12.000
1.500
5.500
27.000
8.000
si valuta la clausola GROUP-BY
(GROUP BY COD-CLI)
![Page 16: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/16.jpg)
SQL avanzato 16
Passo 3 : Calcolo degli aggregati
per ciascun gruppo si calcolano
SUM (IMPORTO) e COUNT (IMPORTO)
COD-CLI
1
3
4
SUM (IMPORTO)
13.500
32.500
8.000
COUNT (IMPORTO)
2
2
1
![Page 17: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/17.jpg)
SQL avanzato 17
Passo 4 : Selezione dei gruppi
si valuta il predicato
COUNT (IMPORTO) >=2
COD-CLI
1
3
4
SUM (IMPORTO)
13.500
32.500
8.000
COUNT (IMPORTO)
2
2
1
![Page 18: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/18.jpg)
SQL avanzato 18
Passo 5 : Produzione del risultato
COD-CLI
1
3
SUM (IMPORTO)
13.500
32.500
![Page 19: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/19.jpg)
SQL avanzato 19
Doppio raggruppamento
SELECT COD-CLI, COD-PROD, SUM(QTA)
FROM ORDINE AS O, DETTAGLIO AS D
WHERE O.COD-ORD = D.COD-ORD
GROUP BY COD-CLI, COD-PROD
HAVING SUM(QTA) > 50
• Selezionare la somma delle quantità dei
dettagli degli ordini emessi da ciascun
cliente per ciascun prodotto, purché la
somma superi 50.
![Page 20: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/20.jpg)
SQL avanzato 20
Situazione dopo il join e il raggruppamento
ordine
ORDINE. COD-ORD
3
4
3
5
3
1
2
6
COD-CLI
1
1
1
1
2
3
3
3
DETTAGLIO. COD-ORD
3
4
3
5
3
1
2
6
COD-PROD
1
1
2
2
1
1
1
1
dettaglio
QTA
gruppo 1,1
gruppo 1,2
gruppo 2,1
gruppo 3,1
30
20
30
10
60
40
30
25
![Page 21: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/21.jpg)
SQL avanzato 21
Estrazione del risultato
si valuta la funzione aggregata
SUM(QTA) e il predicato HAVING
SUM(QTA)
50
40
60
95
COD-PROD
1
2
1
1
COD-CLI
1
1
2
3
![Page 22: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/22.jpg)
SQL avanzato 22
Query con raggruppamento e
ordinamento
• E’ possibile ordinare il risultato anche
delle query con raggruppamento
SELECT …..
FROM …..
[ WHERE ….. ]
GROUP BY …..
[ HAVING ….. ]
ORDER BY ….
![Page 23: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/23.jpg)
SQL avanzato 23
Raggruppamento e ordinamento • Selezionare la somma degli importi degli ordini
successivi al 10/6/97 per quei clienti che hanno
emesso almeno 2 ordini dopo quella data, in
ordine di cliente.
SELECT COD-CLI, SUM (IMPORTO)
FROM ORDINE
WHERE DATA > '1997-06-10'
GROUP BY COD-CLI
HAVING COUNT (IMPORTO) >= 2
ORDER BY COD-CLI
![Page 24: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/24.jpg)
SQL avanzato 24
ESERCIZI SUL GROUP BY
1 SELECT SUM(NUM)
FROM SPEDIZIONI
GROUP BY ART-NO
OPPURE
2 SELECT SUM(NUM)
FROM SPEDIZIONI
GROUP BY ART-NO, SPED-NO
![Page 25: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/25.jpg)
SQL avanzato 25
ESERCIZI SUL GROUP BY
SU:
ART-NO SPED-NO NUM (SPEDIZIONI)
1 2 100
1 2 25
1 3 75
2 2 100
2 4 100
2 4 75
1 4 25
![Page 26: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/26.jpg)
SQL avanzato 26
ESERCIZI SUL GROUP BY
1 ….GROUP BY ART-NO
ART-NO SPED-NO NUM
1 2,2,3,4 100,25,75,25
2 2,4,4 100,100,75
1 ….GROUP BY ART-NO, SPED-NO
ART-NO SPED-NO NUM
1 2 100,25
1 3 75
1 4 25
2 2 100
2 4 100,75
![Page 27: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/27.jpg)
SQL avanzato 27
ESERCIZI SUL GROUP BY
SELECT ARTICOLO
FROM VENDITE GROUP BY ARTICOLO
HAVING COUNT(DISTINCT DATA) > 1
SU
ARTICOLO DATA NUM
PENNA 1997-12-13 2
MATITA 1997-12-08 1
GOMMA 1997-12-10 1
MATITA 1997-12-08 2
PENNA 1997-12-08 1
![Page 28: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/28.jpg)
SQL avanzato 28
ESERCIZI SUL GROUP BY
GROUP BY ARTICOLO
SU
ARTICOLO DATA
PENNA 1997-12-13, 1997-12-08
MATITA 1997-12-08, 1997-12-08
GOMMA 1997-12-10
HAVING COUNT(DISTINCT DATA) > 1
ARTICOLO
PENNA
![Page 29: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/29.jpg)
SQL avanzato 29
Query binarie
Costruite concatenando due query SQL
tramite operatori insiemistici:
UNION unione
INTERSECT intersezione
EXCEPT (MINUS) differenza
(si eliminano i duplicati)
![Page 30: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/30.jpg)
SQL avanzato 30
Unione
SELECT COD-ORD
FROM ORDINE
WHERE IMPORTO > 5.000
UNION
SELECT COD-ORD
FROM DETTAGLIO
WHERE QTA > 1000
• Selezionare i codici degli ordini i cui importi
superano € 5.000 oppure presenti in qualche
dettaglio con quantità superiore a 1000.
![Page 31: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/31.jpg)
SQL avanzato 31
Differenza
SELECT COD-ORD
FROM ORDINE
WHERE IMPORTO > 5.000
EXCEPT
SELECT COD-ORD
FROM DETTAGLIO
WHERE QTA > 1000
• Selezionare i codici degli ordini i cui importi
superano € 5.000 ma non presenti in nessun
dettaglio con quantità superiore a 1000.
![Page 32: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/32.jpg)
SQL avanzato 32
Intersezione
SELECT COD-ORD
FROM ORDINE
WHERE IMPORTO > 5.000
INTERSECT
SELECT COD-ORD
FROM DETTAGLIO
WHERE QTA > 1000
• Selezionare i codici degli ordini i cui importi
superano € 5.000 e che sono presenti in qualche
dettaglio con quantità superiore a 1000.
![Page 33: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/33.jpg)
SQL avanzato 33
Query annidate
Costruite concatenando due query SQL
nel predicato where:
[NOT] IN appartenenza
[DOES NOT] EXISTS esistenza
ANY, ALL quantificatori
comparatore: =, !=, <, <=, >, >=
![Page 34: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/34.jpg)
SQL avanzato 34
Query annidate (nested)
( SELECT COD-CLI
FROM ORDINE
WHERE IMPORTO > 10.000 )
• Selezionare nome e indirizzo dei clienti che
hanno emesso qualche ordine di importo
superiore a € 10.000.
SELECT NOME, INDIRIZZO
FROM CLIENTE
WHERE COD-CLI IN
![Page 35: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/35.jpg)
SQL avanzato 35
Equivalenza fra IN e query semplici
SELECT NOME, INDIRIZZO
FROM CLIENTE
WHERE COD-CLI IN
( SELECT COD-CLI
FROM ORDINE
WHERE IMPORTO > 10.000 )
equivale (a meno di duplicati) a:
SELECT NOME, INDIRIZZO
FROM CLIENTE JOIN ORDINE
ON CLIENTE.COD-CLI = ORDINE.COD-CLI
WHERE IMPORTO > 10.000
![Page 36: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/36.jpg)
SQL avanzato 36
( SELECT COD-ORD FROM DETTAGLIO
WHERE COD-PROD IN
• Selezionare nome e indirizzo dei clienti che
hanno emesso qualche ordine i cui dettagli
comprendono il prodotto “Pneumatico”.
( SELECT COD-PROD FROM PRODOTTO
WHERE NOME = 'Pneumatico' ) ) )
( SELECT COD-CLI FROM ORDINE
WHERE COD-ORD IN
SELECT NOME, INDIRIZZO FROM CLIENTE
WHERE COD-CLI IN
Nested Query complesse (fino a 8 livelli)
![Page 37: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/37.jpg)
SQL avanzato 37
La query equivalente
equivale (a meno di duplicati) a:
SELECT NOME, INDIRIZZO
FROM CLIENTE AS C, ORDINE AS O,
DETTAGLIO AS D, PRODOTTO AS P
WHERE C.COD-CLI = O.COD-CLI
AND O.COD-ORD = D.COD-ORD
AND D.COD-PROD = P.COD-PROD
AND NOME= 'Pneumatico'
![Page 38: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/38.jpg)
SQL avanzato 38
Nested query correlate (con variabile)
SELECT NOME
FROM IMPIEGATI AS X,
WHERE SALARIO>
( SELECT SALARIO
FROM IMPIEGATI
WHERE MATRICOLA= X.MANAGER )
sulla relazione IMPIEGATI (matricola, nome, manager…)
equivale al JOIN
SELECT X.NOME
FROM IMPIEGATI AS X, IMPIEGATI AS Y
WHERE X.SALARIO > Y.SALARIO
AND Y.MATRICOLA= X.MANAGER
![Page 39: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/39.jpg)
SQL avanzato 39
Uso di IN nelle modifiche
• aumentare di € 50 l’importo di tutti gli ordini che
comprendono il prodotto 456
UPDATE ORDINE
SET IMPORTO = IMPORTO + 50
WHERE COD-ORD IN
( SELECT COD-ORD
FROM DETTAGLIO
WHERE COD-PROD = '456’ )
![Page 40: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/40.jpg)
SQL avanzato 40
Query con NOT IN
( SELECT COD-CLI
FROM ORDINE
WHERE IMPORTO > 10.000 )
• Selezionare nome e indirizzo dei clienti che non
hanno emesso nessun ordine di importo
superiore a € 10.000.
SELECT NOME, INDIRIZZO
FROM CLIENTE
WHERE COD-CLI NOT IN
![Page 41: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/41.jpg)
SQL avanzato 41
La query con ANY e ALL
SELECT COD-ORD
FROM ORDINE
WHERE IMPORTO > ANY
( SELECT IMPORTO
FROM ORDINE )
SELECT COD-ORD
FROM ORDINE
WHERE IMPORTO >= ALL
( SELECT IMPORTO
FROM ORDINE )
COD-ORD
1
2
3
IMPORTO
5.000
30.000
9.000
ANY
F
V
V
ALL
F
V
F
![Page 42: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/42.jpg)
SQL avanzato 42
Esercizi
• Riprendere le basi di dati per la gestione
del personale e degli ordini ed esprimere
in SQL le interrogazioni :
- quale impiegati lavorano in un progetto
in cui non lavora il loro manager?
- quanti ordini ha emesso Paolo?
- quante candele sono state ordinate
il 5/7/97?
- calcolare per ciascun cliente la somma
degli importi di tutti gli ordini
- estrarre l'ordine di importo più alto
![Page 43: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/43.jpg)
SQL avanzato 43
Esercizi (lezione precedente)
• in quali tipi di progetti lavora Giovanni?
SELECT TIPO FROM PROGETTO WHERE NUM-PROG IN ( SELECT NUM-PROG FROM ASSEGNAMENTO WHERE MATR IN ( SELECT MATR FROM IMPIEGATO WHERE NOME='Giovanni’ ) )
• chi è il manager di Piero?
SELECT NOME FROM IMPIEGATO WHERE MATR IN ( SELECT MATR-MGR FROM IMPIEGATO WHERE NOME='Piero’ )
![Page 44: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/44.jpg)
SQL avanzato 44
Query annidate (nested)
( SELECT *
FROM ORDINE
WHERE IMPORTO > 10.000
AND COD_CLI=C.COD_CLI )
• Selezionare nome e indirizzo dei clienti che
hanno emesso qualche
[o non hanno emesso nessun]
ordine di importo superiore a € 10.000
SELECT NOME, INDIRIZZO
FROM CLIENTE C
WHERE [NOT] EXISTS
![Page 45: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/45.jpg)
SQL avanzato 45
Query universali
• Esempio:
Trovare gli ordini che contengono tutti i prodotti
• In Algebra relazionale queste interrogazioni
si possono esprimere tramite l’operatore di
divisione ÷
• Ma in SQL??
• Non c’è un quantificatore universale (per ogni)
ma solo un quantificatore esistenziale (EXISTS)
![Page 46: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/46.jpg)
SQL avanzato 46
Query universali
• In generale va ribaltata la logica della query,
per esprimere la quantificazione universale
per mezzo dell’operatore EXISTS e una doppia
negazione
Anche in logica solo uno dei due quantificatori è
in realtà necessario e l’altro può essere espresso
per mezzo del primo:
x P(x) x P(x)
Per ogni x vale la proprietà P equivale a dire:
Non esiste alcun x per cui non vale la proprietà P
![Page 47: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/47.jpg)
SQL avanzato 47
Query universali
• Selezionare gli ordini che contengono tutti i
prodotti (= Selezionare gli ordini per cui non
esiste alcun prodotto che non sia compreso nelle
loro righe di dettaglio)
SELECT * FROM ORDINE ORD
WHERE NOT EXISTS
(SELECT * FROM PRODOTTO
WHERE COD-PROD NOT IN
(SELECT COD-PROD FROM DETTAGLIO DET
WHERE DET.COD-ORD=ORD.COD-ORD ) )
![Page 48: Interrogazioni - unibo.it · 2012. 3. 1. · SQL avanzato 20 Situazione dopo il join e il raggruppamento ordine ORDINE. COD-ORD 3 4 3 5 3 1 2 6 COD-CLI 1 1 1 1 2 3 3 3 DETTAGLIO](https://reader035.vdocuments.site/reader035/viewer/2022070223/613de9872809574f586e440c/html5/thumbnails/48.jpg)
SQL avanzato 48
Query universali
• Selezionare gli ordini che contengono tutti i
prodotti (= Selezionare gli ordini per cui non
esiste alcun prodotto per cui non esiste alcuna
loro riga di dettaglio che lo contiene)
SELECT * FROM ORDINE ORD
WHERE NOT EXISTS
(SELECT * FROM PRODOTTO PRO
WHERE NOT EXISTS
(SELECT * FROM DETTAGLIO DET
WHERE DET.COD-ORD=ORD.COD-ORD
AND DET.COD-PROD=PRO.COD-PROD ) )