Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Il 0% ha trovato utile questo documento (0 voti)
2 visualizzazioni

07-SQL1

Il documento fornisce una panoramica delle basi di dati e delle interrogazioni SQL, coprendo la sintassi dell'istruzione SELECT, l'uso della clausola WHERE, le funzioni aggregate e le operazioni di manipolazione dei dati. Viene spiegato il linguaggio SQL come un linguaggio dichiarativo e a livello di set, con esempi pratici di interrogazioni per estrarre e modificare dati. Inoltre, si discute l'eliminazione dei duplicati e l'uso di espressioni booleane e di ricerca testuale.

Caricato da

djaleandro 27
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
2 visualizzazioni

07-SQL1

Il documento fornisce una panoramica delle basi di dati e delle interrogazioni SQL, coprendo la sintassi dell'istruzione SELECT, l'uso della clausola WHERE, le funzioni aggregate e le operazioni di manipolazione dei dati. Viene spiegato il linguaggio SQL come un linguaggio dichiarativo e a livello di set, con esempi pratici di interrogazioni per estrarre e modificare dati. Inoltre, si discute l'eliminazione dei duplicati e l'uso di espressioni booleane e di ricerca testuale.

Caricato da

djaleandro 27
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 119

Basi di dati

Lezione 07 - Interrogazioni SQL

Prof.ssa Anisa Rula


anisa.rula@unibs.it

Dipartimento di Ingegneria dell'Informazione


Anno Accademico 2023-2024
Istruzione SELECT: fondamenti

Struttura di base
Clausola WHERE
Ordinamento del risultato
Join
Funzioni aggregate
Operatore GROUP BY
Il linguaggio SQL

● Linguaggio per gestire le basi di dati relazionali


○ Structured Query Language
● SQL possiede istruzioni per
○ definire lo schema di una base di dati relazionale
○ leggere e scrivere i dati
○ definire lo schema di tabelle derivate
○ definire i privilegi di accesso degli utenti
○ gestire le transazioni
Il linguaggio SQL

● Il linguaggio SQL è un linguaggio a livello di set


○ gli operatori operano su relazioni
○ il risultato è sempre una relazione
● Il linguaggio SQL è dichiarativo
○ descrive cosa fare e non come fare
○ si pone ad un livello di astrazione superiore rispetto ai linguaggi
di programmazione tradizionali
Il linguaggio SQL

● Il linguaggio è utilizzabile in modalità


○ interattiva
○ compilata
■ un linguaggio ospite (host) contiene le istruzioni SQL
■ le istruzioni SQL si distinguono dalle istruzioni del linguaggio ospite
per mezzo di opportuni artifici sintattici
Data Manipulation Language

● Operazione di interrogazione:
○ SELECT
■ Interrogazione di una base dati per estrarre i dati di interesse
● Operazioni di modifica:
○ INSERT
■ Inserimento di nuove informazioni in una tabella
○ DELETE
■ Cancellazione di dati obsoleti
○ UPDATE
■ Aggiornamento di dati presenti nella base dati
Sintassi del lingauggio SQL

● Grammatica
○ parentesi angolari < >
■ isolano un termine della sintassi
○ parentesi quadre [ ]
■ indicano che il termine all’interno è opzionale
○ parentesi graffe { }
■ indicano che il termine racchiuso può non comparire o essere ripetuto
un numero arbitrario di volte
○ barra verticale |
■ indica che deve essere scelto uno tra i termini separati dalle barre
Istruzione SELECT sintassi
PROIEZIONE, scelgo le colonne SELEZIONE, scelgo le righe

L’asterisco * si usa
come abbreviazione
per indicare tutti gli
attributi

8
Istruzione SELECT esempio

Trovare il codice e il numero di soci dei fornitori di Milano

9
BD forniture prodotti
P FP
CodP NomeP Colore Taglia Magazzino CodF CodP Qta
P1 Maglia Rosso 40 Torino F1 P1 300
P2 Jeans Verde 48 Milano F1 P2 200
P3 Camicia Blu 48 Roma F1 P3 400
P4 Camicia Blu 44 Torino F1 P4 200
P5 Gonna Blu 40 Milano F1 P5 100
P6 Bermuda Rosso 42 Torino F1 P6 100
F2 P1 300
F2 P2 400
F F3 P2 200
CodF NomeF NSoci Sede
F1 Andrea 2 Torino F4 P3 200
F2 Luca 1 Milano F4 P4 300
F3 Antonio 3 Milano F4 P5 400
F4 Gabriele 2 Torino
F5 Matteo 3 Venezia
4
Istruzione SELECT esempio

Trovare il codice e il numero di soci dei fornitori di Milano

F R
CodF NomeF NSoci Sede
F1 Andrea 2 Torino π
CodF, NSoci
F2 Luca 1 Milano
F3 Antonio 3 Milano
F4 Gabriele 2 Torino σ
Sede='Milano'
F5 Matteo 3 Venezia

11
Istruzione SELECT esempio
Trovare il codice e il numero di soci dei fornitori di Milano
SELECT CodF, NSoci
FROM F
WHERE Sede='Milano';
F
CodF NomeF NSoci Sede
F1 Andrea 2 Torino
R
CodF NSoci
F2 Luca 1 Milano F2 1
F3 Antonio 3 Milano F3 3
F4 Gabriele 2 Torino
F5 Matteo 3 Venezia

12
SELECT base 1
Trovare il codice di tutti i prodotti

SELECT CodP R
π CodP
FROM P;
P
P R
CodP NomeP Colore Taglia Magazzino CodP
P1 Maglia Rosso 40 Torino P1
P2 Jeans Verde 48 Milano P2
P3 Camicia Blu 48 Roma P3
P4 Camicia Blu 44 Torino P4
P5 Gonna Blu 40 Milano P5
P6 Bermuda Rosso 42 Torino P6

13
SELECT base 2

Trovare il codice dei prodotti forniti da almeno un fornitore

