SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per...

98
SQL SQL

Transcript of SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per...

Page 1: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

SQL

SQL

Page 2: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 3: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

3

SQL

Domini

• Domini elementari (predefiniti)• Domini definiti dall‘utente (semplici, ma riutilizzabili)

Page 4: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 5: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

5

SQL

Domini elementari, 2

• Data, ora, intervalli:datetime [( Precisione )] [ with time zone ] timestamp [( Precisione )] [ with time zone ]interval UnitàDiTempo [ to UnitàDiTempo ]

Page 6: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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 )

Page 7: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 8: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 9: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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)

Page 10: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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 É

Page 11: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 12: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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)

Page 13: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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 >

Page 14: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 15: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 16: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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• ...

Page 17: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 18: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 19: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 20: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 21: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 22: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 23: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 24: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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))

Page 25: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

25

SQL

Espressioni nella target list

select Stipendio/12 as StipendioMensilefrom Impiegato

where Cognome = 'Bianchi'

StipendioMensile3.00

Page 26: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

26

SQL

Disgiunzione

select Nome, Cognomefrom Impiegatowhere Dipart = 'Amministrazione' or

Dipart = 'Produzione'

Nome CognomeMario RossiCarlo Bianchi

Giuseppe VerdiPaola BorroniMarco Franco

Page 27: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

27

SQL

Condizione complessa

select Nomefrom Impiegatowhere Cognome = 'Rossi' and

(Dipart = 'Amministrazione' or Dipart = 'Produzione')

NomeMario

Page 28: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 29: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 30: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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))

Page 31: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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))))

Page 32: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 33: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 34: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

34

SQL

Proiezione: duplicati

select Cognomefrom Impiegato

CognomeRossi

BianchiVerdiNeri

RossiLanzi

BorroniFranco

select distinct Cognomefrom Impiegato

CognomeRossi

BianchiVerdiNeriLanzi

BorroniFranco

Page 35: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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)))

Page 36: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 37: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 38: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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 ]

Page 39: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 40: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 41: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 42: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 43: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 44: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 45: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 46: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 47: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 48: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 49: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

49

SQL

COUNT: sintassi

count ( < * | [ distinct | all ] ListaAttributi > )

select count(Stipendio) as NumeroStipendifrom Impiegato

select count(distinct Stipendio) as StipendiDiversi

from Impiegato

NumeroStipendi8

StipendiDiversi6

Page 50: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 51: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 52: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 53: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 54: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 55: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 56: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 57: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 58: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 59: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 60: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

60

SQL

Sintassi, riassumiamo

SelectSQL ::= select ListaAttributiOEspressionifrom ListaTabelle[ where CondizioniSemplici ][ group by ListaAttributiDiRaggruppamento ][ having CondizioniAggregate ][ order by ListaAttributiDiOrdinamento ]

Page 61: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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!

Page 62: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

62

SQL

Notazione posizionale!

select padre from paternitaunionselect madrefrom maternita

• quali nomi per gli attributi del risultato?– nessuno – quelli del primo operando– …

Page 63: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

63

SQL

Notazione posizionale, 2

select padre, figliofrom paternita

unionselect figlio, madrefrom maternita

select padre, figliofrom paternita

unionselect madre, figliofrom maternita

Page 64: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

64

SQL

Notazione posizionale, 3

• Anche con le ridenominazioni non cambia niente:

select padre as genitore, figliofrom paternitaunionselect figlio, madre as genitorefrom maternita

Page 65: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 66: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 67: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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.

Page 68: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

68

SQL

Interrogazioni nidificate

“Gli impiegati che lavorano in dipartimenti di Roma”

select *from Impiegatowhere Dipart = any (select Nome

from Dipartimentowhere Citta = 'Roma')

Page 69: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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'

Page 70: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 71: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 72: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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')

Page 73: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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)

Page 74: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 75: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 76: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

76

SQL

Semantica delle espressioni “correlate”

• L’interrogazione interna viene eseguita una volta per ciascuna ennupla dell’interrogazione esterna

Page 77: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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)

Page 78: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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)

Page 79: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

79

SQL

Differenza e nidificazione

select Nomefrom Impiegatoexceptselect Cognome as Nomefrom Impiegato

select Nomefrom Impiegato Iwhere not exists

(select *from Impiegatowhere Cognome = I.Nome)

Page 80: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

80

SQL

Massimo e nidificazione

“L’impiegato con lo stipendio massimo”

select *from Impiegatowhere Stipendio = (select max(Stipendio)

from Impiegato)

Page 81: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 82: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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')

Page 83: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 84: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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)

Page 85: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 86: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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'

Page 87: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 88: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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)

)

Page 89: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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 ))

Page 90: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 91: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 92: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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)

Page 93: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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)

Page 94: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 95: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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

Page 96: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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)

Page 97: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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 ]

Page 98: SQL - Plone sitecs.unibo.it/~moretti/lezione-14-0607.pdf · SQL Violazione dei vincoli • per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento,

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