106
SQL SQL

SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

SQL

SQL

Page 2: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

3

SQL

Domini

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

Page 4: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

10

SQL

Richiamo: base di daticon 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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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. modifichedell’attributo Provincia e cancellazione di righe da Vigile)

Page 13: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 contente 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 manipola il dizionario dei dati

Page 18: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

25

SQL

Espressioni nella target list

select Stipendio/12 as StipendioMensilefrom Impiegato

where Cognome = 'Bianchi'

StipendioMensile3.00

Page 26: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

26

SQL

Disgiunzione

select Nome, Cognomefrom Impiegatowhere Dipart = 'Amministrazione' or

Dipart = 'Produzione'

Nome CognomeMario RossiCarlo Bianchi

Giuseppe VerdiPaola BorroniMarco Franco

Page 27: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

27

SQL

Condizione complessa

select Nomefrom Impiegatowhere Cognome = 'Rossi' and

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

NomeMario

Page 28: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

29

SQL

Gestione dei valori nulli

“Gli impiegati che hanno o potrebbero avere uno stipendio minore di 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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

34

SQL

Proiezione: duplicati

select Cognomefrom Impiegato

CognomeRossi

BianchiVerdiNeri

RossiLanzi

BorroniFranco

select distinct Cognomefrom Impiegato

CognomeRossi

BianchiVerdiNeriLanzi

BorroniFranco

Page 35: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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, padrefrom maternita join paternita on paternita.figlio = maternita.figlio

Page 41: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

60

SQL

Sintassi, riassumiamo

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

Page 61: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

76

SQL

Semantica delle espressioni “correlate”

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

Page 77: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

80

SQL

Massimo e nidificazione

“L’impiegato con lo stipendio massimo”

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

from Impiegato)

Page 81: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 se il controllo sul fatto che le righe vengono aggiornate dalla vista debba essere effettuato solo all’ultimo livello della vista

• cascaded (nel caso di viste su viste) specifica che l’aggiornamento della vista debba essere propagato

Page 92: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 previlegio– l’utente che riceve il previlegio– l’azione che viene permessa sulla risorsa– se il privilegio può esser trasmesso o meno ad altri utenti

Page 96: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

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 sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

98

SQL

Opzioni di grant e revoke

La revoca deve essere fatta dall’utente che aveva concesso Iprevilegi

• restrict (di default) specifica che il comando non deveessere eseguito qualora la revoca dei previlegi all’utentecomporti qualche altra revoca (dovuta ad un precedente grant option)

• cascade invece forza l’esecuzione del comando

• Attenzione alle reazioni a catena

Page 99: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

99

SQL

SQL immerso in linguaggio ospite"embedded SQL"

• in applicazioni complesse, è spesso necessario “immergere”istruzioni SQL in programmi tradizionali (Pascal, C, COBOL)

• i programmi con SQL immerso sono analizzati da precompilatoriche traducono le istruzioni SQL

• le variabili del programma possono essere usate come parametri nelle istruzioni SQL (precedute da ':')

• select che producano una sola ennupla e operazioni di aggiornamento possono essere immerse senza problemi (con opportuno meccanismo di trasmissione dei risultati)

• esiste di solito una variabile di sistema sqlcode che dopo l'esecuzione di un'operazione assume valore zero se essa ha avuto successo e valore diverso altrimenti

Page 100: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

100

SQL

Relazioni e record: cursori

• problema fondamentale: “disadattamento di impedenza”– i linguaggi tradizionali gestiscono record uno alla volta– SQL produce insiemi di ennuple

• soluzione: cursore– accede a tutte le ennuple di una interrogazione in modo

globale– le trasmette al programma una alla volta

Page 101: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

101

SQL

Operazioni sui cursori

Definizione del cursoredeclare NomeCursore [ scroll ] cursor for SelectSQL[ for < read only | update [ of Attributo {, Attributo } ] > ]

Esecuzione dell'interrogazioneopen NomeCursore

Utilizzo dei risultati (una ennupla alla volta)fetch NomeCursore into ListaVariabili

Disabilitazione del cursoreclose cursor NomeCursore

Accesso alla ennupla corrente (di un cursore su singola relazione a fini di aggiornamento/cancellazione)current of NomeCursore

nella clausola where

Page 102: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

102

SQL

Frammento di programma con SQL immersowrite('nome della citta''?');readln(citta);EXEC SQL DECLARE P CURSOR FOR

SELECT NOME, REDDITOFROM PERSONEWHERE CITTA = :citta ;

EXEC SQL OPEN P ;EXEC SQL FETCH P INTO :nome, :reddito ;while SQLCODE = 0do begin

write('nome della persona:', nome, 'aumento?');readln(aumento);EXEC SQL UPDATE PERSONE

SET REDDITO = REDDITO + :aumentoWHERE CURRENT OF P

EXEC SQL FETCH P INTO :nome, :redditoend;

EXEC SQL CLOSE CURSOR P

Page 103: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

103

SQL

Altro esempiovoid VisualizzaStipendiDipart(char NomeDip[]){

char Nome[20], Cognome[20];long int Stipendio;$ declare ImpDip cursor for

select Nome, Cognome, Stipendiofrom Impiegatowhere Dipart = :NomeDip;

$ open ImpDip;$ fetch ImpDip into :Nome, :Cognome, :Stipendio;printf("Dipartimento %s\n",NomeDip);while (sqlcode == 0){

printf("Nome e cognome dell'impiegato: %s %s",Nome,Cognome);

printf("Attuale stipendio: %d\n",Stipendio);$ fetch ImpDip into :Nome, :Cognome, :Stipendio;

}$ close cursor ImpDip;

}

Page 104: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

104

SQL

SQL dinamico

• Quando le applicazioni non conoscono a compile-time i costruttiSQL da eseguire, allora è necessario SQL dinamico

• Problema principale: gestire il trasferimento di dati traprogramma ed ambiente SQL

• Per l’esecuzione diretta (solo per comandi senza parametri):execute immediate SQLStatement

• Per l’esecuzione preceduta dall’analisi dei construtti:prepare CommandName from SQLStatement

– Seguita da:execute CommandName [ into TargetList ]

[ using ParameterList ]

Page 105: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

105

SQL

(Stored) Procedure

• SQL-2 consente di definire le procedure (chiamate storedprocedures)

• Le stored procedure sono parte dello schemaprocedure AssignCity(:Dep char(20),

:City char(20))update Departmentset City = :Citywhere Name = :Dep

• SQL-2 non consente di scrivere delle procedure complesse(solo singoli comandi SQL). Sistemi diversi hanno restrizionidiverse.

• Molti sistemi offrono delle estensioni SQL che consentono discrivere procedure complesse (es., Oracle PL/SQL)

Page 106: SQL - Plone sitemoretti/lezione-15.pdf · SQL Join di una relazione con se stessa “Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre”

106

SQL

Procedure in Oracle PL/SQLProcedure Addebita(CodConto char(5),Prelievo integer) isTroppoScoperto exeption;AmmontarePrec integer;NuovoAmmontare integer;Limite integer;beginselect Ammontare, Scoperto into AmmontarePrec, Limite

from ContoCorrentewhere CodiceConto = CodContofor update of Ammontare;

NuovoAmmontare := AmmontarePrec - Prelievo;if NuovoAmmonotare > Limite

then update ContoCorrenteset Ammontare = NuovoAmmonotarewhere CodiceConto = CodConto;

elseinsert into TransazioniOltreScopertovalues(CodConto,Prelievo,sysdate);

end if;end Addebita;