FP R
CodF CodP Qta CodP
F1 P1 300 P1
F1 P2 200 P2
F1 P3 400 P3
F1 P4 200 SELECT CodP P4
F1 P5 100 P5
F1 P6 100
FROM FP;
P6
F2 P1 300 P1
F2 P2 400 P2
F3 P2 200 P2
F4 P3 200 P3
F4 P4 300 P4
14
F4 P5 400 P5
SELECT base 2
Trovare il codice dei prodotti forniti da almeno un fornitore

SELECT CodP
FROM FP; π
CodP

FP
Non effettua la rimozione dei duplicati

15
Eliminazione dei duplicati

Parola chiave DISTINCT


eliminazione dei duplicati

Trovare il codice dei prodotti diversi forniti da almeno un fornitore

16
SELECT base 2
Trovare il codice dei prodotti diversi forniti da almeno un fornitore
FP
CodF CodP Qta
F1 P1 300 SELECT DISTINCT CodP
F1 P2 200 FROM FP; R
F1 P3 400
F1 P4 200 CodP
F1 P5 100 P1
F1 P6 100 P2
F2 P1 300 P3
F2 P2 400 P4
F3 P2 200 P5
F4 P3 200 P6
F4 P4 300
17
F4 P5 400
Selezione di tutte le informazioni
Trovare tutte le informazioni sui prodotti

SELECT CodP, NomeP, Colore, Taglia, Magazzino


FROM P;
oppure
SELECT *
FROM P;
R
CodP NomeP Colore Taglia Magazzino
P1 Maglia Rosso 40 Torino
P2 Jeans Verde 48 Milano
P3 Camicia Blu 48 Roma
P4 Camicia Blu 44 Torino
P5 Gonna Blu 40 Milano
P6 Bermuda Rosso 42 Torino
12
Selezione con espressione (1/3)
Trovare il codice dei prodotti e la taglia espressa con la misura
americana
SELECT CodP, Taglia-14
FROM P;
P R
CodP NomeP Colore Taglia Magazzino CodP
P1 Maglia Rosso 40 Torino P1 26
P2 Jeans Verde 48 Milano P2 34
P3 Camicia Blu 48 Roma P3 34
P4 Camicia Blu 44 Torino P4 30
P5 Gonna Blu 40 Milano P5 26
P6 Bermuda Rosso 42 Torino P6 28

19
Selezione con espressione (2/3)

● Definizione di una nuova colonna temporanea per l’espressione


calcolata
○ il nome della colonna temporanea può essere definito con la
parola chiave AS

20
Selezione con espressione (3/3)

Trovare il codice dei prodotti e la taglia espressa con la misura


americana

SELECT CodP, Taglia-14 AS TagliaUSA

FROM P;
CodP TagliaUSA
P1 26
R
P2 34
P3 34
P4 30
P5 26
P6 28 21
Struttura dell’istruzione SELECT (1)

SELECT [DISTINCT] ElencoAttributiDaVisualizzare


FROM ElencoTabelleDaUtilizzare;

22
Clausola WHERE

● Permette di esprimere condizioni di selezione applicate


singolarmente ad ogni tupla
● Espressione booleana di predicati Predicati
semplici
○ espressioni di confronto tra attributi e costanti ricerca
testuale
○ valori NULL

23
Clausola WHERE 1
Trovare il codice dei fornitori di Milano

SELECT CodF
FROM F
WHERE Sede='Milano';

CodF NomeF NSoci Sede R


F F1 Andrea 2 Torino CodF
F2 Luca 1 Milano F2
F3 Antonio 3 Milano F3
F4 Gabriele 2 Torino
F5 Matteo 3 Venezia

24
Clausola WHERE 2

Trovare il codice e il numero di soci dei fornitori che non hanno sede a
Milano
SELECT CodF, NSoci
FROM F
F WHERE Sede<>'Milano';
CodF NomeF NSoci Sede R
F1 Andrea 2 Torino CodF NSoci
F2 Luca 1 Milano F1 2
F3 Antonio 3 Milano F4 2
F4 Gabriele 2 Torino F5 3
F5 Matteo 3 Venezia

25
Espressioni booleane 1
Trovare il codice dei fornitori di Milano con più di 2 soci
SELECT CodF
FROM F
WHERE Sede='Milano' AND NSoci>2;

CodF NomeF NSoci Sede


F1 Andrea 2 Torino
CodF
F F2 Luca 1 Milano
F3
F3 Antonio 3 Milano
F4 Gabriele 2 Torino R
F5 Matteo 3 Venezia

26
Espressioni booleane 2

Trovare il codice e il numero di soci dei fornitori di Milano o di Torino

SELECT CodF, NSoci

FROM F
WHERE Sede='Milano' OR Sede='Torino';

F CodF NomeF NSoci Sede CodF NSoci


F1 Andrea 2 Torino R F1 2
F2 Luca 1 Milano F2 1
F3 Antonio 3 Milano F3 3
F4 Gabriele 2 Torino F4 2
F5 Matteo 3 Venezia
21
Espressioni booleane 3
● Trovare il codice e il numero di soci dei fornitori che hanno sede a
Milano e a Torino
● la richiesta non può essere soddisfatta
○ ogni fornitore ha una sola sede

F
CodF NomeF NSoci Sede
F1 Andrea 2 Torino
F2 Luca 1 Milano
F3 Antonio 3 Milano
F4 Gabriele 2 Torino
F5 Matteo 3 Venezia 28
Ricerca testuale

● Operatore LIKE
NomeAttributo LIKE StringaDiCaratteri

○ il carattere _ rappresenta un singolo carattere qualsiasi


(obbligatoriamente presente)
○ il carattere % rappresenta una sequenza qualsiasi
○ di n caratteri (anche vuota)

29
Ricerca testuale 1

Trovare il codice e il nome dei prodotti il cui nome inizia con la lettera C
SELECT CodP, NomeP
FROM P
WHERE NomeP LIKE 'C%';
PCodP NomeP Colore Taglia Magazzino
P1 Maglia Rosso 40 Torino
P2 Jeans Verde 48 Milano CodP NomeP
P3 Camicia Blu 48 Roma R P3 Camicia
P4 Camicia Blu 44 Torino P4 Camicia
P5 Gonna Blu 40 Milano
P6 Bermuda Rosso 42 Torino

