sql - plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · sql violazione dei vincoli • per...
TRANSCRIPT
SQL
SQL
2
SQL
SQL
• Structured Query Language• è un linguaggio con varie funzionalità:
– contiene sia il DDL sia il DML;• esistono varie versioni dell’SQL;• vediamo gli aspetti essenziali non i dettagli • “storia”:
– prima proposta SEQUEL (IBM Reserach, 1974); – prima implementazione in SQL/DS (IBM, 1981);– dal 1983 ca., “standard di fatto” – standard (1986, poi 1989 e infine 1992) recepito in parte; – standard SQL3 di prossima approvazione
3
SQL
Domini
• Domini elementari (predefiniti)• Domini definiti dall‘utente (semplici, ma riutilizzabili)
4
SQL
Domini elementari
• Carattere: singoli caratteri o stringhe, anche di lunghezza variabile
character [ varying ] [ ( Lunghezza ) ][ character set NomeFamigliaCaratteri ]
• Bit: singoli booleani o stringhebit [ varying ] [ ( Lunghezza ) ]
• Numerici, esatti e approssimati:numeric [( Precisione [ , Scala ) ] ]integer
float [( Precisione )] double precision
5
SQL
Domini elementari, 2
• Data, ora, intervalli:datetime [( Precisione )] [ with time zone ] timestamp [( Precisione )] [ with time zone ]interval UnitàDiTempo [ to UnitàDiTempo ]
6
SQL
Definizione di domini
• Istruzione CREATE DOMAIN: – definisce un dominio (semplice), utilizzabile in definizioni di
relazioni• Sintassi
create domain NomeDominio as Tipo [ Default ] [ Vincoli ]
• Default (utilizzabili anche nella CREATE TABLE)default < Valore | user | null >
• Esempiocreate domain Voto as smallint default null
check ( value >=18 and value <= 30 )
7
SQL
Vincoli intrarelazionali
• not null (su singoli attributi)• unique: permette di definire chiavi; sintassi:
– per singoli attributi:unique dopo il dominio
– chiavi formate da più attributi:unique ( Attributo { , Attributo } )
• primary key: definizione della chiave primaria (una sola, implica not null); sintassi, come per unique
• check, vedremo più avanti
8
SQL
Vincoli intrarelazionali, esempi
Nome character(20) not null, Cognome character(20) not null, unique (Cognome,Nome)
• è diverso da:
Nome character(20) not null unique, Cognome character(20) not null unique
9
SQL
Vincoli interrelazionali
• check, vedremo più avanti• references e foreign key (chiave esterna) permettono di definire
vincoli di integrità referenziale; sintassi:– per singoli attributi:
references dopo il dominio– riferimenti su più attributi:
foreign key( Attributo { , Attributo } )references ...
• è possibile associare politiche di reazione alla violazione dei vincoli (causate da modifiche sulla tabella esterna, cioè quella cui si fa riferimento)
10
SQL
Richiamo: base di dati con vincoli di integrità referenziale
infrazioni Codice Data Vigile Prov Numero65524 3/9/1997 343 MI 3K988687635 4/12/1997 476 MI 6D556382236 4/12/1997 343 RM 7C556735632 6/1/1998 476 RM 7C556776543 5/3/1998 548 MI 6D5563
vigili Matricola Cognome Nome343 Rossi Luca476 Neri Pino548 Nicolosi Gino
automobili Prov Numero Proprietario ÉMI 3K9886 Nestore ÉMI 6D5563 Nestore ÉRM 7C5567 Menconi ÉRM 1A6673 Mussone ÉMI 5E7653 Marchi É
11
SQL
Vincoli interrelazionali, esempio
create table Infrazioni(Codice character(6) primary key, Data date not null, Vigile integer not null
references Vigile(Matricola), Provincia character(2), Numero character(6) ,foreign key(Provincia, Numero) references
Automobili(Provincia, Numero) )
Infrazioni e’ una tabella interna, Vigile e Automobili sonoesterne
12
SQL
Violazione dei vincoli
• per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento, il comando di aggiornamento venga rifiutato segnalando l’errore all’utente.
• per i vincoli di integrità referenziale, SQL permette di scegliere altre reazioni da adottare quando viene rilevata una violazione
• la reazione è possibile solo per le operazioni sulla tabella esterna che si possono propagare secondo una certa politica verso la tabella interna
• le violazioni possibili sono causate da modifiche del valore dell’attributo riferito e dalla cancellazione di righe (es. modifiche dell’attributo Provincia e cancellazione di righe da Vigile)
13
SQL
Politiche di reazione
• Specificata immediatamente dopo il vincolo di integrità consente di associare politiche diverse ai diversi eventi (delete, update) secondo la seguente sintassi:
on < delete | update >< cascade | set null | set default |
no action >
14
SQL
Reazioni per delete
• cascade: si propagano le cancellazioni• set null: all’attributo referente viene assegnato il valore nullo
al posto del valore cancellato nella tabella• set default: all’attributo referente viene assegnato il valore
di default al posto del valore cancellato nella tabella esterna• no action: la cancellazione non viene consentita
15
SQL
Reazioni per update
• cascade: il nuovo valore valore viene propagato nell’altra tabella
• set null: all’attributo referente viene assegnato il valore nullo al posto del valore modificato nella tabella
• set default: all’attributo referente viene assegnato il valore di default al posto del valore modificato nella tabella esterna
• no action: l’azione di modifica non viene consentita
16
SQL
Modifiche degli schemi
Fornisce primitive per la manipolazione di schemi chepermettono di modificare gli schemi:
• alter domain• alter table• drop domain• drop table• ...
17
SQL
Dizionario dei Dati
• Tutti i DBMS relazionali gestiscono le descrizioni delle tabellepresenti nella basi di dati mediante una struttura relazionale, cioè mediante tabelle.
• La base di dati contiene due tipi di tabelle: – quelle contenti i dati, e– quelle contenente i metadati (dati che descrivono dati), dette
il catalogo della base di dati oppure il dizionario dei dati
• I comandi di definizione e modifica dello schema manipolano il dizionario dei dati
18
SQL
Definizione degli indici
• è rilevante dal punto di vista delle prestazioni• ma è a livello più basso (fisico e non logico)• non ne parliamo qui• in passato era importante perché in alcuni sistemi era l‘unico
mezzo per definire chiavi
19
SQL
SELECT, sintassi
select AttrExpr [ [as] Alias ] { , AttrExpr [ [as] Alias ] }from Tabella [ [as] Alias ] { , Tabella [ [as] Alias ] }[ where Condizione ]
• le tre parti vengono di solito chiamate– target list– clausola from– clausola where
• seleziona tra le righe che appartengono al prodotto cartesiano delle tabelle elencate nella clausola from quelle che soddisfano la condizione espressa nell‘argomento della clausola where
20
SQL
persone Nome Eta RedditoAndrea 27 21
Aldo 25 15Maria 55 42Anna 50 35
Filippo 26 30Luigi 50 40
Franco 60 20Olga 30 41
Sergio 85 35Luisa 75 87
maternita Madre FiglioLuisa MariaLuisa LuigiAnna OlgaAnna FilippoMaria AndreaMaria Aldo
paternita Padre FiglioSergio FrancoLuigi OlgaLuigi Filippo
Franco AndreaFranco Aldo
21
SQL
Selezione e proiezione
“Nome e reddito delle persone con meno di trenta anni”
πNome, Reddito(σEta<30(persone))
select nome, redditofrom personewhere eta < 30
22
SQL
SELECT, abbreviazioni
• data una relazione R su A e B
select *from R
• equivale (intutivamente) a
select X.A AS A, X.B AS Bfrom R Xwhere true
23
SQL
Impiegato Nome Cognome Dipart Ufficio Stipendio Mario Rossi Amministrazione 10 45 Carlo Bianchi Produzione 20 36 Giuseppe Verdi Amministrazione 20 40 Franco Neri Distribuzione 16 45 Carlo Rossi Direzione 14 80 Lorenzo Lanzi Direzione 7 73 Paola Borroni Amministrazione 75 40 Marco Franco Produzione 20 46
Dipartimento Nome Indirizzo CittaAmministrazione Via Tito Livio Milano
Produzione P.zza Lavater TorinoDistribuzione Via Segre Roma
Direzione Via Tito Livio MilanoRicerca Via Morone Milano
24
SQL
Selezione, senza proiezione
select *from Impiegato
where Cognome = 'Rossi’
Nome Cognome Dipart Ufficio StipendioMario Rossi Amministrazione 10 45Carlo Rossi Direzione 14 80
(σCognome=Rossi(impiegato))
25
SQL
Espressioni nella target list
select Stipendio/12 as StipendioMensilefrom Impiegato
where Cognome = 'Bianchi'
StipendioMensile3.00
26
SQL
Disgiunzione
select Nome, Cognomefrom Impiegatowhere Dipart = 'Amministrazione' or
Dipart = 'Produzione'
Nome CognomeMario RossiCarlo Bianchi
Giuseppe VerdiPaola BorroniMarco Franco
27
SQL
Condizione complessa
select Nomefrom Impiegatowhere Cognome = 'Rossi' and
(Dipart = 'Amministrazione' or Dipart = 'Produzione')
NomeMario
28
SQL
Condizione “LIKE”
“Gli impiegati che hanno un cognome che ha una 'o' in seconda posizione e finisce per 'i'.”
select *from Impiegatowhere Cognome like '_o%i'
Nome Cognome Dipart Ufficio StipendioMario Rossi Amministrazione 10 45Carlo Rossi Direzione 14 80Paola Borroni Amministrazione 75 40
29
SQL
Gestione dei valori nulli
“Gli impiegati che hanno o potrebbero avere uno stipendio minoredi 50 milioni”
select *from Impiegatowhere Stipendio < 50 or Stipendio is null
Nome Cognome Dipart Ufficio StipendioMario Rossi Amministrazione 10 45Carlo Rossi Direzione 14 80Paola Borroni Amministrazione 75 NULL
Nome Cognome Dipart Ufficio StipendioMario Rossi Amministrazione 10 45Paola Borroni Amministrazione 75 NULL
30
SQL
SELECT e algebra relazionale
select R1.A1, R2.A4 from R1, R2where R1.A2 = R2.A3
• prodotto cartesiano delle relazioni nella clausola from selezione con la condizione nella clausola where
• proiezione come nella target list
π A1,A4 (σA2=A3 (R1 R2))
31
SQL
SELECT e algebra relazionale, ancora
• possono essere necessarie ridenominazioni– nel prodotto cartesiano
– nella target list
select X.A1 AS B1, X.A2 AS B2, Y.A4 AS B3 from R1 X, R2 Y, R1 Zwhere X.A2 = Y.A3 AND Y.A4 = Z.A1
ρ B1,B2,B3←A1,A2,A4 (π A1,A2,A4 (σ A2 = A3 ∧ A4 = C1(
R1 R2 ρ C1,C2 ← A1,A2 (R1))))
32
SQL
Selezione, proiezione e join“I padri di persone che guadagnano più di venti milioni”
πPadre(paternita Figlio =Nome (σReddito>20 (persone)))
select distinct padrefrom persone, paternitawhere figlio = nome and
reddito > 20
33
SQL
Proiezione, senza selezione
select Nome, Cognomefrom Impiegato
Nome Cognome Mario Rossi Carlo Bianchi Giuseppe Verdi Franco Neri Carlo Rossi Lorenzo Lanzi Paola Borroni Marco Franco
34
SQL
Proiezione: duplicati
select Cognomefrom Impiegato
CognomeRossi
BianchiVerdiNeri
RossiLanzi
BorroniFranco
select distinct Cognomefrom Impiegato
CognomeRossi
BianchiVerdiNeriLanzi
BorroniFranco
35
SQL
Join naturale“Padre e madre di ogni persona”
paternita maternita
select paternita.figlio, padre, madrefrom maternita, paternitawhere paternita.figlio = maternita.figlio
πFiglio,Padre,Madre(paternita Figlio = Nome (ρNome ← Figlio(maternita)))
36
SQL
Join di una relazione con se stessa
“Le persone che guadagnano più dei rispettivi padri;mostrare nome, reddito e reddito del padre”
πNome, Reddito, RP (σReddito>RP (ρNP,EP,RP ← Nome,Eta,Reddito(persone)NP=Padre
(paternita Figlio =Nome persone)))
select f.nome, f.reddito, p.redditofrom persone p, paternita, persone fwhere p.nome = padre and
figlio = f.nome andf.reddito > p.reddito
37
SQL
Ridenominazione del risultato
“Le persone che guadagnano più dei rispettivi padri;mostrare nome, reddito e reddito del padre”
πFiglio, Reddito, RP (σReddito>RP (ρNP,EP,RP ← Nome,Eta,Reddito(persone)
NP=Padre
(paternita Figlio =Nome persone)))
select figlio, f.reddito as reddito, p.reddito as redditoPadre
from persone p, paternita, persone fwhere p.nome = padre and
figlio = f.nome andf.reddito > p.reddito
38
SQL
SELECT, con join esplicito, sintassi
select AttrExpr [ [as] Alias ] {,AttrExpr [ [as] Alias ] }from Tabella [ [ as ] Alias ]
{[ TipoJoin ] join Tabella [ [ as ] Alias ] on CondDiJoin }, ...[ where AltraCondizione ]
39
SQL
Join esplicito“Padre e madre di ogni persona”
paternita maternita
πFiglio,Padre,Madre(paternita Figlio = Nome ρNome ← Figlio(maternita))
select madre, paternita.figlio, padre from maternita join paternita on paternita.figlio = maternita.figlio
40
SQL
Ulteriore estensione: join naturale“Padre e madre di ogni persona”
paternita maternita
πFiglio,Padre,Madre(paternita Figlio = Nome ρNome←Figlio(maternita))
select madre, paternita.figlio, padre
from maternita natural join paternita
select madre, paternita.figlio, padre from maternita join paternita on paternita.figlio = maternita.figlio
41
SQL
Joinmaternita Madre Figlio
Luisa MariaLuisa LuigiAnna OlgaAnna FilippoMaria AndreaMaria Aldo
paternita Padre FiglioSergio FrancoLuigi OlgaLuigi Filippo
Franco AndreaFranco Aldo
Madre Figlio PadreAnna Olga LuigiAnna Filippo LuigiMaria Andrea FrancoMaria Aldo Franco
42
SQL
Outer join sinistromaternita Madre Figlio
Luisa MariaLuisa LuigiAnna OlgaAnna FilippoMaria AndreaMaria Aldo
paternita Padre FiglioSergio FrancoLuigi OlgaLuigi Filippo
Franco AndreaFranco Aldo
Madre Figlio PadreLuisa Maria NULL
Luisa Luigi NULL
Anna Olga LuigiAnna Filippo LuigiMaria Andrea FrancoMaria Aldo Franco
43
SQL
Outer join completomaternita Madre Figlio
Luisa MariaLuisa LuigiAnna OlgaAnna FilippoMaria AndreaMaria Aldo
paternita Padre FiglioSergio FrancoLuigi OlgaLuigi Filippo
Franco AndreaFranco Aldo
Madre Figlio PadreLuisa Maria NULL
Luisa Luigi NULL
Anna Olga LuigiAnna Filippo LuigiMaria Andrea FrancoMaria Aldo FrancoNULL Franco Sergio
44
SQL
Outer join
“Padre e, se nota, madre di ogni persona”
select paternita.figlio, padre, madrefrom paternita left natural join maternita
select paternita.figlio, padre, madrefrom paternita left join maternita on
paternita.figlio = maternita.figlio
paternita maternitaLEFT
πFiglio,Padre,Madre(paternita ρNome ← Figlio(maternita))Figlio = Nome
LEFT
45
SQL
Join esplicito
select I.Nome, Cognome, Cittafrom Impiegato I join Dipartimento D
on Dipart = D.Nome
Nome Cognome DipartMario Rossi MilanoCarlo Bianchi Torino
Giuseppe Verdi MilanoFranco Neri RomaCarlo Rossi Milano
Lorenzo Lanzi MilanoPaola Borroni MilanoMarco Franco Torino
46
SQL
Ordinamento del risultato
order by AttrDiOrdinamento [ asc | desc ]{, AttrDiOrdinamento [ asc | desc ] }
select Cognome, Nome, Stipendiofrom Impiegatowhere Dipart like 'Amm%'
order by Stipendio desc, Cognome
Cognome Nome StipendioRossi Mario 45
Borroni Paola 40Verdi Giuseppe 40
47
SQL
Necessità di operatori su tuple
• tutte le condizioni dell’algebra vengono valutate su una tuplaalla volta
• la condizione è sempre un predicato che viene valutato su ciascuna tupla indipendentemente da tutte le altre
• se volessi contare il numero di impiegati di un certo dipartimento a partire da una relazione Impiegato come si fa?
• occorre introdurre degli operatori che consentono di valutare proprietà che dipendono da insiemi di tuple
• questi operatori sono detti operatori aggregati
48
SQL
Operatori aggregati
select count(*) AS NumeroImpiegatifrom Impiegatowhere Dipart = 'Produzione'
• l’operatore aggregato (count) viene applicato al risultato dell’interrogazione:
select *from Impiegatowhere Dipart = 'Produzione'
NumeroImpiegati2
49
SQL
COUNT: sintassi
count ( < * | [ distinct | all ] ListaAttributi > )
select count(Stipendio) as NumeroStipendifrom Impiegato
select count(distinct Stipendio) as StipendiDiversi
from Impiegato
NumeroStipendi8
StipendiDiversi6
50
SQL
COUNT e valori nulli
select count(*) as NumeroImpiegatifrom Impiegato
select count(Stipendio) as NumeroStipendifrom Impiegato
NumeroImpiegati3
NumeroStipendi2
Impiegato Nome Cognome Dipart Ufficio StipendioMario Rossi Amministrazione 10 45Carlo Bianchi Produzione 20 45
Giuseppe Verdi Amministrazione 20 NULL
51
SQL
Somma, media, massimo, minimo
< sum | max | min | avg > ( [ distinct | all ] AttrEspr )
Totale degli stipendi del dipartimento amministrazione
select sum(Stipendio) as TotaleStipendifrom Impiegatowhere Dipart = 'Amministrazione'
• escludono opportunamente i valori nulli
TotaleStipendi125
52
SQL
Join e operatore aggregato
“Il massimo stipendio tra quelli degli impiegati che lavorano in un dipartimento con sede a Milano”
select max(Stipendio)from Impiegato, Dipartimento Dwhere Dipart = D.Nome andCitta = 'Milano'
• Nota: non abbiamo usato la as e l’attributo nel risultato non ha nome
80
53
SQL
Operatori aggregati e target list
• un’interrogazione scorretta:
select Cognome, Nome, max(Stipendio)from Impiegato, Dipartimentowhere Dipart = NomeDip andCitta = 'Milano’
• di chi sarebbe il cognome? La target list deve essere omogenea
select max(Stipendio), min(Stipendio)from Impiegato
54
SQL
Interrogazioni con raggruppamento
• gli operatori aggregati vengono applicati ad un insieme di righe• gli esempi visti operano su tutte le righe• spesso esiste l’esigenza di applicare operatori aggregati
distintamente ad insiemi di tuple• in SQL l’operatore group by ci consente di fare questo
55
SQL
Operatori aggregati e raggruppamenti
“Per ogni dipartimento, la somma degli stipendi”
select Dipart, sum(Stipendio) as SommaStipendifrom Impiegatogroup by Dipart
Dipart SommaStipendiAmministrazione 125
Produzione 82Distribuzione 45
Direzione 153
56
SQL
Semantica di interrogazioni con operatori aggregati e raggruppamenti
• interrogazione senza group by e senza operatori aggregati:
select Dipart, Stipendiofrom Impiegato
Dipart StipendioAmministrazione 45
Produzione 36Amministrazione 40
Distribuzione 45Direzione 80Direzione 73
Amministrazione 40Produzione 46
57
SQL
Semantica …, 2
• poi si raggruppa e si applica l’operatore aggregato a ciascun gruppo
dopo group by dopo sum()as
Dipart StipendioAmministrazione 45Amministrazione 40Amministrazione 40
Distribuzione 45Direzione 80Direzione 73
Produzione 36Produzione 46
Dipart SommaStipendiAmministrazione 125
Distribuzione 45Direzione 153
Produzione 82
58
SQL
Condizioni sui gruppi
“I dipartimenti che spendono più di 100 milioni in stipendi”
select Dipart, sum(Stipendio) as SommaStipendi
from Impiegatigroup by Dipart
having sum(Stipendio) > 100
Dipart SommaStipendiAmministrazione 125
Direzione 153
59
SQL
WHERE o HAVING?
“I dipartimenti per cui la media degli stipendi degli impiegati che lavorano nell'ufficio 20 è superiore a 25 milioni”
select Dipartfrom Impiegatowhere Ufficio = 20group by Diparthaving avg(Stipendio) > 25
60
SQL
Sintassi, riassumiamo
SelectSQL ::= select ListaAttributiOEspressionifrom ListaTabelle[ where CondizioniSemplici ][ group by ListaAttributiDiRaggruppamento ][ having CondizioniAggregate ][ order by ListaAttributiDiOrdinamento ]
61
SQL
Unione, intersezione e differenza
• La select da sola non permette di fare unioni; serve un costrutto esplicito:
SelectSQL { < union | intersect | except > [ all ] SelectSQL }
select Nomefrom Impiegatounionselect Cognome as Nomefrom Impiegato
• i duplicati vengono eliminati (a meno che si usi all); anche dalle proiezioni!
62
SQL
Notazione posizionale!
select padre from paternitaunionselect madrefrom maternita
• quali nomi per gli attributi del risultato?– nessuno – quelli del primo operando– …
63
SQL
Notazione posizionale, 2
select padre, figliofrom paternita
unionselect figlio, madrefrom maternita
select padre, figliofrom paternita
unionselect madre, figliofrom maternita
64
SQL
Notazione posizionale, 3
• Anche con le ridenominazioni non cambia niente:
select padre as genitore, figliofrom paternitaunionselect figlio, madre as genitorefrom maternita
65
SQL
Intersezione e differenza
select Nomefrom Impiegato
intersectselect Cognome as Nomefrom Impiegato
• equivale a
select I.Nomefrom Impiegato I, Impiegato J
where I.Nome = J.Cognome
select Nomefrom Impiegato
exceptselect Cognome as Nomefrom Impiegato
• vedremo che si può esprimere con select nidificate
66
SQL
Interrogazioni nidificate
• le condizioni atomiche esprimibili nella clausola WHERE permettono anche – il confronto fra un attributo (o più, vedremo poi) e il risultato
di una sottointerrogazione– quantificazioni esistenziali
67
SQL
Interrogazioni nidificate, sintassi
ConfrontoConNidificazione :: =Scalare OpConfronto [ any | all ]
( SelectAttributoSingolo)|exists ( SelectStar )
• senza any o all , il risultato della SelectAttributoSingolo deve essere un solo valore
• v.A θ any Select... (risp. all) è vero se v.A è in relazione θcon almeno uno (risp. con tutti) dei valori del risultato della Select
• = any puo essere abbreviato con in• exists( SelectStar ) è vero se il risultato della
sottoespressione non è vuoto.
68
SQL
Interrogazioni nidificate
“Gli impiegati che lavorano in dipartimenti di Roma”
select *from Impiegatowhere Dipart = any (select Nome
from Dipartimentowhere Citta = 'Roma')
69
SQL
“Nome e reddito del padre di Mario”
select Nome, Redditofrom Personewhere Nome = (select Padre
from Paternitawhere Figlio = 'Mario')
select Nome, Redditofrom Persone, Paternitawhere Nome = Padre and
Figlio = 'Mario'
70
SQL
Interrogazioni nidificate, commenti
• La prima versione di SQL prevedeva solo la forma nidificata (o strutturata), con una sola relazione in ogni clausola FROM. Il che è insoddisfacente:– la dichiaratività è limitata– non si possono includere nella target list attributi di relazioni
nei blocchi interni• La forma nidificata è “meno dichiarativa”, ma talvolta più
leggibile (richiede meno variabili)• La forma piana e quella nidificata possono essere combinate• Le sottointerrogazioni non possono contenere operatori
insiemistici (“l’unione si fa solo al livello esterno”); la limitazione non è significativa
71
SQL
“Nome e reddito dei padri di persone che guadagnano più di 20 milioni"
select Nome, Redditofrom Personewhere Nome in (select Padre
from Paternitawhere Figlio =any (select Nome
from Personewhere Reddito > 20))
select distinct P.Nome, P.Redditofrom Persone P, Paternita, Persone Fwhere P.Nome = Padre and
Figlio = F.Nome andF.Reddito > 20
72
SQL
Interrogazioni piatte o nidificate?
select I1.Nomefrom Impiegato I1, Impiegato I2where I1.Nome = I2.Nome andI2.Dipart = 'Produzione'
select Nomefrom Impiegatowhere Nome = any (select Nome
from Impiegatowhere Dipart = 'Produzione')
73
SQL
“Le persone che hanno almeno un figlio”
select *from Personewhere exists (select *
from Paternitawhere Padre = Nome) or
exists (select *from Maternitawhere Madre = Nome)
74
SQL
Interrogazioni nidificate, commenti, 2
• regole di visibilità:– non è possibile fare riferimenti a variabili definite in blocchi
più interni– se un nome di variabile è omesso, si assume riferimento alla
variabile più “vicina”• nota: in un blocco si può fare riferimento a variabili definite in
blocchi più esterni; la semantica (prodotto cartesiano, selezione, proiezione) non funziona più, ne serve una più sofisticata:– l’interrogazione interna va ripetuta una volta per ciascun
valore della variabile
75
SQL
Necessità della forma nidificata
“Trovare i padri i cui figli guadagnano tutti più di venti milioni"
select distinct Padrefrom Paternita Zwhere not exists (select *
from Paternita W, Personewhere W.Padre = Z.Padre and
W.Figlio = Nome andReddito <= 20)
• anche con <>all
76
SQL
Semantica delle espressioni “correlate”
• L’interrogazione interna viene eseguita una volta per ciascuna ennupla dell’interrogazione esterna
77
SQL
Visibilità
• scorretta:
select *from Impiegatowhere Dipart in (select Nome
from Dipartimento D1where Nome = 'Produzione') or
Dipart in (select Nomefrom Dipartimento D2where D2.Citta = D1.Citta)
78
SQL
Disgiunzione e unione select *from Personewhere Reddito > 30unionselect F.*from Persone F, Paternita, Persone Pwhere F.Nome = Figlio and
Padre = P.Nome andP.Reddito > 30
select *from Persone Fwhere Reddito > 30 or
exists (select *from Paternita, Persone Pwhere F.Nome = Figlio and
Padre = P.Nome andP.Reddito > 30)
79
SQL
Differenza e nidificazione
select Nomefrom Impiegatoexceptselect Cognome as Nomefrom Impiegato
select Nomefrom Impiegato Iwhere not exists
(select *from Impiegatowhere Cognome = I.Nome)
80
SQL
Massimo e nidificazione
“L’impiegato con lo stipendio massimo”
select *from Impiegatowhere Stipendio = (select max(Stipendio)
from Impiegato)
81
SQL
Operazioni di aggiornamento
• operazioni di– inserimento– eliminazione– modifica
• di una o più ennuple di una relazione• sulla base di una condizione che può coinvolgere anche altre
relazioni • istruzioni
– insert– delete– update
82
SQL
Inserimento di ennuple
• sintassiinsert into NomeTabella [ ( ListaAttributi )]
< values( ListaDiValori ) |SelectSQL >
insert into Dipartimento(NomeDip,Citta)values('Produzione','Torino')
insert into ProdottiMilanesi(select codice, descrizionefrom Prodottowhere LuogoProd = 'Milano')
83
SQL
Inserimento di ennuple, 2
• l’ordinamento degli attributi (se presente) e dei valori è significativo
• le due liste debbono avere lo stesso numero di elementi• se la lista di attributi è omessa, si fa riferimento a tutti gli attributi
della relazione, secondo l’ordine con cui sono stati definiti• se la lista di attributi non contiene tutti gli attributi della relazione,
per gli altri viene inserito un valore nullo (che deve essere permesso) o un valore di default
84
SQL
Eliminazione di ennuple
delete from NomeTabella [ where Condizione ]
delete from Dipartimentowhere NomeDip = 'Produzione'
delete from Dipartimentowhere Nome not in (select Dipart
from Impiegato)
85
SQL
Eliminazione di ennuple
• elimina le ennuple che soddisfano la condizione• può causare (se i vincoli di integrità referenziale sono definiti
con politiche di reazione cascade) eliminiazioni da altre relazioni
• ricordare: se la where viene omessa, si intende where true• cancelliamo tutte le ennuple (ma manteniamo lo schema):
delete from Dipartimento
• per cancellare anche lo schemadrop Dipartimento
86
SQL
Modifica di ennuple
update NomeTabellaset Attributo = < Espressione | SelectSQL | null | default >{, Attributo = < Espressione | SelectSQL | null | default > }[ where Condizione ]
update Dipendente set Stipendio = 45where Matricola = 'M2047'
update Impiegato set Stipendio = Stipendio * 1.1where Dipart = 'Amministrazione'
87
SQL
• attenzione all’approccio set-oriented e non tuple-oriented:
update Impiegato set Stipendio = Stipendio * 1.1where Stipendio <= 30
update Impiegato set Stipendio = Stipendio * 1.15where Stipendio > 30
88
SQL
Vincoli di integrità generici: check
• Specifica di vincoli di ennupla (e anche vincoli più complessi)
check ( Condizione )
create table Impiegato(Matricola character(6),Cognome character(20),Nome character(20),Sesso character not null check (sesso in (‘M’,‘F’))Stipendio integer,Superiore character(6), check (Stipendio <= (select Stipendio
from Impiegato Jwhere Superiore = J.Matricola)
)
89
SQL
Vincoli di integrità generici: asserzioni
• Specifica vincoli a livello di schema
create assertion NomeAsserzione check ( Condizione )
create assertion AlmenoUnImpiegatocheck (1 <= (select count(*)
from Impiegato ))
90
SQL
Viste
create view NomeVista [ ( ListaAttributi ) ] as SelectSQL[ with [ local | cascaded ] check option ]
create view ImpiegatiAmmin(Matricola, Nome, Cognome, Stipendio) as
select Matricola, Nome, Cognome, Stipendiofrom Impiegatowhere Dipart = 'Amministrazione' and
Stipendio > 10
create view ImpiegatiAmminPoveri asselect *from ImpiegatiAmminwhere Stipendio < 50with check option
91
SQL
Opzioni su Viste
create view NomeVista [ ( ListaAttributi ) ] as SelectSQL[ with [ local | cascaded ] check option ]
• check option specifica che posso essere ammessi aggiornamenti solo sulle righe della vista, e dopo gli aggiornamenti le righe devono continuare ad appartenere alla vista
• local (nel caso di viste su viste) specifica che il controllo sul fatto che le righe vengono rimosse dalla vista debba essere effettuato solo all’ultimo livello della vista
• cascaded (nel caso di viste su viste) specifica che il controllo sul fatto che le righe vengono rimosse dalla vista debba essere effettuato a tutti i livelli di definizione
92
SQL
Un’interrogazione non standard
“Trova il dipartimento che spende il massimo in stipendi”• La nidificazione nella having potrebbe non essere ammessa
select Dipartfrom Impiegatogroup by Diparthaving sum(Stipendio) >= all
(select sum(Stipendio)from Impiegatogroup by Dipart)
93
SQL
Soluzione con le viste
create view BudgetStipendi(Dip,TotaleStipendi) asselect Dipart, sum(Stipendio)from Impiegatogroup by Dipart
select Dipfrom BudgetStipendiwhere TotaleStipendi =(select max(TotaleStipendi)
from BudgetStipendi)
94
SQL
Ancora sulle viste
“Trova il numero medio di uffici per ogni dipartimento”• Interrogazione scorretta
select avg(count(distinct Ufficio))from Impiegatogroup by Dipart
• Con una vista
create view DipartUffici(NomeDip,NroUffici) asselect Dipart, count(distinct Ufficio)from Impiegatogroup by Dipart
select avg(NroUffici)from DipartUffici
95
SQL
Controllo degli accessi
• Ogni componente dello schema (risorsa) può essere protetta(tabelle, attributi, viste, domini, ecc.)
• Il possessore della risorsa (colui che la crea) assegna deiprivilegi agli altri utenti
• Un utente predefinito ( _system) rappresenta l’amministratoredella base di dati ed ha completo accesso alle risorse
• Ogni privilegio è caratterizzato da:– la risorsa a cui si riferisce– l’utente che concede il privilegio– l’utente che riceve il privilegio– l’azione che viene permessa sulla risorsa– se il privilegio può esser trasmesso o meno ad altri utenti
96
SQL
Tipi di previlegi
• SQL offre sei tipi di previlegi:– insert: inserisce un nuovo oggetto nella risorsa– update: modifica il contenuto di una risorsa– delete: rimuove un oggetto dalla risorsa – select: accede il contenuto della risorsa con una query– references: costruisce un vincolo di integrità referenziale
con la risorsa (può limitare la capacità di modificare la risorsa)
– usage: utilizza la risorsa nella definizione di uno schema (es., un dominio)
97
SQL
grant e revoke
• Per concedere un previlegio ad un utente:grant < Privileges | all privileges > on Resourceto Users [ with grant option ]
– grant option specifica se ha il previlegio di propagare ilprevilegio ad altri utenti
• Es.:grant select on Department to Stefano
• Per revocare il previlegio:revoke Privileges on Resource from Users
[ restrict | cascade ]
98
SQL
Opzioni di grant e revoke
La revoca deve essere fatta dall’utente che aveva concesso iprivilegi
• restrict (di default) specifica che il comando non deveessere eseguito qualora la revoca dei privilegi all’utentecomporti qualche altra revoca (dovuta ad un precedente grant option)
• cascade invece forza l’esecuzione del comando
• Attenzione alle reazioni a catena