Corso di Laurea in Ingegneria Gestionale
Sapienza Universit di Roma
Corso di Basi di Dati
A.A. 2013/2014
4 SQL : Structured Query Language
Tiziana Catarci, Andrea Marrella
Ultimo aggiornamento : 27/03/2014
SQL : Structured Query Language
SQL non un semplice linguaggio per le interrogazioni...
...ma si divide in 3 sotto-linguaggi principali:
DDL (Data Definition Language) : linguaggio che permette di
creare\eliminare\modificare gli oggetti in un database (tabelle e viste). I comandi
DDL definiscono la struttura del database.
DML (Data Manipulation Language) : linguaggio che permette di
leggere\inserire\modificare\eliminare i dati di un database. Le interrogazioni in
SQL appartengono a DML.
DCL (Data Control Language) : permette di fornire o revocare agli utenti i
permessi necessari per poter utilizzare i comandi di DDL e DML su specifici
oggetti/dati di un database.
Altre componenti: trigger (azioni eseguite dal DBMS che
soddisfano determinate condizioni), SQL dinamico ed embedded,
esecuzione client-server, gestione di transazioni, sicurezza.
2
Basi di Dati 13/14
4 - SQL : Interrogazioni
Interrogazioni in SQL
SQL si basa sia sullalgebra che sul calcolo relazionale, perci esprime
le interrogazioni in modo misto: in parte dichiarativo e in parte
procedurale.
Linterrogazione SQL viene passata allottimizzatore di interrogazioni
(query optimizer), un componente del DBMS che analizza
linterrogazione e ne costruisce una versione equivalente in un
linguaggio procedurale basato sullalgebra relazionale interno al DBMS.
NOTA BENE : Esistono molti modi diversi per esprimere
uninterrogazione in SQL.
Il programmatore dovr effettuare una scelta non basandosi sullefficienza, bens su
caratteristiche come la leggibilit e la modificabilit dellinterrogazione.
Basi di Dati 13/14
4 - SQL : Interrogazioni
SQL : Alcune Notazioni
Notazione utilizzata per specificare la sintassi dei comandi:
Le parentesi quadre [ ] indicano che il termine contenuto al suo
interno opzionale, cio pu non comparire oppure comparire
una sola volta.
Le parentesi graffe { } indicano che il termine racchiuso pu non
comparire o essere ripetuto un numero arbitrario di volte.
Le barre verticali | indicano che deve essere scelto uno tra i
termini separati dalle barre.
Le parentesi tonde ( ) dovranno essere intese sempre come termini
del linguaggio SQL e non come simboli per la definizione della
grammatica.
Basi di Dati 13/14
4 - SQL : Interrogazioni
Sintassi di un interrogazione SQL
SELECT [DISTINCT] listaAttributi
FROM listaTabelle
[WHERE condizione]
Uninterrogazione SQL pu essere valutata analizzando i comandi che la
compongono nel seguente ordine :
1.
2.
3.
listaTabelle = lista delle tabelle su cui calcolare il risultato.
condizione = espressione booleana ottenuta combinando gli operatori di
confronto (<, <=, =, <>, >=, >) e gli operatori logici AND, OR, NOT.
listaAttributi = lista di attributi (presi dalle tabelle contenute in
listaTabelle) che definiscono il risultato dellinterrogazione.
DISTINCT una parola chiave opzionale utile per specificare che il
risultato dellinterrogazione non deve contenere duplicati.
Basi di Dati 13/14
4 - SQL : Interrogazioni
Strategia di valutazione concettuale
SELECT [DISTINCT] listaAttributi
FROM listaTabelle
[WHERE condizione]
Linterrogazione SQL seleziona, tra le righe che appartengono al
prodotto cartesiano delle tabelle elencate nella clausola FROM,
quelle che soddisfano le condizioni espresse nellargomento della
clausola WHERE.
Il risultato di uninterrogazione SQL una tabella (non
necessariamente una relazione matematica!) le cui colonne si
ottengono dalla valutazione delle espressioni cha appaiono nella
clausola SELECT.
6
Basi di Dati 13/14
4 - SQL : Interrogazioni
Per formulare uninterrogazione che coinvolge
tuple appartenenti a pi di una tabella, si pone
come argomento della clausola FROM linsieme
di tabelle alle quali si vuole accedere.
1.Clausola FROM
SELECT DISTINCT Impiegato
FROM Impiegati, Reparti
WHERE Impiegato = Neri
Impiegati
Impiegato
Codice
Rossi
Neri
Bianchi
Reparti
Il risultato parziale consiste nel prodotto
cartesiano delle tabelle elencate nella
clausola FROM.
Impiegati X Reparti
Impiegato
Codice
Capo
Codice
Rossi
Mori
Capo
Codice
Rossi
Bruni
Mori
Neri
Mori
Bruni
Neri
Bruni
Bianchi
Mori
Basi Bianchi
di Dati 13/14
4 - SQL : Interrogazioni
Bruni
B
2.Clausola WHERE
SELECT DISTINCT Impiegato, Codice
FROM Impiegati, Reparti
WHERE Impiegato = Neri
Impiegati X Reparti
Impiegato
Codice
Capo
Codice
Rossi
Mori
Rossi
Bruni
Neri
Mori
Neri
Bruni
Bruni
Bianchi
Mori
Bianchi
Bruni
Basi di Dati 13/14
Sul prodotto cartesiano delle
tabelle elencate nella clausola
FROM verranno applicate le
condizioni contenute nella clausola
WHERE.
4 - SQL : Interrogazioni
La clausola SELECT specifica quali attributi
faranno parte della tabella risultato.
3.Clausola SELECT
SELECT DISTINCT Impiegato
FROM Impiegati, Reparti
WHERE Impiegato = Neri
Impiegati X Reparti
Il risultato di uninterrogazione SQL un
multi-insieme. Se si desidera che la tabella
calcolata non contenga duplicati, si deve
includere la parola chiave DISTINCT.
Impiegato
Codice
Capo
Codice
Rossi
Mori
Rossi
Bruni
Impiegato
Neri
Mori
Neri
Neri
Bruni
Neri
Bianchi
Mori
Bianchi
Bruni
Impiegato
Neri
9
Basi di Dati 13/14
4 - SQL : Interrogazioni
Confronto con Algebra Relazionale:
Proiezione e Select
Impiegato
Nome
Cognome
Dipart
StipAnn
Mario
Rossi
Amministrazione
45
Carlo
Bianchi
Produzione
36
Giuseppe
Rossi
Amministrazione
40
Franco
Neri
Distribuzione
45
Il risultato di uninterrogazione in Algebra
Relazionale una relazione, perci i
duplicati saranno automaticamente scartati
nel risultato. Viceversa, il risultato di
uninterrogazione SQL un multi-insieme.
Affinch la tabella calcolata non contenga
duplicati, si deve includere la parola chiave
DISTINCT.
ESERCIZIO :Estrarre cognome e dipartimento di tutti gli impiegati. Scrivere
linterrogazione sia in Algebra Relazione che in SQL.
Cognome,Dipart
(Impiegato)
SELECT Cognome, Dipart
FROM Impiegati
SELECT DISTINCT Cognome,
Dipart
FROM Impiegati
Cognome
Dipart
Cognome
Dipart
Rossi
Amministrazione
Rossi
Amministrazione
Bianchi
Produzione
Bianchi
Produzione
Rossi
Amministrazione
Neri
10
Distribuzione
Neri
Distribuzione
Cognome
Dipart
Rossi
Amministrazione
Bianchi
Produzione
Neri
Distribuzione
Select con asterisco (*)
Impiegato
Nome
Cognome
Dipart
StipAnn
Mario
Rossi
Amministrazione
45
Carlo
Bianchi
Produzione
36
Giuseppe
Verdi
Amministrazione
40
Franco
Neri
Distribuzione
45
Carlo
Rossi
Direzione
80
Lorenzo
Gialli
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
Come argomento della clausola
SELECT pu anche comparire il
carattere speciale * (asterisco),
che rappresenta la selezione di
tutti gli attributi delle tabelle
elencate nella clausola FROM.
ESERCIZIO :Estrarre tutte le informazioni degli impiegati di cognome Rossi
SELECT *
FROM Impiegato
WHERE Cognome=Rossi
11
Nome
Cognome
Dipart
StipAnn
Mario
Rossi
Amministrazione
45
Carlo
Rossi
Direzione
80
Basi di Dati 13/14
4 - SQL : Interrogazioni
Ogni attributo del risultato pu
essere rinominato con un Alias.
Ridenominazione
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Bianchi
Produzione
36
Produzione
Torino
Giuseppe
Verdi
Amministrazione
40
Distribuzione
Roma
Franco
Neri
Distribuzione
45
Direzione
Milano
Carlo
Rossi
Direzione
80
Ricerca
Milano
Lorenzo
Gialli
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
ESERCIZIO :Estrarre lo Stipendio (e ri-nominarlo come Salario) degli impiegati di
cognome Rossi
Salario
SELECT StipAnn AS Salario
FROM Impiegato
WHERE Cognome=Rossi
12
45
80
NOTA BENE: Se non vi
fossero impiegati di cognome
Rossi, linterrogazione
restituirebbe un insieme vuoto.
AS : operatore di ridenominazione. Consente di
rinominare gli attributi del risultato.
Ridenominazione
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Bianchi
Produzione
36
Produzione
Torino
Giuseppe
Verdi
Amministrazione
40
Distribuzione
Roma
Franco
Neri
Distribuzione
45
Direzione
Milano
Carlo
Rossi
Direzione
80
Ricerca
Milano
Lorenzo
Gialli
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
Nella clausola SELECT possono
comparire generiche espressioni
sul valore degli attributi di
ciascuna riga selezionata.
ESERCIZIO :Estrarre lo stipendio mensile dellimpiegato di cognome Bianchi
SELECT StipAnn/12 AS StipendioMensile
FROM Impiegato
WHERE Cognome=Bianchi
13
Basi di Dati 13/14
StipendioMensile
3
4 - SQL : Interrogazioni
Convenzioni sui nomi
Per evitare ambiguit, ogni nome di attributo composto da
NomeTabella.NomeAttributo
Quando lambiguit non sussiste, si pu omettere la parte
NomeTabella
SELECT persone.nome, persone.reddito
FROM persone
WHERE persone.et<30
si pu scrivere come:
SELECT nome, reddito
FROM persone
WHERE et<30
14
Basi di Dati 13/14
4 - SQL : Interrogazioni
Per evitare ambiguit tra attributi aventi
lo stesso nome in tabelle diverse, si
possono definire variabili di range
nella clausola FROM.
Variabili di range
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Bianchi
Produzione
36
Produzione
Torino
Giuseppe
Verdi
Amministrazione
40
Distribuzione
Roma
Franco
Neri
Distribuzione
45
Direzione
Milano
Carlo
Rossi
Direzione
80
Ricerca
Milano
Lorenzo
Gialli
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
ESERCIZIO :Estrarre i nomi e i cognomi degli
Impiegati e le Citt in cui lavorano.
SELECT I.Nome, Cognome, Citt
FROM Impiegato AS I, Dipartimento AS D
WHERE Dipart=D.Nome
15
Basi di Dati 13/14
Nome
Cognome
Citt
Mario
Rossi
Milano
Carlo
Bianchi
Torino
Giuseppe
Verdi
Milano
Franco
Neri
Roma
Carlo
Rossi
Milano
Lorenzo
Gialli
Milano
Paola
Rosati
Milano
Marco
Franco
Torino
Per specificare variabili di range,
non necessario utilizzare AS.
Variabili di range
SELECT I.Nome, Cognome, Citt
FROM Impiegato as I, Dipartimento as D
WHERE Dipart=D.Nome
SELECT I.Nome, Cognome, Citt
FROM Impiegato I, Dipartimento D
WHERE Dipart=D.Nome
equivale a
Le variabili di range possono essere anche utilizzate per disporre di un duplicato
di una tabella, utile ai fini di uninterrogazione.
ESERCIZIO : Estrarre il cognome degli Impiegati con lo stesso Nome che lavorano in
reparti differenti.
I1
SELECT I1.Cognome,
FROM Impiegato I1, Impiegato I2
WHERE I1.Nome=I2.Nome AND
I1.Reparto <> I2.Reparto
16
Nome
Cognome
Reparto
Mario
Rossi
Mario
Bianchi
Gianni
Verdi
Cognome
Rossi
Bianchi
I2
Nome
Cognome
Reparto
Mario
Rossi
Mario
Bianchi
Gianni
Verdi
4 - SQL : Interrogazioni
La clausola WHERE consente di
costruire unespressione booleana
combinando predicati semplici con gli
operatori AND, OR e NOT.
NOT, AND, OR
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Mario
Rossi
Amministrazione
45
Carlo
Bianchi
Produzione
36
Giuseppe
Verdi
Amministrazione
40
Franco
Neri
Distribuzione
45
Carlo
Rossi
Direzione
80
Lorenzo
Gialli
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
Nome
Citt
Amministrazione
Milano
Produzione
Torino
Distribuzione
Roma
Direzione
Milano
Ricerca
Milano
ESERCIZIO :Estrarre il nome ed il cognome degli Impiegati che lavorano nel
dipartimento Amministrazione ed hanno stipendio maggiore di 70
SELECT Nome,Cognome
FROM Impiegato
WHERE Dipart = Amministrazione
AND StipAnn > 70
Nome
Cognome
4 - SQL : Interrogazioni
ATTENZIONE : in SQL lAND e lOR
hanno la stessa priorit (mentre il NOT
ha priorit maggiore). Conviene
esplicitare lordine di valutazione degli
operatori mediante parentesi .
NOT, AND, OR
Impiegato
Nome
Cognome
Dipart
StipAnn
Mario
Rossi
Amministrazione
45
Carlo
Bianchi
Produzione
36
Giuseppe
Verdi
Amministrazione
40
Nome
Citt
Franco
Neri
Distribuzione
45
Amministrazione
Milano
Carlo
Rossi
Direzione
80
Produzione
Torino
Lorenzo
Gialli
Direzione
73
Distribuzione
Roma
Paola
Rosati
Amministrazione
40
Direzione
Milano
Marco
Franco
Produzione
46
Ricerca
Milano
Dipartimento
ESERCIZIO :Estrarre i nomi degli Impiegati di cognome Rossi che lavorano nei
dipartimenti Amministrazione o Produzione
SELECT Nome
FROM Impiegato
WHERE Cognome=Rossi AND
(Dipart = Amministrazione OR
Dipart = Produzione)
Nome
Mario
4 - SQL : Interrogazioni
Esercizio
Calcolare la tabella ottenuta dalla tabella Persone
selezionando solo quelle persone con reddito tra 20 e 30, e
aggiungendo al risultato un attributo che ha, in ogni tupla,
lo stesso valore dellattributo Reddito.
Mostrare il risultato dellinterrogazione.
Persone
Nome
19
Et
Reddito
Basi di Dati 13/14
4 - SQL : Interrogazioni
Soluzione Esercizio
SELECT nome, et, reddito, reddito AS ancoraReddito
FROM Persone
WHERE Reddito >= 20 AND Reddito <= 30
Nome
20
Et
Reddito
Basi di Dati 13/14
ancoraReddito
4 - SQL : Interrogazioni
SQL mette a disposizione un
operatore LIKE per il
confronto fra stringe.
Operatore LIKE
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Giuseppe
Bianchi
Verdi
Produzione
Amministrazione
36
40
Produzione
Torino
Franco
Franco
Carlo
Carlo
Neri
Neri
Rossi
Rossi
Distribuzione
Distribuzione
Direzione
Direzione
45
45
80
80
Distribuzione
Roma
Direzione
Milano
Lorenzo
Lorenzo
Paola
Paola
Gialli
Gialli
Rosati
Rosati
Direzione
Direzione
Amministrazione
Amministrazione
73
73
40
40
Ricerca
Milano
Marco
Marco
Franco
Franco
Produzione
Produzione
46
46
ESERCIZIO :Estrarre gli Impiegati con un nome che comincia una m e che ha la
coppia di caratteri rc in penultima posizione
SELECT *
FROM Impiegato
WHERE Nome LIKE m%rc_
21
Il carattere _ rappresenta un confronto con un
carattere arbitrario, mentre % rappresenta un
confronto con una stringa di lunghezza
arbitraria (eventualmente nulla).
Basi di Dati 13/14
4 - SQL : Interrogazioni
Gestione dei valori nulli
Impiegato
Nome
Cognome
Dipart
StipAnn
Mario
Rossi
Amministrazione
45
Carlo
Bianchi
Produzione
36
Giuseppe
Verdi
Amministrazione
40
Franco
Neri
Distribuzione
45
Carlo
Rossi
Rossi
Direzione
Direzione
80
Lorenzo
Lorenzo
Gialli
Gialli
Direzione
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Franco
Produzione
Produzione
NULL
Per selezionare o meno i termini con i
valori NULL, SQL fornisce il predicato
IS [NOT] NULL.
Di default, la condizione espressa
nella WHERE vera solo per
valori NON NULLI.
ESERCIZIO :Estrarre gli Impiegati la cui et potrebbe essere maggiore di 70
SELECT *
FROM Impiegato
WHERE Et>70 or Et IS NULL
22
Stessa interrogazione
espressa in algebra
relazionale.
Et>70 OR Et IS NULL (Impiegato)
Basi di Dati 13/14
4 - SQL : Interrogazioni
Esercizio
Calcolare la tabella ottenuta dalla tabella Impiegato
selezionando solo quelli delle filiali di Roma e Milano,
proiettando i dati sullattributo Stipendio, ed aggiungendo
un attributo che ha, in ogni tupla, il valore doppio
dellattributo Stipendio.
Mostrare il risultato dellinterrogazione.
Impiegato
Matricola
23
Cognome
Basi di Dati 13/14
Filiale
Stipendio
4 - SQL : Interrogazioni
Soluzione Esercizio
SELECT Stipendio, Stipendio*2 AS StipendioBIS
FROM Impiegati
WHERE Filiale = Milano OR Filiale = Roma
Stipendio
24
StipendioBIS
Basi di Dati 13/14
4 - SQL : Interrogazioni
Interpretazione formale delle interrogazioni SQL
E possibile costruire una corrispondenza tra le interrogazioni
SQL ed equivalenti interrogazioni espresse in algebra relazionale.
Date le tabelle: R1(A1,A2) e R2(A3,A4)
la semantica della query :
SELECT R1.A1, R2.A4
FROM R1, R2
WHERE R1.A2 = R2.A3
Sarebbe possibile mostrare una
tecnica per tradurre ogni
interrogazione SQL in
unequivalente interrogazione
in algebra relazionale.
si pu descrivere in termini di :
prodotto cartesiano (from)
selezione (where)
proiezione (select)
25
R2) )
A1,A4 (A2=A3(R1
Basi di Dati 13/14
4 - SQL : Interrogazioni
Esercizio
Si supponga di disporre di una tabella Persone e di una
tabella Paternit. Sia lattributo Padre che lattributo
Figlio sono legati da un vincolo di foreign key verso
Persone.nome.
Mostrare in SQL e in Algebra Relazionale i padri di
persone che guadagnano pi di 20 milioni.
Persone
Paternit
Nome
26
Reddito
Basi di Dati 13/14
Padre
Figlio
4 - SQL : Interrogazioni
Soluzione Esercizio
Persone
Paternit
Nome
Reddito
Padre
Figlio
SELECT DISTINCT Paternit.Padre
FROM Persone, Paternit
WHERE Paternit.Figlio = Persone.Nome AND
Persone.Reddito > 20
27
Padre (paternit
figlio=nome
(reddito>20(persone)) )
Basi di Dati 13/14
4 - SQL : Interrogazioni
Esercizio
Si supponga di disporre di una tabella Persone, di una
tabella Paternit e di una tabella Maternit. Lattributo
padre e lattributo figlio della tabella Paternit,
lattributo madre e lattributo figlio della tabella
Maternit sono legati da un vincolo di foreign key verso
Persone.nome.
Mostrare in SQL e in Algebra Relazionale i padri e le
madri di ogni persona.
Persone
nome
28
Paternit
reddito
padre
Maternit
figlio
Basi di Dati 13/14
madre
figlio
4 - SQL : Interrogazioni
Soluzione Esercizio
Persone
Paternit
nome
reddito
Maternit
padre
figlio
madre
SELECT DISTINCT paternit.figlio, padre, madre
FROM Maternit, Paternit
WHERE Paternit.figlio = Maternit.figlio
29
(paternit
figlio
I JOIN (e i prodotti
cartesiani) si realizzano
indicando due o pi
tabelle nella clausola
FROM.
maternit)
Basi di Dati 13/14
4 - SQL : Interrogazioni
Esercizio
Si supponga di disporre di una tabella Persone e di una
tabella Paternit. Sia lattributo Padre che lattributo
Figlio sono legati da un vincolo di foreign key verso
Persone.Nome.
Mostrare in SQL le persone che guadagnano pi dei
rispettivi padri, mostrando nome e reddito della persone e
reddito del padre.
Persone
Paternit
Nome
30
Reddito
Basi di Dati 13/14
Padre
Figlio
4 - SQL : Interrogazioni
Soluzione Esercizio
Persone
Paternit
Nome
Reddito
Padre
Figlio
SELECT f.Nome, f.Reddito, p.Reddito
FROM Persone p, Paternit t, Persone f
WHERE p.Nome = t.Padre AND
t.Figlio = f.Nome AND
f.Reddito>p.Reddito
31
Basi di Dati 13/14
4 - SQL : Interrogazioni
JOIN Esplicito
Una sintassi alternativa per la specifica dei JOIN permette di
distinguere, tra le condizioni che compaiono nellinterrogazione,
quelle che rappresentano condizioni di JOIN e quelle che
rappresentano condizioni di selezioni fra le righe.
SELECT [DISTINCT] listaAttributi
FROM Tabella {JOIN AltraTabella ON CondDiJoin}
[WHERE altraCondizione]
Mediante questa sintassi la condizione di JOIN non compare
come argomento della clausola WHERE, ma viene spostata invece
nellambito della clausola FROM, associata alle tabelle che vengono
coinvolte nel JOIN.
32
Basi di Dati 13/14
4 - SQL : Interrogazioni
JOIN Esplicito - Esempio
Mostrare in SQL i padri e le madri di ogni persona.
Persone
nome
Paternit
reddito
padre
Maternit
figlio
madre
figlio
SELECT DISTINCT paternit.figlio, padre, madre
FROM Maternit, Paternit
A differenza dellAlgebra
WHERE Paternit.figlio = Maternit.figlio
Relazionale, in questo caso
vengono mantenuti nel
risultato tutti gli attributi su
cui viene valutato il JOIN.
SELECT DISTINCT paternit.figlio, padre, madre
FROM Maternit JOIN Paternit ON Paternit.figlio = Maternit.figlio
33
Basi di Dati 13/14
4 - SQL : Interrogazioni
JOIN Esplicito - Esempio
Mostrare in SQL le persone che guadagnano pi dei rispettivi
padri, evidenziando nome e reddito della persone e reddito del
padre.
Persone
nome
Paternit
reddito
padre
figlio
SELECT f.nome, f.reddito, p.reddito
FROM Persone p, Paternit t, Persone f
WHERE p.nome = t.padre AND t.figlio = f.nome AND f.reddito>p.reddito
SELECT DISTINCT paternit.figlio, padre, madre
FROM Persone p JOIN Paternit t ON p.nome = t.padre
JOIN Persone f ON t.figlio=f.nome
WHERE f.reddito>p.reddito
34
Basi di Dati 13/14
4 - SQL : Interrogazioni
JOIN Naturale
In SQL possibile esprimere anche la condizione di JOIN
naturale, anche se un comando poco diffuso.
Paternit
padre
Maternit
figlio
madre
figlio
SELECT DISTINCT paternit.figlio, padre, madre
FROM Maternit NATURAL JOIN Paternit
35
Basi di Dati 13/14
(paternit
SELECT DISTINCT paternit.figlio, padre, madre
FROM Maternit, Paternit
WHERE Paternit.figlio = Maternit.figlio
maternit)
Come nel JOIN naturale
dellAlgebra Relazionale, viene
mantenuto nel risultato solo
uno degli attributi su cui viene
valutato il JOIN.
4 - SQL : Interrogazioni
JOIN Esterni
La caratteristica delloperatore di JOIN di tralasciare le tuple di una tabella
che non hanno controparte nellaltra.
In alcuni casi ci pu portare ad omettere informazioni rilevanti.
Alcune tuple vengono
tagliate fuori dal JOIN.
Il join esterno estende, con valori nulli, le tuple che verrebbero tagliate fuori da un
join (interno). Esiste in tre versioni:
sinistro: mantiene tutte le tuple del primo operando, estendendole con valori nulli, se
necessario
destro: ... del secondo operando ...
completo: di entrambi gli operandi ...
36
Basi di Dati 13/14
4 - SQL : Interrogazioni
JOIN Esterno Sinistro
Mantiene tutte le tuple
del primo operando,
estendendole con valori
nulli, se necessario.
SELECT Impiegato, Reparto, Capo
FROM Impiegati I LEFT JOIN Reparti R
ON I.Reparto = R.Reparto
37
Basi di Dati 13/14
4 - SQL : Interrogazioni
JOIN Esterno Destro
Mantiene tutte le tuple del
secondo operando,
estendendole con valori
nulli, se necessario.
SELECT Impiegato, Reparto, Capo
FROM Impiegati I RIGHT JOIN Reparti R
ON I.Reparto = R.Reparto
38
Basi di Dati 13/14
4 - SQL : Interrogazioni
JOIN Esterno Completo
Mantiene tutte le tuple di
entrambi gli operandi,
estendendole con valori
nulli, se necessario.
SELECT Impiegato, Reparto, Capo
FROM Impiegati I FULL JOIN Reparti R
ON I.Reparto = R.Reparto
39
Basi di Dati 13/14
4 - SQL : Interrogazioni
Il comando ORDER BY
Una tabella costituita da un insieme non ordinato di tuple.
Nelluso reale delle basi di dati sorge spesso il bisogno di
costruire un ordine sulle righe delle tabelle.
SQL permette di specificare un ordinamento sulle righe del
risultato di uninterrogazione tramite la clausola ORDER BY
ORDER BY AttrDiOrdinamento [ASC|DESC]
{, AttrDiOrdinamento [ASC|DESC] }
40
le righe vengono ordinate in base al primo attributo nellelenco;
per righe che hanno lo stesso valore dellattributo, si considerano i
valori degli attributi successivi in sequenza;
lordine degli attributi pu essere ascendente o discendente, a seconda
che si usi il qualificatore ASC o DESC (se il qualificatore omesso, si
asSUMe un ordinamento ASC).
Basi di Dati 13/14
4 - SQL : Interrogazioni
ORDER BY
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Bianchi
Produzione
36
Produzione
Torino
Giuseppe
Verdi
Amministrazione
40
Distribuzione
Roma
Franco
Neri
Distribuzione
45
Direzione
Milano
Carlo
Rossi
Direzione
80
Ricerca
Milano
Lorenzo
Gialli
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
ESERCIZIO :Estrarre nome e cognome degli impiegati che
Ordinamento ascendente
per Nome e Cognome.
Prima vengono ordinati i
valori contenuti in Nome.
lavorano in Amministrazione, in ordine alfabetico di nome e cognome
SELECT Nome,Cognome
FROM Impiegato
WHERE Dipart=Amministrazione
ORDER BY Nome, Cognome
41
Nome
Cognome
Giuseppe
Verdi
Mario
Rossi
Paola
Rosati
Basi di Dati 13/14
Successivamente,
per tuple che hanno
lo stesso valore in
Nome, si ordinano i
valori di Cognome.
Operatori Aggregati
Gli operatori aggregati costituiscono una delle pi importanti
estensioni di SQL rispetto allAlgebra Relazionale.
In Algebra Relazionale tutte le condizioni vengono valutate su
una tupla alla volta, indipendentemente da tutte le altre.
Spesso nei contesti reali viene per richiesto di valutare
propriet che dipendono da insiemi di tuple.
SQL permette di inserire nelle espressioni della clausola
SELECT espressioni che calcolano valori a partire da insiemi
di tuple.
42
conteggio, minimo, massimo, media, totale
Basi di Dati 13/14
4 - SQL : Interrogazioni
Operatori aggregati
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Bianchi
Produzione
36
Produzione
Torino
Giuseppe
Verdi
Amministrazione
40
Distribuzione
Roma
Franco
Neri
Distribuzione
45
Direzione
Milano
Carlo
Rossi
Direzione
80
Ricerca
Milano
Lorenzo
Gialli
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
ESERCIZIO :Estrarre il numero di Impiegati del dipartimento Produzione
SELECT count(*)
FROM Impiegato
WHERE Dipart = Produzione
43
count(*)
2
count : operatore aggregato di conteggio. Conta
quante tuple soddisfano le condizioni inserite
nella clausola WHERE.
Operatori aggregati come gestirli
Gli operatori aggregati vengono gestiti come unestensione alle normali
interrogazioni.
Prima di tutto viene normalmente eseguita linterrogazione, considerando solo le parti
FROM e WHERE.
Loperatore aggregato viene poi applicato alla tabella contenente il risultato
dellinterrogazione.
ESEMPIO : Estrarre il numero di Impiegati del dipartimento Produzione
Prima si costruisce la tabella che contiene tutte le
righe di Impiegato che hanno Produzione come
valore dellattributo Dipart.
Nome
Cognome
Dipart
StipAnn
Carlo
Bianchi
Produzione
36
Marco
Franco
Produzione
46
SELECT count(*)
FROM Impiegato
WHERE Dipart = Produzione
Successivamente si conta il numero di righe che compongono la tabella (in questo
caso 2).
44
Basi di Dati 13/14
4 - SQL : Interrogazioni
Operatore Count - Sintassi
count (*) | ( [DISTINCT|ALL] ListaAttributi )
45
Lopzione * restituisce il numero di righe.
Lopzione DISTINCT restituisce il numero di diversi valori
contenuti in ListaAttributi.
Lopzione ALL (considerata di default) restituisce invece il
numero di tuple di ListaAttributi che possiedono valori
diversi da NULL.
Basi di Dati 13/14
4 - SQL : Interrogazioni
Operatori aggregati
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Bianchi
Produzione
36
Produzione
Torino
Giuseppe
Verdi
Amministrazione
40
Distribuzione
Roma
Franco
Neri
Distribuzione
45
Direzione
Milano
Carlo
Rossi
Direzione
80
Ricerca
Milano
Lorenzo
Gialli
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
ESERCIZIO : Estrarre il numero di diversi valori dellattributo Stipendio fra tutte le
righe di Impiegato
SELECT count(DISTINCT StipAnn)
FROM Impiegato
46
In questo caso si conta il numero di diversi valori
dellattributo StipAnn.
Basi di Dati 13/14
count(distinct StipAnn)
6
4 - SQL : Interrogazioni
Operatori aggregati
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Bianchi
Produzione
36
Produzione
Torino
Giuseppe
Verdi
Amministrazione
40
Distribuzione
Roma
Franco
Neri
Distribuzione
45
Direzione
Milano
Carlo
Rossi
Direzione
80
Ricerca
Milano
Lorenzo
Gialli
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
ESERCIZIO : Trovare il numero della persone che hanno sia il nome che il cognome
specificato
SELECT count(ALL Nome, Cognome) AS Tutti
FROM Impiegato
47
Basi di Dati 13/14
Tutti
8
4 - SQL : Interrogazioni
Count e valori NULL
NULL
48
Basi di Dati 13/14
4 - SQL : Interrogazioni
Altri operatori aggregati
SUM|AVG|MAX|MIN ( [DISTINCT|ALL] AttrEspr )
ammettono come argomento un attributo o unespressione
(ma non lasterisco *)
ignorano i valori NULL
SUM : restituisce la somma dei valori posseduti
dallespressione.
AVG: restituisce la media dei valori
accetta argomenti numerici o tempo.
accetta argomenti numerici o tempo.
MAX e MIN: restituiscono rispettivamente il valore massimo e
minimo di attributi su cui definito un ordinamento.
49
Basi di Dati 13/14
4 - SQL : Interrogazioni
Loperatore SUM
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Bianchi
Produzione
36
Produzione
Torino
Giuseppe
Verdi
Amministrazione
40
Distribuzione
Roma
Franco
Neri
Distribuzione
45
Direzione
Milano
Carlo
Rossi
Direzione
80
Lorenzo
Gialli
Direzione
73
Ricerca
Milano
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
ESERCIZIO :Estrarre la somma degli Stipendi del dipartimento Amministrazione
SELECT SUM(StipAnn)
FROM Impiegato
WHERE Dipart = Amministrazione
50
Basi di Dati 13/14
SUM(StipAnn)
125
4 - SQL : Interrogazioni
Loperatore MAX
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Bianchi
Produzione
36
Produzione
Torino
Giuseppe
Verdi
Amministrazione
40
Distribuzione
Roma
Franco
Neri
Distribuzione
45
Direzione
Milano
Carlo
Rossi
Direzione
80
Ricerca
Milano
Lorenzo
Gialli
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
ESERCIZIO :Estrarre il massimo stipendio tra quelli degli impiegati che lavorano in
un dipartimento con sede a Milano
SELECT MAX(StipAnn)
FROM Impiegato, Dipartimento D
WHERE Dipart = D.Nome and Citt=Milano
51
Basi di Dati 13/14
MAX(StipAnn)
80
4 - SQL : Interrogazioni
Combinare operatori aggregati
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Bianchi
Produzione
36
Produzione
Torino
Giuseppe
Verdi
Amministrazione
40
Distribuzione
Roma
Franco
Neri
Distribuzione
45
Direzione
Milano
Carlo
Rossi
Direzione
80
Ricerca
Milano
Lorenzo
Gialli
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
ESERCIZIO :Estrarre gli stipendi minimo, massimo e medio fra quelli di tutti gli
impiegati
SELECT MAX(StipAnn),
MIN(StipAnn),
AVG(StipAnn)
FROM Impiegato
52
MAX(StipAnn)
MIN(StipAnn)
AVG(StipAnn)
80
36
51
Basi di Dati 13/14
4 - SQL : Interrogazioni
ATTENZIONE
ATTENZIONE = Questa interrogazione corretta?
SELECT Nome,Cognome, MAX(StipAnn)
FROM Impiegato
WHERE Dipart=Amministrazione
ORDER BY Nome, Cognome
NO gli operatori aggregati non
rappresentano un meccanismo di
selezione, ma solo funzioni che
restituiscono un valore quando sono
applicate ad un insieme di righe.
Potrebbe sorgere lesigenza di
applicare loperatore aggregato a
sotto-insiemi di righe...in questi casi
si utilizza la clausola GROUP BY,
che permette di specificare come
dividere la tabella in sotto-insiemi
aventi caratteristiche comuni.
53
Basi di Dati 13/14
4 - SQL : Interrogazioni
Interrogazioni con raggruppamento
GROUP BY listaAttributi
Abbiamo caratterizzato gli operatori aggregati come operatori
che vengono applicati su tutte le righe che vengono prodotte
come risultato dellinterrogazione.
Spesso sorge lesigenza di applicare loperatore aggregato
separatamente a sottoinsiemi di righe.
SQL mette a disposizione la clausola GROUP BY, che permette
di specificare come dividere la tabella in sottoinsiemi.
54
Basi di Dati 13/14
4 - SQL : Interrogazioni
GROUP BY
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Bianchi
Produzione
36
Produzione
Torino
Giuseppe
Verdi
Amministrazione
40
Distribuzione
Roma
Franco
Neri
Distribuzione
45
Direzione
Milano
Carlo
Rossi
Direzione
80
Ricerca
Milano
Lorenzo
Gialli
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
ESERCIZIO :Estrarre la somma degli stipendi degli impiegati che lavorano nello
stesso dipartimento
SELECT Dipart, SUM(StipAnn)
FROM Impiegato
GROUP BY Dipart
55
Dipart
SUM(StipAnn)
Amministrazione
125
Produzione
82
Distribuzione
45
Direzione
153
GROUP BY come gestirla 1\2
La clausola GROUP BY ammette come argomento un insieme di attributi, e
raggruppa le righe che possiedono gli stessi valori per questo insieme di attributi.
Se nella SELECT presente un operatore aggregato, solo gli attributi contenuti nella
GROUP BY potranno eventualmente comparire nella SELECT stessa (insieme
alloperatore aggregato)
ESEMPIO : Estrarre la somma degli stipendi degli impiegati che lavorano
nello stesso dipartimento
SELECT Dipart, SUM(StipAnn)
FROM Impiegato
GROUP BY Dipart
1) Linterrogazione viene eseguita come se la clausola
GROUP BY e loperatore aggregato non esistessero.
Nel caso dellesempio in esame la prima interrogazione
asSUMerebbe la forma seguente :
SELECT Dipart, StipAnn
FROM Impiegato
56
Basi di Dati 13/14
Dipart
StipAnn
Amministrazione
45
Produzione
36
Amministrazione
40
Distribuzione
45
Direzione
80
Direzione
73
Amministrazione
40
Produzione
46
GROUP BY come gestirla 2\2
2) La tabella ottenuta viene poi analizzata, dividendo le righe
in insiemi caratterizzati dallo stesso valore degli attributi
che compaiono come argomento nella clausola GROUP BY.
Nellesempio le righe vengono raggruppate in base allo
stesso valore dellattributo Dipart.
Dipart
StipAnn
Amministrazione
45
Amministrazione
40
Amministrazione
40
Produzione
46
Produzione
36
Direzione
80
Direzione
73
Distribuzione
45
SELECT Dipart, StipAnn
FROM Impiegato
GROUP BY Dipart
3) Dopo che le righe sono state raggruppate in sotto-insiemi, loperatore aggregato viene
applicato separatamente su ogni sotto-insieme. Il risultato dellinterrogazione costituito
da una tabella con righe che contengono lesito della valutazione delloperatore aggregato
affiancato al valore dellattributo che stato usato per laggregazione.
SELECT Dipart, SUM(StipAnn)
FROM Impiegato
GROUP BY Dipart
57
Basi di Dati 13/14
Dipart
SUM(StipAnn)
Amministrazione
125
Produzione
82
Distribuzione
45
Direzione
153
GROUP BY e operatori aggregati
57
Basi di Dati 13/14
4 - SQL : Interrogazioni
GROUP BY e operatori aggregati
GROUP BY con pi attributi
SELECT Dipart, count(StipAnn)
FROM Impiegato
GROUP BY Dipart, count(StipAnn)
StipAnn
Amministrazione
45
Amministrazione
40
Amministrazione
40
Produzione
46
Dipart
SUM(StipAnn)
Produzione
36
Amministrazione
Direzione
80
Produzione
Direzione
73
Distribuzione
Distribuzione
45
Direzione
Dipart
StipAnn
Amministrazione
45
Amministrazione
40
Amministrazione
40
Produzione
46
Produzione
36
Direzione
80
Direzione
73
Distribuzione
45
SELECT Dipart, StipAnn, count(StipAnn)
FROM Impiegato
GROUP BY Dipart, StipAnn
Dipart
StipAnn
count(StipAnn)
Amministrazione
45
Amministrazione
40
Produzione
46
Produzione
36
Direzione
80
Direzione
73
45
60
Dipart
Distribuzione
HAVING condizioni sui gruppi
58
Basi di Dati 13/14
4 - SQL : Interrogazioni
Clausola HAVING
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Bianchi
Produzione
36
Giuseppe
Verdi
Amministrazione
40
Produzione
Torino
Franco
Neri
Distribuzione
45
Distribuzione
Roma
Carlo
Rossi
Direzione
80
Direzione
Milano
Lorenzo
Gialli
Direzione
73
Ricerca
Milano
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
ESERCIZIO :Estrarre i dipartimenti che spendono
pi di 100mila euro in stipendi
SELECT Dipart,SUM(StipAnn) AS
Sommastipendi
FROM Impiegato
GROUP BY Dipart
62
HAVING
SUM(StipAnn)>100
Dipart
Sommastipendi
Amministrazione
125
Direzione
153
HAVING = condizione di selezione sui gruppi. Ogni
sotto-insieme di righe costruito dalla GROUP BY fa
parte del risultato dellinterrogazione solo se
SQL : soddisfatto.
Interrogazioni
largomento della HAVING4 -risulta
Clausola HAVING
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Bianchi
Produzione
36
Produzione
Torino
Giuseppe
Verdi
Amministrazione
40
Distribuzione
Roma
Franco
Neri
Distribuzione
45
Direzione
Milano
Carlo
Rossi
Direzione
80
Ricerca
Milano
Lorenzo
Gialli
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
ESERCIZIO :Estrarre i dipartimenti per cui la media degli stipendi degli impiegati
che si chiamano Rossi superiore a 25 mila euro
SELECT Dipart
FROM Impiegato
WHERE Cognome=Rossi
GROUP BY Dipart
HAVING AVG(StipAnn)>25
Dipart
Amministrazione
Direzione
E preferibile che solo gli
operatori aggregati siano
usati come argomento della
clausola HAVING.
Le condizioni sugli attributi
dovrebbero essere posti nella
4 - SQL
: Interrogazioni
clausola
WHERE.
Sintassi Completa di uninterrogazione SQL
SELECT [DISTINCT] lista-select
FROM lista-from
[WHERE condizione]
[GROUP BY lista gruppo]
[HAVING qualificazione gruppo]
[ORDER BY AttrDiOrdinamento]
64
Basi di Dati 13/14
4 - SQL : Interrogazioni
Esercizio
Si supponga di disporre di una tabella Persone e di una
tabella Paternit. Sia lattributo padre che lattributo
figlio sono legati da un vincolo di foreign key verso
Persone.nome.
Mostrare in SQL i padri i cui figli sotto i 30 anni hanno un
reddito medio maggiore di 20.
Persone
Paternit
nome
65
et
reddito
Basi di Dati 13/14
padre
figlio
4 - SQL : Interrogazioni
Soluzione Esercizio
Persone
Paternit
nome
et
reddito
padre
figlio
SELECT padre, AVG(reddito)
FROM Persone f JOIN paternit ON figlio=nome
WHERE f.et < 30
GROUP BY padre
HAVING AVG(f.reddito) > 20
66
Basi di Dati 13/14
4 - SQL : Interrogazioni
Unione
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Bianchi
Produzione
36
Produzione
Torino
Giuseppe
Verdi
Amministrazione
40
Distribuzione
Roma
Franco
Neri
Distribuzione
45
Direzione
Milano
Carlo
Rossi
Direzione
80
Ricerca
Milano
Lorenzo
Gialli
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
Nome
ESERCIZIO :Estrarre i nomi ed i cognomi degli
Mario
impiegati in una tabella con un solo attributo
Carlo
...
SELECT Nome
FROM Impiegato
UNION
SELECT Cognome
FROM Impiegato
Rossi
Se si vogliono
mantenere i
duplicati si
utilizza
UNION ALL.
Contiene la lista di tutti
i nomi pi tutti i
cognomi (senza i
duplicati). Infatti, di
default, gli operatori
insiemistici eliminano
i duplicati.
Bianchi
...
4 - SQL : Interrogazioni
Intersezione
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Bianchi
Produzione
36
Produzione
Torino
Giuseppe
Verdi
Amministrazione
40
Distribuzione
Roma
Franco
Neri
Distribuzione
45
Direzione
Milano
Carlo
Rossi
Direzione
80
Ricerca
Milano
Lorenzo
Gialli
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
LIntersezione insiemistica non
supportata nativamente da molti
DBMS...ma facilmente ottenibile
tramite interrogazioni
nidificate...dettagli in futuro!
ESERCIZIO :Estrarre i nomi degli impiegati
che sono anche cognomi
SELECT Nome
FROM Impiegato
INTERSECT
SELECT Cognome
FROM Impiegato
Nome
Franco
4 - SQL : Interrogazioni
Differenza
Impiegato
Dipartimento
Nome
Cognome
Dipart
StipAnn
Nome
Citt
Mario
Rossi
Amministrazione
45
Amministrazione
Milano
Carlo
Bianchi
Produzione
36
Produzione
Torino
Giuseppe
Verdi
Amministrazione
40
Distribuzione
Roma
Franco
Neri
Distribuzione
45
Direzione
Milano
Carlo
Rossi
Direzione
80
Ricerca
Milano
Lorenzo
Gialli
Direzione
73
Paola
Rosati
Amministrazione
40
Marco
Franco
Produzione
46
ESERCIZIO :Estrarre i nomi degli Impiegati
che non sono Cognomi per qualche impiegato
SELECT Nome
FROM Impiegato
EXCEPT
SELECT Cognome
FROM Impiegato
La Differenza insiemistica non
supportata nativamente da
molti DBMS...ma facilmente
ottenibile tramite interrogazioni
Nome nidificate...dettagli in futuro!
Mario
Carlo
Giuseppe
Lorenzo
Paola
Marco
4 - SQL : Interrogazioni
Conclusioni
La nascita di SQL ha rappresentato un fattore importante
nel rapido sviluppo del modello relazionale.
Relazionalmente completo; di fatto, possiede un potere
espressivo significativamente superiore allalgebra
relazionale.
Esistono molti modi alternativi di scrivere
uninterrogazione; lottimizzatore dovrebbe cercare il
piano di valutazione pi efficiente.
Nella pratica, gli utenti devono essere consci di come le
interrogazioni sono ottimizzate e valutate per ottenere
risultati migliori.
68
Basi di Dati 13/14
4 - SQL : Interrogazioni
Esercizi di riepilogo
Persone
Genitori
Nome
Reddito
Et
Sesso
Mario
15
80
Carlo
25
24
Giuseppe
30
45
Maria
76
43
Gianni
60
50
Francesca
18
26
Paola
45
60
Marco
80
35
Figlio
Genitore
Paola
Mario
Marco
Paola
Carlo
Gianni
Carlo
Maria
Francesca
Giuseppe
Marco
Giuseppe
RISOLVERE UTILIZZANDO ESCLUSIVAMENTE I
COSTRUTTI FINO AD ORA ANALIZZATI
71
Basi di Dati 13/14
4 - SQL : Interrogazioni
Esercizio 1 1\7
Persone
Genitori
Nome
Reddito
Et
Sesso
Mario
15
80
Carlo
25
24
Giuseppe
30
45
Maria
76
43
Gianni
60
50
Francesca
18
26
Paola
45
60
Marco
80
35
Figlio
Genitore
Paola
Mario
Marco
Paola
Carlo
Gianni
Carlo
Maria
Francesca
Giuseppe
Marco
Giuseppe
ESERCIZIO : Estrarre i nonni di ogni persona
SELECT P.Figlio AS Nipote, N.Genitore AS Nonno
FROM Genitori P, Genitori N
WHERE P.Genitore = N.Figlio
72
Basi di Dati 13/14
Nipote
Nonno
Marco
Mario
4 - SQL : Interrogazioni
Esercizio 1 2\7
ESERCIZIO : Estrarre i nonni di ogni persona
SELECT P.Figlio AS Nipote, N.Genitore AS Nonno
FROM Genitori P, Genitori N
WHERE P.Genitore = N.Figlio
P
N
Figlio
Genitore
Figlio
Genitore
Paola
Mario
Paola
Mario
Marco
Paola
Marco
Paola
Carlo
Gianni
Carlo
Gianni
Carlo
Maria
Carlo
Maria
Francesca
Giuseppe
Francesca
Giuseppe
Marco
Giuseppe
Marco
Giuseppe
73
Vengono definite due variabili di
range per la tabella Genitore. In
pratica come se si avessero a
disposizione due tabelle
Genitore identiche (P ed N).
4 - SQL : Interrogazioni
Esercizio 1 3\7
ESERCIZIO : Estrarre i nonni di ogni persona
SELECT P.Figlio AS Nipote, N.Genitore AS Nonno
FROM Genitori P, Genitori N
WHERE P.Genitore = N.Figlio
Si effettua un equi-join tra P e N,
utilizzando come condizione di
uguaglianza gli attributi P.Genitore e
N.Figlio.
Il primo valore di P.Genitore
(=Mario) non soddisfa lequi-join
con nessuna tupla di N (in particolare
con nessun valore di N.Figlio).
N
Figlio
Genitore
Figlio
Genitore
Paola
Mario
Paola
Mario
Marco
Paola
Marco
Paola
Carlo
Gianni
Carlo
Gianni
Carlo
Maria
Carlo
Maria
Francesca
74
Marco
Giuseppe
Francesca
Giuseppe
Giuseppe
Marco
Giuseppe
4 - SQL : Interrogazioni
Esercizio 1 4\7
ESERCIZIO : Estrarre i nonni di ogni persona
SELECT P.Figlio AS Nipote, N.Genitore AS Nonno
FROM Genitori P, Genitori N
WHERE P.Genitore = N.Figlio
Il secondo valore di P.Genitore
(=Paola) soddisfa lequi-join solo
con la prima tupla di N.
La tupla
(Marco,Paola,Paola,Mario)
far parte della tabella ottenuta come
equi-join tra P ed N).
N
Figlio
Genitore
Figlio
Genitore
Paola
Mario
Paola
Mario
Marco
Paola
Marco
Paola
Carlo
Gianni
Carlo
Gianni
Carlo
Maria
Carlo
Maria
Francesca
75
Marco
Giuseppe
Francesca
Giuseppe
Giuseppe
Marco
Giuseppe
4 - SQL : Interrogazioni
Esercizio 1 5\7
ESERCIZIO :Estrarre i nonni di ogni persona
SELECT P.Figlio AS Nipote, N.Genitore AS Nonno
FROM Genitori P, Genitori N
WHERE P.Genitore = N.Figlio
Il terzo valore di P.Genitore
(=Gianni) non soddisfa lequijoin con nessuna tupla di N.
Questo stesso processo di
comparazione di valori deve
essere effettuato per tutti gli altri
valori di P.Genitore.
N
Figlio
Genitore
Figlio
Genitore
Paola
Mario
Paola
Mario
Marco
Paola
Marco
Paola
Carlo
Gianni
Carlo
Gianni
Carlo
Maria
Carlo
Maria
Francesca
76
Marco
Giuseppe
Francesca
Giuseppe
Giuseppe
Marco
Giuseppe
4 - SQL : Interrogazioni
Esercizio 1 6\7
ESERCIZIO :Estrarre i nonni di ogni persona
SELECT P.Figlio AS Nipote, N.Genitore AS Nonno
FROM Genitori P, Genitori N
WHERE P.Genitore = N.Figlio
P.Figlio
P.Genitore
N.Figlio
N.Genitore
Marco
Paola
Paola
Mario
77
Basi di Dati 13/14
Lequi-join tra P e N, utilizzando
come condizione di uguaglianza
gli attributi P.Genitore e
N.Figlio, produce una tabella con
una sola tupla.
4 - SQL : Interrogazioni
Esercizio 1 7\7
ESERCIZIO :Estrarre i nonni di ogni persona
SELECT P.Figlio AS Nipote, N.Genitore AS Nonno
FROM Genitori P, Genitori N
WHERE P.Genitore = N.Figlio
P.Figlio
P.Genitore
N.Figlio
N.Genitore
Marco
Paola
Paola
Mario
Lultimo passaggio consiste
in una proiezione rispetto agli
attributi P.Figlio e
N.Genitore, e in una loro
successiva ridenominazione.
P.Figlio
N.Genitore
Nipote
Nonno
Marco
Mario
Marco
Mario
78
Basi di Dati 13/14
4 - SQL : Interrogazioni
Esercizio 2 1\6
Persone
Genitori
Nome
Reddito
Et
Sesso
Mario
15
80
Carlo
25
24
Giuseppe
30
45
Maria
76
43
Gianni
60
50
Francesca
18
26
Paola
45
60
Marco
80
35
Figlio
Genitore
Paola
Mario
Marco
Paola
Carlo
Gianni
Carlo
Maria
Francesca
Giuseppe
Marco
Giuseppe
ESERCIZIO :Trovare la relazione che mostra le coppie di fratelli
SELECT DISTINCT G1.Figlio AS Nome1,
G2.Figlio AS Nome2
FROM Genitori G1, Genitori G2
WHERE G1.Genitore = G2.Genitore AND
G1.Figlio <> G2.Figlio
Nome1
Nome2
Marco
Francesca
Francesca
Marco
4 - SQL : Interrogazioni
Esercizio 2 2\6
ESERCIZIO : Trovare la relazione che mostra le coppie di fratelli
SELECT DISTINCT G1.Figlio AS Nome1, G2.Figlio AS Nome2
FROM Genitori G1, Genitori G2
WHERE G1.Genitore = G2.Genitore AND G1.Figlio <> G2.Figlio
G1
G2
Figlio
Genitore
Genitore
Figlio
Paola
Mario
Mario
Paola
Marco
Paola
Paola
Marco
Carlo
Gianni
Gianni
Carlo
Carlo
Maria
Maria
Carlo
Francesca
Giuseppe
Giuseppe
Francesca
Marco
Giuseppe
Giuseppe
Marco
80
Basi di Dati 13/14
Vengono definite due variabili
di range per la tabella
Genitore. In pratica come se
si avessero a disposizione due
tabelle Genitore identiche.
4 - SQL : Interrogazioni
Esercizio 2 3\6
ESERCIZIO :Trovare la relazione che mostra le coppie di fratelli
SELECT DISTINCT G1.Figlio AS Nome1, G2.Figlio AS Nome2
FROM Genitori G1, Genitori G2
WHERE G1.Genitore = G2.Genitore AND G1.Figlio <> G2.Figlio
G1
G2
Figlio
Genitore
Genitore
Figlio
Paola
Mario
Mario
Paola
Marco
Paola
Paola
Marco
Carlo
Gianni
Gianni
Carlo
Carlo
Maria
Maria
Carlo
Francesca
Giuseppe
Giuseppe
Francesca
Marco
Giuseppe
Giuseppe
Marco
81
Basi di Dati 13/14
Si effettua un equi-join tra
G1 e G2, utilizzando come
condizione di uguaglianza
gli attributi G1.Genitore e
G2.Genitore.
Il primo valore di
G1.Genitore (=Mario)
soddisfa lequi-join solo con
la prima tupla di G2 (in
particolare con il primo
valore di G2.Genitore)
4 - SQL : Interrogazioni
Esercizio 2 4\6
ESERCIZIO :Trovare la relazione che mostra le coppie di fratelli
SELECT DISTINCT G1.Figlio AS Nome1, G2.Figlio AS Nome2
FROM Genitori G1, Genitori G2
WHERE G1.Genitore = G2.Genitore AND G1.Figlio <> G2.Figlio
G1
G2
Figlio
Genitore
Genitore
Figlio
Paola
Mario
Mario
Paola
Marco
Paola
Paola
Marco
Carlo
Gianni
Gianni
Carlo
Carlo
Maria
Maria
Carlo
Francesca
Giuseppe
Giuseppe
Francesca
Marco
Giuseppe
Giuseppe
Marco
82
Basi di Dati 13/14
Questo stesso processo di
comparazione di valori deve
essere effettuato per tutti gli
altri campi di G1.Genitore.
Le tuple che soddisfano la
condizione di uguaglianza sono
segnalate da frecce verdi.
4 - SQL : Interrogazioni
Esercizio 2 5\6
ESERCIZIO :Trovare la relazione che mostra le coppie di fratelli
SELECT DISTINCT G1.Figlio AS Nome1, G2.Figlio AS Nome2
FROM Genitori G1, Genitori G2
WHERE G1.Genitore = G2.Genitore AND G1.Figlio <> G2.Figlio
G1.Figlio
G1.Genitore
G2.Genitore
G2.Figlio
Paola
Mario
Mario
Paola
Marco
Paola
Paola
Marco
Carlo
Gianni
Gianni
Carlo
Carlo
Maria
Maria
Carlo
Francesca
Giuseppe
Giuseppe
Francesca
Francesca
Giuseppe
Giuseppe
Marco
Marco
Giuseppe
Giuseppe
Francesca
Marco
83
Giuseppe
Giuseppe
Marco
Lequi-join tra G1 e G2,
utilizzando come condizione di
uguaglianza gli attributi
G1.Genitore e G2.Genitore,
produce la tabella in figura.
Il secondo passo del join consiste
nella verifica che G1.Figlio sia
diverso da G2.Figlio. Le tuple
che non soddisfano tale
condizione vengono eliminate
(quelle sottolineate in rosso in
figura).
4 - SQL : Interrogazioni
Esercizio 2 6\6
ESERCIZIO :Trovare la relazione che mostra le coppie di fratelli
SELECT DISTINCT G1.Figlio AS Nome1, G2.Figlio AS Nome2
FROM Genitori G1, Genitori G2
WHERE G1.Genitore = G2.Genitore AND G1.Figlio <> G2.Figlio
G1.Figlio
G1.Genitore
G2.Genitore
G2.Figlio
Francesca
Giuseppe
Giuseppe
Marco
Marco
Giuseppe
Giuseppe
Francesca
Lultimo passaggio consiste in
una proiezione rispetto agli
attributi G1.Figlio e
G2.Figlio, e in una loro
successiva ridenominazione.
Nome1
Nome2
G1.Figlio
G2.Figlio
Francesca
Marco
Francesca
Marco
Marco
Francesca
Marco
Francesca
Basi di Dati 13/14
4 - SQL : Interrogazioni
Esercizio 3
Persone
Genitori
Nome
Reddito
Et
Sesso
Mario
15
80
Carlo
25
24
Giuseppe
30
45
Maria
76
43
Gianni
60
50
Francesca
18
26
Paola
45
60
Marco
80
35
Figlio
Genitore
Paola
Mario
Marco
Paola
Carlo
Gianni
Carlo
Maria
Francesca
Giuseppe
Marco
Giuseppe
ESERCIZIO :Trovare il reddito medio dei padri
raggruppati per et
SELECT Et, AVG(reddito) AS AVG_REDDITO
FROM Persone, Genitori
WHERE Nome = Genitore AND Sesso = 'M'
GROUP BY et
85
Basi di Dati 13/14
et
AVG_REDDITO
45
30
50
60
80
15
4 - SQL : Interrogazioni
Esercizio 4
Persone
Genitori
Nome
Reddito
Et
Sesso
Mario
15
80
Carlo
25
24
Giuseppe
30
45
Maria
76
43
Gianni
60
50
Francesca
18
26
Paola
45
60
Marco
80
35
Figlio
Genitore
Paola
Mario
Marco
Paola
Carlo
Gianni
Carlo
Maria
Francesca
Giuseppe
Marco
Giuseppe
ESERCIZIO :Trovare le persone che sono genitori di almeno due figli
SELECT Genitore
FROM Genitori
GROUP BY Genitore
HAVING count(DISTINCT Figlio) >= 2
86
Basi di Dati 13/14
Genitore
Giuseppe
4 - SQL : Interrogazioni
Esercizio 5
Persone
Genitori
Nome
Reddito
Et
Sesso
Mario
15
80
Carlo
25
24
Giuseppe
30
45
Maria
76
43
Gianni
60
50
Francesca
18
26
Paola
45
60
Marco
80
35
Figlio
Genitore
Paola
Mario
Marco
Paola
Carlo
Gianni
Carlo
Maria
Francesca
Giuseppe
Marco
Giuseppe
ESERCIZIO :Trovare l'elenco ordinato dei genitori in cui almeno un figlio guadagna
pi di 20 milioni
Genitore
SELECT DISTINCT Genitore
FROM Genitori, Persone
WHERE Nome = Figlio AND Reddito >20
ORDER BY Genitore
Gianni
Giuseppe
Maria
Mario
87
Basi di Dati 13/14
Paola
Esercizio 6
Persone
Genitori
Nome
Reddito
Et
Sesso
Mario
15
80
Carlo
25
24
Giuseppe
30
45
Maria
76
43
Gianni
60
50
Francesca
18
26
Paola
45
60
Marco
80
35
Figlio
Genitore
Paola
Mario
Marco
Paola
Carlo
Gianni
Carlo
Maria
Francesca
Giuseppe
Marco
Giuseppe
ESERCIZIO :Trovare l'elenco ordinato dei genitori in cui tutti i figli guadagnano
pi di 20 milioni SELECT DISTINCT Genitore
88
FROM Genitori, Persone
WHERE Nome = Figlio
ORDER BY Genitore
EXCEPT
SELECT DISTINCT Genitore
FROM Genitori, Persone
WHERE Nome = Figlio AND Reddito <=20
ORDER BY Genitore
Genitore
Gianni
Maria
Mario
Paola
Esercizio 7 1\2
Persone
Genitori
Nome
Reddito
Et
Sesso
Mario
15
80
Carlo
25
24
Giuseppe
30
45
Maria
76
43
Gianni
60
50
Francesca
18
26
Paola
45
60
Marco
80
35
Figlio
Genitore
Paola
Mario
Marco
Paola
Carlo
Gianni
Carlo
Maria
Francesca
Giuseppe
Marco
Giuseppe
ESERCIZIO : Trovare la relazione che mostra per ciascun figlio i rispettivi genitori
(padre e madre), solo se li ha entrambe
SELECT GP.Genitore AS Padre, GM.Genitore AS Madre, GP.Figlio
FROM Genitori GP, Genitori GM, Persone PP, Persone PM
WHERE GP.Figlio=GM.Figlio AND GP.Genitore=PP.Nome AND PP.Sesso='M
AND GM.Genitore=PM.Nome AND PM.Sesso='F'
89
Basi di Dati 13/14
4 - SQL : Interrogazioni
Esercizio 7 2\2
ESERCIZIO :Trovare la relazione che mostra per ciascun figlio i rispettivi genitori
(padre, madre, figlio), solo se li ha entrambe
SELECT GP.Genitore AS Padre, GM.Genitore AS Madre, GP.Figlio
FROM Genitori GP, Genitori GM, Persone PP, Persone PM
WHERE GP.Figlio=GM.Figlio AND GP.Genitore=PP.Nome AND PP.Sesso='M
AND GM.Genitore=PM.Nome AND PM.Sesso='F'
PP
GP
Nome
Reddito
Et
Sesso
PM
Figlio
Genitore
Figlio
Genitore
GM
Nome
90
Reddito
Et
Sesso
Padre
Madre
Figlio
Giuseppe
Paola
Marco
Gianni
Maria
Carlo
Basi di Dati 13/14
4 - SQL : Interrogazioni
Esercizio 8
Persone
Genitori
Nome
Reddito
Et
Sesso
Mario
15
80
Carlo
25
24
Giuseppe
30
45
Maria
76
43
Gianni
60
50
Francesca
18
26
Paola
45
60
Marco
80
35
Figlio
Genitore
Paola
Mario
Marco
Paola
Carlo
Gianni
Carlo
Maria
Francesca
Giuseppe
Marco
Giuseppe
ESERCIZIO :Trovare il reddito complessivo dei figli di Gianni e Maria
SELECT SUM(P.reddito) AS RedditoCompl
FROM Persone P, Genitori GP, Genitori GM
WHERE GP.Figlio=GM.Figlio AND GP.Genitore='Maria' AND
GM.Genitore='Gianni' AND GP.Figlio=P.Nome
91
Basi di Dati 13/14
RedditoCompl
25
4 - SQL : Interrogazioni