30
Ricerca testuale 2

L’attributo Indirizzo contiene la stringa ‘Torino’

Indirizzo LIKE '%Torino%'

31
Ricerca testuale 3

● Il codice fornitore è pari a 2 e


○ è preceduto da un carattere ignoto
○ è costituito esattamente da 2 caratteri

CodF LIKE '_2'

32
Ricerca testuale 4

L’attributo magazzino non contiene una ‘e’ in seconda posizione

Magazzino NOT LIKE '_e%'

33
Gestione di valori NULL 1

Trovare il codice e il nome dei prodotti con taglia maggiore di 44


SELECT CodP, NomeP
FROM P
WHERE Taglia>44;
PCodP NomeP Colore Taglia Magazzino
P1 Maglia Rosso 40 Torino CodP NomeP
P2 Jeans Verde 48 Milano R P2 Jeans
P3 Camicia Blu 48 Roma P3 Camicia
P4 Camicia Blu 44 Torino
P5 Gonna Blu NULL Milano
P6 Bermuda Rosso 42 Torino
34
Valore NULL

● Le tuple per cui la taglia è NULL non sono selezionate


○ il predicato Taglia>44 è falso
● In presenza di valori NULL qualsiasi predicato di confronto è falso

35
Ricerca di valori NULL

Operatore speciale IS

NomeAttributo IS [NOT] NULL

36
Ricerca di valori NULL 1

Trovare il codice e il nome dei prodotti per cui la taglia non è indicata
SELECT CodP, NomeP
FROM P
WHERE Taglia IS NULL;
PCodP
P1
NomeP
Maglia
Colore
Rosso
Taglia
40
Magazzino
Torino
P2 Jeans Verde 48 Milano
CodP NomeP
P3 Camicia Blu 48 Roma
P4 Camicia Blu 44 Torino
R P5 Gonna

P5 Gonna Blu NULL Milano


P6 Bermuda Rosso 42 Torino

37
Ricerca di valori NULL 2

Trovare il codice e il nome dei prodotti con la taglia maggiore di 44


o che potrebbero avere taglia maggiore di 44
SELECT CodP, NomeP
FROM P
P WHERE Taglia>44 OR Taglia IS NULL;
CodP NomeP Colore Taglia Magazzino
P1 Maglia Rosso 40 Torino
R
CodP NomeP
P2 Jeans Verde 48 Milano P2 Jeans
P3 Camicia Blu 48 Roma P3 Camicia
P4 Camicia Blu 44 Torino P5 Gonna
P5 Gonna Blu NULL Milano
P6 Bermuda Rosso 42 Torino
38
Struttura dell’istruzione SELECT 2

SELECT [DISTINCT] ElencoAttributiDaVisualizzare


FROM ElencoTabelleDaUtilizzare
[WHERE CondizioniDiTupla ];

39
Ordinamento del risultato 1

Trovare il codice dei prodotti e la loro taglia ordinando il risultato in


ordine decrescente di taglia
SELECT CodP, Taglia
FROM P
ORDER BY Taglia DESC;
R
P CodP NomeP Colore Taglia Magazzino CodP Taglia
P1 Maglia Rosso 40 Torino P2 48
P2 Jeans Verde 48 Milano P3 48
P3 Camicia Blu 48 Roma P4 44
P4 Camicia Blu 44 Torino P6 42
P5 Gonna Blu 40 Milano P1 40
P6 Bermuda Rosso 42 Torino P5 40
40
Ordinamento

Clausola ORDER BY
ORDER BY NomeAttributo [ASC | DESC]
{, NomeAttributo [ASC | DESC]}
● l’ordinamento implicito è crescente
senza ASC
● gli attributi di ordinamento devono comparire nella
clausola SELECT
anche implicitamente (come SELECT *)

41
Ordinamento del risultato 2

Trovare tutte le informazioni sui prodotti ordinando il risultato in


ordine crescente di nome e decrescente di taglia
SELECT CodP, NomeP, Colore, Taglia, Magazzino
FROM P
ORDER BY NomeP, Taglia DESC;
R CodP NomeP Colore Taglia Magazzino
P6 Bermuda Rosso 42 Torino
P3 Camicia Blu 48 Roma
P4 Camicia Blu 44 Torino
P5 Gonna Blu 40 Milano
P2 Jeans Verde 48 Milano
P1 Maglia Rosso 40 Torino
42
Ordinamento del risultato 2

Trovare tutte le informazioni sui prodotti ordinando il risultato in


ordine crescente di nome e decrescente di taglia
SELECT *
FROM P
ORDER BY NomeP, Taglia DESC;
R CodP NomeP Colore Taglia Magazzino
P6 Bermuda Rosso 42 Torino
P3 Camicia Blu 48 Roma
P4 Camicia Blu 44 Torino
P5 Gonna Blu 40 Milano
P2 Jeans Verde 48 Milano
P1 Maglia Rosso 40 Torino
43
Ordinamento del risultato 3
Trovare il codice dei prodotti e la taglia espressa come taglia
americana, ordinando il risultato in ordine crescente di taglia
SELECT CodP, Taglia-14 AS TagliaUSA
FROM P
ORDER BY TagliaUSA;
P R
CodP NomeP Colore Taglia Magazzino CodP TagliaUSA
P1 Maglia Rosso 40 Torino P5 26
P2 Jeans Verde 48 Milano P1 28
P3 Camicia Blu 48 Roma P6 28
P4 Camicia Blu 44 Torino P4 30
P2 34
P5 Gonna Blu 40 Milano
P6 Bermuda Rosso 42 Torino P3 34

38
Struttura dell’istruzione SELECT 3

SELECT [DISTINCT] ElencoAttributiDaVisualizzare


FROM ElencoTabelleDaUtilizzare
[WHERE CondizioniDiTupla ]
[ORDER BY ElencoAttributiDiOrdinamento ];

45
Join 1

Trovare il nome dei fornitori che forniscono il prodotto P2

46
DB forniture prodotti
FP
CodF CodP Qta
F1 P1 300
F F1 P2 200
CodF NomeF NSoci Sede
F1 Andrea 2 Torino F1 P3 400
F2 Luca 1 Milano F1 P4 200
F3 Antonio 3 Milano F1 P5 100
F4 Gabriele 2 Torino F1 P6 100
F5 Matteo 3 Venezia F2 P1 300
F2 P2 400
F3 P2 200
F4 P3 200
F4 P4 300
F4 P5 400

47
Prodotto cartesiano

Trovare il nome dei fornitori che forniscono il prodotto P2

SELECT NomeF
FROM F, FP ;

48
Prodotto cartesiano
Prodotto cartesiano
F.CodF F.NomeF F.NSoci F.Sede FP.CodF FP.CodP FP.Qta
F1 Andrea 2 Torino F1 P1 300
F1 Andrea 2 Torino F1 P2 200
F1 Andrea 2 Torino F1 P3 400
F1 Andrea 2 Torino F1 P4 200
F1 Andrea 2 Torino F1 P5 100
F1 Andrea 2 Torino F1 P6 100
F1 Andrea 2 Torino F2 P1 300
… … … … … … …
F2 Luca 1 Milano F1 P1 300
… … … … … … …
F2 Luca 1 Milano F2 P1 300
… … … … … … …

50
Join 1
=
F.CodF F.NomeF F.NSoci F.Sede FP.CodF FP.CodP FP.Qta
F1 Andrea 2 Torino F1 P1 300
F1 Andrea 2 Torino F1 P2 200
F1 Andrea 2 Torino F1 P3 400
F1 Andrea 2 Torino F1 P4 200
F1 Andrea 2 Torino F1 P5 100
F1 Andrea 2 Torino F1 P6 100
F1 Andrea 2 Torino F2 P1 300
… … … … … … …
F2 Luca 1 Milano F1 P1 300
… … … … … … …
F2 Luca 1 Milano F2 P1 300
… … … … … … …
51
Notazione punto (.)

● Vi può essere ambiguità nel riferire un attributo attraverso il


nome, ad esempio quando più tabelle hanno attributi con lo
stesso nome
○ Es. R1(A1, A2), R2 (A2, A3)
● In questi casi per associare univocamente gli attributi alle
tabelle è necessario usare la notazione già introdotta in
precedenza nometabella.nomeattributo
Join 1

Trovare il nome dei fornitori che forniscono il prodotto P2


SELECT NomeF
FROM F, FP
WHERE F.CodF=FP.CodF

NomeTabella.NomeAttributo

53
Join 1

Trovare il nome dei fornitori che forniscono il prodotto P2


SELECT NomeF
FROM F, FP Condizione di join
WHERE F.CodF=FP.CodF

54
Join 1
F.CodF F.NomeF F.NSoci F.Sede FP.CodF FP.CodP FP.Qta
F1 Andrea 2 Torino F1 P1 300
F1 Andrea 2 Torino F1 P2 200
F1 Andrea 2 Torino F1 P3 400
F1 Andrea 2 Torino F1 P4 200
F1 Andrea 2 Torino F1 P5 100
F1 Andrea 2 Torino F1 P6 100
F2 Luca 1 Milano F2 P1 300
F2 Luca 1 Milano F2 P2 400
F3 Antonio 3 Milano F3 P2 200
F4 Gabriele 2 Torino F4 P3 200
F4 Gabriele 2 Torino F4 P4 300
F4 Gabriele 2 Torino F4 P5 400

55
Join 1

Trovare il nome dei fornitori che forniscono il prodotto P2


SELECT NomeF
FROM F, FP
WHERE F.CodF=FP.CodF AND CodP='P2';

56
Join 1
FP.CodP='P2'
F.CodF F.NomeF F.NSoci F.Sede FP.CodF FP.CodP FP.Qta
F1 Andrea 2 Torino F1 P1 300
F1 Andrea 2 Torino F1 P2 200
F1 Andrea 2 Torino F1 P3 400
F1 Andrea 2 Torino F1 P4 200
F1 Andrea 2 Torino F1 P5 100
F1 Andrea 2 Torino F1 P6 100
F2 Luca 1 Milano F2 P1 300
F2 Luca 1 Milano F2 P2 400
F3 Antonio 3 Milano F3 P2 200
F4 Gabriele 2 Torino F4 P3 200
F4 Gabriele 2 Torino F4 P4 300
F4 Gabriele 2 Torino F4 P5 400
57
Join 1
F.CodF F.NomeF F.NSoci F.Sede FP.CodF FP.CodP FP.Qta
F1 Andrea 2 Torino F1 P2 200
F2 Luca 1 Milano F2 P2 400
F3 Antonio 3 Milano F3 P2 200

58
Join 1

Trovare il nome dei fornitori che forniscono il prodotto P2


R
NomeF
Andrea
Luca
Antonio

59
Join 1

● Trovare il nome dei fornitori che forniscono il prodotto P2


○ in algebra relazionale
π π
F.NomeF
F.NomeF

σ
CodP=‘P2’
σ
F CodP=‘P2’

FP F FP

60
Join 1

Trovare il nome dei fornitori che forniscono il prodotto P2

SELECT NomeF SELECT NomeF


FROM F, FP FROM F, FP
WHERE F.CodF=FP.CodF WHERE CodP='P2' AND
AND CodP='P2'; F.CodF=FP.CodF;
Il risultato e l’efficienza sono indipendenti
dall’ordine dei predicati nella clausola WHERE

61
Join 1

Trovare il nome dei fornitori che forniscono il prodotto P2

SELECT NomeF SELECT NomeF


FROM F, FP FROM FP, F
WHERE FP.CodF=F.CodF WHERE FP.CodF=F.CodF
AND CodP='P2'; AND CodP='P2';

Il risultato e l’efficienza sono indipendenti dall’ordine delle tabelle


nella clausola FROM

62
Join 1

● Dichiaratività del linguaggio SQL


○ in algebra relazionale si definisce l’ordine in cui sono applicati gli
operatori
○ in SQL l’ordine migliore è scelto dall’ottimizzatore indipendentemente
■ dall’ordine delle condizioni nella clausola WHERE
■ dall’ordine delle tabelle nella clausola FROM

63
Join 2
Trovare il nome dei fornitori che forniscono almeno un prodotto
rosso

SELECT NomeF

FROM F, FP, P
WHEREF.CodF=FP.CodF AND P.CodP=FP.CodP
AND Colore='Rosso';

Clausola FROM con N tabelle


almeno N-1 condizioni di join nella clausola WHERE

64
Ridenominazione

● Si usano Alias per ridenominare le tabelle:


○ Abbreviano riferimento a tabelle
○ Risolvono ambiguità di riferimento
● Si possono fare ridenominazioni su attributi e relazioni con la clausola
AS
○ Esempio: Impiegato as I
● Effetto: nella SELECT il termine Impiegato può essere sostituito da I
● Si può anche omettere AS
○ Esempio: Impiegato I
Join 3
Trovare le coppie di codici dei fornitori tali che entrambi i fornitori abbiano
sede nella stessa città
SELECT FX.CodF, FY.CodF
FROM F AS FX, F AS FY WHERE
FX.Sede=FY.Sede;

F AS FX F AS FY
CodF NomeF NSoci Sede CodF NomeF NSoci Sede
F1 Andrea 2 Torino F1 Andrea 2 Torino
F2 Luca 1 Milano F2 Luca 1 Milano
F3 Antonio 3 Milano F3 Antonio 3 Milano
F4 Gabriele 2 Torino F4 Gabriele 2 Torino
F5 Matteo 3 Venezia F5 Matteo 3 Venezia
66
Join 3
Trovare le coppie di codici dei fornitori tali che entrambi i fornitori abbiano
sede nella stessa città

SELECT FX.CodF, FY.CodF R


FX.CodF FY.CodF
FROM F AS FX, F AS FY F1 F1
WHERE FX.Sede=FY.Sede; F1 F4
F2 F2
F2 F3
● Sono presenti F3 F2
○ coppie di valori uguali permutazioni della F3 F3
stessa F4 F1
F4 F4
○ coppia di valori F5 F5
67
Join 3
Trovare le coppie di codici dei fornitori tali che entrambi i fornitori abbiano
sede nella stessa città

SELECT FX.CodF, FY.CodF R


FX.CodF FY.CodF
FROM F AS FX, F AS FY F1 F1
WHERE FX.Sede=FY.Sede AND F1 F4
F2 F2
FX.CodF <> FY.CodF; F2 F3
F3 F2

Elimina le coppie di valori uguali F3


F4
F3
F1
F4 F4
F5 F5
68
Join 3
Trovare le coppie di codici dei fornitori tali che entrambi i fornitori abbiano
sede nella stessa città

SELECT FX.CodF, FY.CodF R


FX.CodF FY.CodF
FROM F AS FX, F AS FY
F1 F1
WHERE FX.Sede=FY.Sede AND F1 F4
F2 F2
FX.CodF < FY.CodF; F2 F3
F3 F2
Elimina le permutazioni della stessa F3 F3
F4 F1
coppia di valori F4 F4
F5 F5
69
Join 3
Trovare le coppie di codici dei fornitori tali che entrambi i fornitori abbiano
sede nella stessa città

SELECT FX.CodF, FY.CodF


FROM F AS FX, F AS FY
WHERE FX.Sede=FY.Sede AND
FX.CodF < FY.CodF;

R FX.CodF FY.CodF
F1 F4
F2 F3

70
Join: sintassi alternativa

● Join interno detto anche INNER JOIN


● Permette di specificare diversi tipi di join
○ inner join (detto anche join interno)
○ outer join (detto anche join esterno)
● Permette di distinguere
○ condizioni di join
○ condizioni di selezione sulle tuple
● Introdotta in SQL-2
○ recepita solo parzialmente nei prodotti commerciali

71
Join: sintassi alternativa

SELECT [DISTINCT] Attributi


FROM Tabella TipoJoin JOIN Tabella ON
CondizioneDiJoin
[WHERE CondizioniDiTupla];

TipoJoin = < INNER | [FULL | LEFT | RIGHT] OUTER >

72
Outer join
INNER join

Trovare il nome dei fornitori che forniscono almeno un prodotto


rosso

SELECT NomeF
FROM P INNER JOIN FP ON P.CodP=FP.CodP
INNER JOIN F ON F.CodF=FP.CodF
WHERE P.Colore='Rosso';

74
OUTER join

Trovare il codice e il nome dei fornitori insieme al codice dei relativi


prodotti forniti, visualizzando anche i fornitori che non hanno forniture
SELECT F.CodF, NomeF, CodP

FROM F LEFT OUTER JOIN FP ON


F.CodF=FP.CodF;

75
OUTER join
R
F.CodF F.NomeF FP.CodP
F1 Andrea P1
F1 Andrea P2
F1 Andrea P3
F1 Andrea P4
F1 Andrea P5
F1 Andrea P6
F2 Luca P1
F2 Luca P2
F3 Antonio P2
F4 Gabriele P3
F4 Gabriele P4
F4 Gabriele P5
F5 Matteo NULL 76
Limiti dei precedenti operatori

Con i precedenti operatori non possiamo esprimere interrogazioni


che calcolano operatori di aggregazione su un insieme di tuple
Funzioni aggregate

● Una funzione aggregata


○ opera su un insieme di valori
○ produce come risultato un unico valore (aggregato)

78
Funzioni aggregate

● Funzioni aggregate disponibili in SQL-2


○ COUNT: conteggio degli elementi in un attributo
○ SUM: somma dei valori di un attributo
○ AVG: media dei valori di un attributo
○ MAX: massimo valore di un attributo
○ MIN: minimo valore di un attributo

79
Funzioni aggregate

● Una funzione aggregata


○ opera su un insieme di valori
○ produce come risultato un unico valore (aggregato)
○ è indicata nella clausola SELECT

80
Struttura dell’istruzione SELECT (4)

SELECT ElencoFunzioniAggregateDaVisualizzare
FROM ElencoTabelleDaUtilizzare
[WHERE Condizioni DiTupla ]
[ORDER BY ElencoAttributiDiOrdinamento ];

81
Limiti degli operatori aggregati

● Fino a questo momento le funzioni di aggregazione (COUNT,


ecc.) si applicano all’intero risultato della interrogazione.
● Le funzioni di aggregazione possono essere applicate anche a
partizioni delle relazioni, cioè a gruppi di tuple.
Funzioni aggregate

● Una funzione aggregata


○ opera su un insieme di valori
○ produce come risultato un unico valore (aggregato)
○ è indicata nella clausola SELECT
■ non si possono indicare anche attributi non aggregati
■ possono essere richieste più funzioni aggregate
contemporaneamente

83
Funzione COUNT

● Conteggio del numero di elementi di un insieme


○ righe di una tabella
○ valori (eventualmente distinti) di uno o più attributi

● COUNT (<*| [DISTINCT | ALL] ListaAttributi >)

84
Funzione COUNT 1
Trovare il numero di fornitori

SELECT COUNT(*)
FROM F;
F
R
CodF NomeF NSoci Sede
F1 Andrea 2 Torino
F2 Luca 1 Milano
F3 Antonio 3 Milano
5
F4 Gabriele 2 Torino
F5 Matteo 3 Venezia

85
Funzione COUNT 2
Trovare il numero di fornitori che hanno almeno una fornitura
FP
CodF CodP Qta SELECT COUNT(*)
F1 P1 300 FROM FP;
F1 P2 200
F1 P3 400
R
F1 P4 200
F1 P5 100
F1 P6 100 12
F2 P1 300
F2 P2 400
F3 P2 200 Conta il numero di forniture, non
F4 P3 200
F4 P4 300
di fornitori
F4 P5 400 86
Funzione COUNT 2
Trovare il numero di fornitori che hanno almeno una fornitura
FP
CodF CodP Qta SELECT COUNT(CodF)
F1 P1 300 FROM FP;
F1 P2 200
F1 P3 400
F1 P4 200 R
F1 P5 100
F1 P6 100
12
F2 P1 300
F2 P2 400
F3 P2 200 Conta il numero di forniture, non
F4 P3 200
F4 P4 300
di fornitori
F4 P5 400 87
Funzione COUNT 2
Trovare il numero di fornitori che hanno almeno una fornitura
FP
CodF CodP Qta SELECT COUNT(DISTINCT CodF)
F1 P1 300 FROM FP;
F1 P2 200
F1 P3 400
F1 P4 200 R
F1 P5 100
F1 P6 100
4
F2 P1 300
F2 P2 400
F3 P2 200
F4 P3 200 Conta il numero di fornitori diversi
F4 P4 300
88
F4 P5 400
Funzione COUNT

Conteggio del numero di elementi di un insieme


● righe di una tabella
● valori (eventualmente distinti) di uno o più attributi

COUNT (<*| [DISTINCT | ALL] ListaAttributi >)

Se l’argomento della funzione è preceduto da DISTINCT, conta il


numero di valori distinti dell’argomento

89
Funzioni aggregate e WHERE
Trovare il numero di fornitori che forniscono il prodotto P2

FP SELECT COUNT(*)
CodF CodP Qta
FROM FP
F1 P1 300
F1 P2 200 WHERE CodP='P2';
F1 P3 400
F1 P4 200
F1 P5 100
F1 P6 100
CodF CodP Qta R
F1 P2 200
F2 P1 300
F2 P2 400
F2 P2 400 3
F3 P2 200
F3 P2 200
F4 P3 200
F4 P4 300
90
F4 P5 400
Funzioni aggregate e WHERE

Le funzioni aggregate sono valutate solo dopo l’applicazione di tutti i


predicati nella clausola WHERE

91
Funzioni SUM, MAX, MIN, AVG

SUM, MAX, MIN e AVG


ammettono come argomento un attributo o un’espressione
SUM e AVG
ammettono solo attributi di tipo numerico o intervallo di tempo
MAX e MIN
richiedono che l’espressione sia ordinabile possono essere
applicate anche su stringhe di caratteri e istanti di tempo

92
Funzione SUM
Trovare la quantità totale di pezzi forniti per il prodotto P2

FP
CodF CodP Qta SELECT SUM(Qta)
F1 P1 300 FROM FP
F1 P2 200
F1 P3 400 WHERE CodP='P2';
F1 P4 200
F1 P5 100 CodF CodP Qta R
F1 P6 100 F1 P2 200
F2 P1 300
F2 P2 400
F2 P2 400 800
F3 P2 200
F3 P2 200
F4 P3 200
F4 P4 300
93
F4 P5 400
Raggruppamento
Per ogni prodotto, trovare la quantità totale di pezzi forniti
FP
CodF CodP Qta
F1 P1 300
F1 P2 200
F1 P3 400
F1 P4 200
F1 P5 100
F1 P6 100
F2 P1 300
F2 P2 400
F3 P2 200
F4 P3 200
F4 P4 300
94
F4 P5 400
Raggruppamento
Per ogni prodotto, trovare la quantità totale di pezzi forniti
FP FP
CodF CodP Qta CodF CodP Qta
F1 P1 300 F1 P1 300
F1 P2 200 F2 P1 300
F1 P3 400 F1 P2 200
F1 P4 200 F2 P2 400
F1 P5 100 F3 P2 200
F1 P6 100 F1 P3 400
F2 P1 300 F4 P3 200
F2 P2 400 F1 P4 200
F3 P2 200 F4 P4 300
F4 P3 200 F1 P5 100
F4 P4 300 F4 P5 400
95
F4 P5 400 F1 P6 100
Raggruppamento
Per ogni prodotto, trovare la quantità totale di pezzi forniti
FP FP
CodF CodP Qta CodF CodP Qta
F1 P1 300 F1 P1 300
F1 P2 200 F2 P1 300
F1 P3 400 F1 P2 200
F1 P4 200 F2 P2 400
F1 P5 100 F3 P2 200
F1 P6 100 F1 P3 400
F2 P1 300 F4 P3 200
F2 P2 400 F1 P4 200
F3 P2 200 F4 P4 300
F4 P3 200 F1 P5 100
F4 P4 300 F4 P5 400
96
F4 P5 400 F1 P6 100
Raggruppamento
Per ogni prodotto, trovare la quantità totale di pezzi forniti
FP FP
CodF CodP Qta CodF CodP Qta
F1 P1 300 F1 P1 300
F1 P2 200 F2 P1 300
CodP
F1 P3 400 F1 P2 200
P1 600
F1 P4 200 F2 P2 400
F1 P5 100 F3 P2 200
F1 P6 100 F1 P3 400
F2 P1 300 F4 P3 200
F2 P2 400 F1 P4 200
F3 P2 200 F4 P4 300
F4 P3 200 F1 P5 100
F4 P4 300 F4 P5 400
97
F4 P5 400 F1 P6 100
Raggruppamento
Per ogni prodotto, trovare la quantità totale di pezzi forniti
FP FP
CodF CodP Qta CodF CodP Qta
F1 P1 300 F1 P1 300
F1 P2 200 F2 P1 300
CodP
F1 P3 400 F1 P2 200
P1 600
F1 P4 200 F2 P2 400
F1 P5 100 F3 P2 200 P2 800
F1 P6 100 F1 P3 400
F2 P1 300 F4 P3 200
F2 P2 400 F1 P4 200
F3 P2 200 F4 P4 300
F4 P3 200 F1 P5 100
F4 P4 300 F4 P5 400
98
F4 P5 400 F1 P6 100
Raggruppamento
Per ogni prodotto, trovare la quantità totale di pezzi forniti
FP FP
CodF CodP Qta CodF CodP Qta
F1 P1 300 F1 P1 300
F1 P2 200 F2 P1 300
CodP
F1 P3 400 F1 P2 200
P1 600
F1 P4 200 F2 P2 400
F1 P5 100 F3 P2 200 P2 800
F1 P6 100 F1 P3 400 P3 600
F2 P1 300 F4 P3 200
F2 P2 400 F1 P4 200
F3 P2 200 F4 P4 300
F4 P3 200 F1 P5 100
F4 P4 300 F4 P5 400
99
F4 P5 400 F1 P6 100
Raggruppamento
Per ogni prodotto, trovare la quantità totale di pezzi forniti
FP FP
CodF CodP Qta CodF CodP Qta
F1 P1 300 F1 P1 300
F1 P2 200 F2 P1 300
R
CodP
F1 P3 400 F1 P2 200
P1 600
F1 P4 200 F2 P2 400
F1 P5 100 F3 P2 200 P2 800
F1 P6 100 F1 P3 400 P3 600
F2 P1 300 F4 P3 200 P4 500
F2 P2 400 F1 P4 200 P5 500
F3 P2 200 F4 P4 300 P6 100
F4 P3 200 F1 P5 100
F4 P4 300 F4 P5 400
100
F4 P5 400 F1 P6 100
Raggruppamento

Per ogni prodotto, trovare la quantità totale di pezzi forniti

SELECT CodP, SUM(Qta)


FROM FP
GROUP BY CodP;

101
GROUP BY

● Clausola di raggruppamento

GROUP BY ElencoAttributiDiRaggruppamento
● l’ordine degli attributi di raggruppamento è ininfluente
● Nella clausola SELECT possono comparire solo attributi presenti
nella clausola GROUP BY funzioni aggregate

102
GROUP BY e WHERE
Per ogni prodotto, trovare la quantità totale di pezzi forniti da fornitori
con sede a Milano
FP
CodF CodP Qta
F1 P1 300
F CodF NomeF NSoci Sede F1 P2 200
F1 Andrea 2 Torino F1 P3 400
F2 Luca 1 Milano F1 P4 200
F3 Antonio 3 Milano F1 P5 100
F4 Gabriele 2 Torino F1 P6 100
F5 Matteo 3 Venezia F2 P1 300
F2 P2 400
F3 P2 200
F4 P3 200
F4 P4 300
103
F4 P5 400
GROUP BY e WHERE
Per ogni prodotto, trovare la quantità totale di pezzi forniti da fornitori
con sede a Milano
F.CodF F.NomeF F.NSoci F.Sede FP.CodF FP.CodP FP.Qta
F1 Andrea 2 Torino F1 P1 300
F1 Andrea 2 Torino F1 P2 200
F1 Andrea 2 Torino F1 P3 400
F1 Andrea 2 Torino F1 P4 200
F1 Andrea 2 Torino F1 P5 100
F1 Andrea 2 Torino F1 P6 100
F2 Luca 1 Milano F2 P1 300
F2 Luca 1 Milano F2 P2 400
F3 Antonio 3 Milano F3 P2 200
F4 Gabriele 2 Torino F4 P3 200
F4 Gabriele 2 Torino F4 P4 300
104
F4 Gabriele 2 Torino F4 P5 400
GROUP BY e WHERE

Per ogni prodotto, trovare la quantità totale di pezzi forniti da fornitori


con sede a Milano

SELECT CodP, SUM(Qta)


FROM FP, F
WHERE FP.CodF=F.CodF AND Sede='Milano'
GROUP BY CodP;

I prodotti senza forniture non sono inclusi nel


risultato 105
GROUP BY e WHERE

Per ogni prodotto, trovare la quantità totale di pezzi forniti da fornitori


con sede a Milano

FP.CodP FP.Qta
FP.CodP
P1 300 RP1 300
P2 400
P2 600
P2 200

106
GROUP BY e SELECT

Per ogni prodotto, trovare il codice, il nome e la quantità totale fornita


SELECT P.CodP, NomeP, SUM(Qta)
FROM P, FP
WHERE P.CodP=FP.CodP
GROUP BY P.CodP, NomeP

Artificio sintattico
gli attributi univocamente determinati da attributi già presenti nella
clausola GROUP BY possono essere aggiunti senza alterare il
risultato
107
Semantica delle interrogazioni
con operatori aggregati e raggruppamenti
1. Esegui la interrogazione senza tener conto della GROUP BY e
degli operatori aggregati
2. Raggruppa le righe che hanno stessi valori per gli attributi che
compaiono nella listaAttributi della GROUP BY
3. Applica l’operatore aggregato a ciascun gruppo di n-ple
Struttura dell’istruzione SELECT 5

SELECT [DISTINCT] ElencoAttributiDaVisualizzare


FROM ElencoTabelleDaUtilizzare
[WHERE CondizioniDiTupla ]
[GROUP BY ElencoAttributiDiRaggruppamento ] [ORDER
BY ElencoAttributiDiOrdinamento ];

109
Condizione di selezione sui gruppi

● Trovare la quantità totale di pezzi forniti per i prodotti per cui sono
forniti in totale almeno 600 pezzi
○ la condizione è definita su valori aggregati

● Non è possibile utilizzare la clausola WHERE

110
Condizione di selezione sui gruppi 1
Trovare la quantità totale di pezzi forniti per i prodotti per cui
sono forniti in totale almeno 600 pezzi
FP FP
CodF CodP Qta CodF CodP Qta
F1 P1 300 F1 P1 300
F1 P2 200 F2 P1 300
F1 P3 400 F1 P2 200
F1 P4 200 F2 P2 400
CodP
F1 P5 100 F3 P2 200
P1 600
F1 P6 100 F1 P3 400
F2 P1 300 F4 P3 200
F2 P2 400 F1 P4 200
F3 P2 200 F4 P4 300
F4 P3 200 F1 P5 100
F4 P4 300 F4 P5 400
111
F4 P5 400 F1 P6 100
Condizione di selezione sui gruppi 1
Trovare la quantità totale di pezzi forniti per i prodotti per cui sono
forniti in totale almeno 600 pezzi
FP FP
CodF CodP Qta CodF CodP Qta
F1 P1 300 F1 P1 300
F1 P2 200 F2 P1 300
F1 P3 400 F1 P2 200
F1 P4 200 F2 P2 400
CodP
F1 P5 100 F3 P2 200
P1 600
F1 P6 100 F1 P3 400
F4 P3 200 P2 800
F2 P1 300
F2 P2 400 F1 P4 200 P3 600
F3 P2 200 F4 P4 300
F4 P3 200 F1 P5 100
F4 P4 300 F4 P5 400
112
F4 P5 400 F1 P6 100
Condizione di selezione sui gruppi (n.1)
Trovare la quantità totale di pezzi forniti per i prodotti per cui sono
forniti in totale almeno 600 pezzi
FP FP
CodF CodP Qta CodF CodP Qta
F1 P1 300 F1 P1 300
F1 P2 200 F2 P1 300
F1 P3 400 F1 P2 200
F1 P4 200 F2 P2 400
CodP
F1 P5 100 F3 P2 200
P1 600
F1 P6 100 F1 P3 400
F4 P3 200 P2 800
F2 P1 300
F2 P2 400 F1 P4 200 P3 600
F3 P2 200 F4 P4 300
F4 P3 200 F1 P5 100
F4 P4 300 F4 P5 400
113
F4 P5 400 F1 P6 100
Condizione di selezione sui gruppi (n.1)
Trovare la quantità totale di pezzi forniti per i prodotti per cui sono forniti
in totale almeno 600 pezzi
FP FP
CodF CodP Qta CodF CodP Qta
F1 P1 300 F1 P1 300
F1 P2 200 F2 P1 300
F1 P3 400 F1 P2 200
F1 P4 200 F2 P2 400 R
CodP
F1 P5 100 F3 P2 200
P1 600
F1 P6 100 F1 P3 400
F4 P3 200 P2 800
F2 P1 300
F2 P2 400 F1 P4 200 P3 600
F3 P2 200 F4 P4 300
F4 P3 200 F1 P5 100
F4 P4 300 F4 P5 400
114
F4 P5 400 F1 P6 100
Condizione di selezione sui gruppi 1
Trovare la quantità totale di pezzi forniti per i prodotti per cui sono forniti
in totale almeno 600 pezzi
SELECT CodP, SUM(Qta)
FROM FP
GROUP BY CodP
HAVING SUM(Qta)>=600;

La clausola HAVING permette di specificare


condizioni su funzioni aggregate

115
Condizione di selezione sui gruppi 2
Trovare il codice dei prodotti rossi forniti da più di un fornitore

FP
CodF CodP Qta
P F1 P1 300
CodP NomeP Colore Taglia Magazzino F1 P2 200
P1 Maglia Rosso 40 Torino F1 P3 400
P2 Jeans Verde 48 Milano F1 P4 200
P3 Camicia Blu 48 Roma F1 P5 100
P4 Camicia Blu 44 Torino F1 P6 100
P5 Gonna Blu 40 Milano F2 P1 300
P6 Bermuda Rosso 42 Torino F2 P2 400
F3 P2 200
F4 P3 200
F4 P4 300
F4 P5 400
103
Condizione di selezione sui gruppi 2

Trovare il codice dei prodotti rossi forniti da più di un fornitore

SELECT FP.CodP
FROM FP, P
WHERE FP.CodP=P.CodP AND Colore='Rosso'
GROUP BY FP.CodP
HAVING COUNT(*)>1;

117
Condizione di selezione sui gruppi 2
Trovare il codice dei prodotti rossi forniti da più di un fornitore

F.CodF F.CodP F.Qta P.CodP P.NomeP P.Colore P.Taglia P.Magazzino


F1 P1 300 P1 Maglia Rosso 40 Torino
F2 P1 300 P1 Maglia Rosso 40 Torino
F1 P6 100 P6 Bermuda Rosso 42 Torino

R
CodP
P1

118
Struttura dell’istruzione SELECT

SELECT [DISTINCT] ElencoAttributiDaVisualizzare


FROM ElencoTabelleDaUtilizzare
[WHERE CondizioniDiTupla ]
[GROUP BY ElencoAttributiDiRaggruppamento ]
[HAVING CondizioniSuAggregati ]
[ORDER BY ElencoAttributiDiOrdinamento ];

119

Potrebbero piacerti anche