+ All Categories
Home > Documents > Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

Date post: 03-Jan-2016
Category:
Upload: sylvia-ware
View: 28 times
Download: 0 times
Share this document with a friend
Description:
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999. Capitolo 4: SQL 11/10/2001. SQL. Structured Query Language è un linguaggio con varie funzionalità: contiene sia il DDL sia il DML ne esistono varie versioni vediamo gli aspetti essenziali, non i dettagli. SQL: "storia". - PowerPoint PPT Presentation
122
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999 Capitolo 4: SQL SQL 11/10/2001
Transcript
Page 1: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

Atzeni, Ceri, Paraboschi, TorloneBasi di dati

McGraw-Hill, 1999

Capitolo 4:

SQLSQL

11/10/2001

Page 2: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

2

SQL

• Structured Query Language• è un linguaggio con varie funzionalità:

• contiene sia il DDL sia il DML• ne esistono varie versioni • vediamo gli aspetti essenziali, non i

dettagli

Page 3: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

3

SQL: "storia"

• prima proposta SEQUEL (1974); • prime implementazioni in SQL/DS e

Oracle (1981)• dal 1983 ca. "standard di fatto" • standard (1986, poi 1989 e infine 1992,

1999) recepito in parte

Page 4: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

4

Definizione dei dati in SQL

• Istruzione CREATE TABLE: • definisce uno schema di relazione e

ne crea un’istanza vuota• specifica attributi, domini e vincoli

Page 5: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

5

CREATE TABLE, esempio

CREATE TABLE Impiegato(Matricola CHAR(6) PRIMARY KEY, Nome CHAR(20) NOT NULL,

Cognome CHAR(20) NOT NULL, Dipart CHAR(15),Stipendio NUMERIC(9) DEFAULT 0, FOREIGN KEY(Dipart) REFERENCES

Dipartimento(NomeDip), UNIQUE (Cognome,Nome) )

Page 6: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

6

Domini

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

riutilizzabili)

Page 7: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

7

Domini elementari

• Carattere: singoli caratteri o stringhe, anche di lunghezza variabile

• Bit: singoli booleani o stringhe• Numerici, esatti e approssimati• Data, ora, intervalli di tempo

Page 8: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

8

Definizione di domini

• Istruzione CREATE DOMAIN: • definisce un dominio (semplice),

utilizzabile in definizioni di relazioni, anche con vincoli e valori di default

Page 9: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

9

CREATE DOMAIN, esempio

CREATE DOMAIN Voto AS SMALLINT DEFAULT NULLCHECK ( value >=18 AND value <= 30 )

Page 10: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

10

Vincoli intrarelazionali

• NOT NULL • UNIQUE definisce chiavi• PRIMARY KEY: chiave primaria (una

sola, implica NOT NULL)• CHECK, vedremo più avanti

Page 11: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

11

UNIQUE e PRIMARY KEY

• due forme:• nella definzione di un attributo, se

forma da solo la chiave• come elemento separato

Page 12: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

12

CREATE TABLE, esempio

CREATE TABLE Impiegato(Matricola CHAR(6) PRIMARY KEY, Nome CHAR(20) NOT NULL,

Cognome CHAR(20) NOT NULL, Dipart CHAR(15),Stipendio NUMERIC(9) DEFAULT 0, FOREIGN KEY(Dipart) REFERENCES

Dipartimento(NomeDip), UNIQUE (Cognome,Nome) )

Page 13: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

13

Matricola CHAR(6) PRIMARY KEY

Matricola CHAR(6),…,PRIMARY KEY (Matricola)

PRIMARY KEY, alternative

Page 14: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

14

CREATE TABLE, esempio

CREATE TABLE Impiegato(Matricola CHAR(6) PRIMARY KEY, Nome CHAR(20) NOT NULL,

Cognome CHAR(20) NOT NULL, Dipart CHAR(15),Stipendio NUMERIC(9) DEFAULT 0, FOREIGN KEY(Dipart) REFERENCES

Dipartimento(NomeDip), UNIQUE (Cognome,Nome) )

Page 15: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

15

Chiavi su più attributi, attenzione

Nome CHAR(20) NOT NULL, Cognome CHAR(20) NOT NULL, UNIQUE (Cognome,Nome),

Nome CHAR(20) NOT NULL UNIQUE, Cognome CHAR(20) NOT NULL UNIQUE,

• Non è la stessa cosa!

Page 16: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

16

Vincoli interrelazionali

• CHECK, vedremo più avanti • REFERENCES e FOREIGN KEY permettono di

definire vincoli di integrità referenziale • di nuovo due sintassi

• per singoli attributi• su più attributi

• E' possibile definire politiche di reazione alla violazione

Page 17: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

17

Matricola

3987

3295

9345

Vigili Cognome

Rossi

Neri

Neri

Nome

Luca

Piero

Mario

Mori Gino7543

InfrazioniCodice

34321

73321

64521

53524

Data

1/2/95

4/3/95

5/4/96

5/2/98

Vigile

3987

3295

3295

9345

Prov Numero

MI

TO

PR

PR

39548K

E39548

839548

839548

Page 18: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

18

InfrazioniCodice

34321

73321

64521

53524

Data

1/2/95

4/3/95

5/4/96

5/2/98

Vigile

3987

3295

3295

9345

Prov Numero

MI

TO

PR

PR

39548K

E39548

839548

839548

Auto Prov Numero

MI

TO

PR

39548K

E39548

839548

Cognome

Rossi

Rossi

Neri

Nome

Mario

Mario

Luca

Page 19: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

19

CREATE TABLE, esempio

CREATE TABLE Infrazioni(Codice CHAR(6) NOT NULL PRIMARY KEY,

Data DATE NOT NULL, Vigile INTEGER NOT NULL

REFERENCES Vigili(Matricola), Provincia CHAR(2), Numero CHAR(6) , FOREIGN KEY(Provincia, Numero)

REFERENCES Auto(Provincia, Numero) )

Page 20: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

20

Modifiche degli schemi

ALTER DOMAINALTER TABLEDROP DOMAINDROP TABLE...

Page 21: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

21

Definzione degli indici

• è rilevante dal punto di vista delle prestazioni

• ma è a livello fisico e non logico• in passato era importante perché in

alcuni sistemi era l'unico mezzo per definire chiavi

• CREATE INDEX

Page 22: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

22

In pratica

• In molti sistemi si utilizzano strumenti diversi dal codice SQL per definire lo schema della base di dati

Page 23: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

23

SQL, operazioni sui dati

• interrogazione: • SELECT

• modifica:• INSERT, DELETE, UPDATE

Page 24: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

24

Istruzione SELECT

SELECT ListaAttributiFROM ListaTabelle[ WHERE Condizione ]

• "target list"• clausola FROM • clausola WHERE

Page 25: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

25

Nome Età

Persone

RedditoAndrea 27

Maria 55Anna 50

Filippo 26Luigi 50

Franco 60Olga 30

Sergio 85Luisa 75

Aldo 2521

4235304020413587

15

MadreMaternità FiglioLuisa

AnnaAnnaMariaMaria

LuisaMaria

OlgaFilippoAndrea

Aldo

Luigi

PadrePaternità Figlio

LuigiLuigi

FrancoFranco

SergioOlga

FilippoAndrea

Aldo

Franco

Page 26: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

26

Selezione e proiezione

• Nome e reddito delle persone con meno di trenta anni

PROJNome, Reddito(SELEta<30(Persone))

select nome, redditofrom personewhere eta < 30

Page 27: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

27

Nome Età

Persone

RedditoAndrea 27 21

Maria 55 42Anna 50 35

Filippo 26 30Luigi 50 40

Franco 60 20Olga 30 41

Sergio 85 35Luisa 75 87

Aldo 25 15Andrea 27 21

Aldo 25 15

Filippo 26 30

Andrea 27 21Aldo 25 15

Filippo 26 30

211530

Reddito

Page 28: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

28

SELECT, abbreviazioni

select nome, redditofrom personewhere eta < 30

select p.nome as nome, p.reddito as reddito

from persone pwhere p.eta < 30

Page 29: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

29

Selezione, senza proiezione

• Nome, età e reddito delle persone con meno di trenta anni

SELEta<30(Persone)

select *from personewhere eta < 30

Page 30: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

30

SELECT, abbreviazioni

select *from personewhere eta < 30

select nome, età, redditofrom personewhere eta < 30

Page 31: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

31

Proiezione, senza selezione

• Nome e reddito di tutte le persone

PROJNome, Reddito(Persone)

select nome, redditofrom persone

Page 32: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

32

SELECT, abbreviazioni

• R(A,B)

select *from R

equivale (intutivamente) aselect X.A as A, X.B as Bfrom R Xwhere true

Page 33: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

33

Espressioni nella target list

select Reddito/2 as redditoSemestralefrom Personewhere Nome = 'Luigi'

Page 34: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

34

Condizione complessa

select *from personewhere reddito > 25

and (eta < 30 or eta > 60)

Page 35: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

35

Condizione “LIKE”

• Le persone che hanno un nome che inizia per 'A' e ha una 'd' come terza lettera

select * from persone where nome like 'A_d%'

Page 36: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

36

Cognome Filiale EtàMatricola

Neri Milano 455998Rossi Roma 327309

Bruni Milano NULL9553

Impiegati

Neri Milano 455998Bruni Milano NULL9553

SEL Età > 40 OR Età IS NULL (Impiegati)

Neri Milano 455998Bruni Milano NULL9553

Gestione dei valori nulli

Page 37: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

37

• Gli impiegati la cui età è o potrebbe essere maggiore di 40

SEL Età > 40 OR Età IS NULL (Impiegati)

select *from impiegatiwhere eta > 40 or eta is null

Page 38: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

38

SQL e algebra relazionale

• R1(A1,A2) R2(A3,A4)

select R1.A1, R2.A4 from R1, R2where R1.A2 = R2.A3

• prodotto cartesiano (FROM)• selezione (WHERE)• proiezione (SELECT)

Page 39: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

39

SQL e algebra relazionale

• R1(A1,A2) R2(A3,A4)

select R1.A1, R2.A4 from R1, R2where R1.A2 = R2.A3

PROJ A1,A4 (SELA2=A3 (R1 JOIN R2))

Page 40: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

40

• possono essere necessarie ridenominazioni• nel prodotto cartesiano• nella target list

select X.A1 AS B1, ...from R1 X, R2 Y, R1 Zwhere X.A2 = Y.A3 AND ...

Page 41: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

41

select X.A1 AS B1, Y.A4 AS B2from R1 X, R2 Y, R1 Zwhere X.A2 = Y.A3 AND Y.A4 = Z.A1

REN B1,B2A1,A4 (PROJ A1,A4 (SEL A2 = A3 AND A4 = C1(

R1 JOIN R2 JOIN REN C1,C2 A1,A2 (R1))))

Page 42: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

42

Cognome Filiale StipendioMatricola

Neri Milano 645998Neri Napoli 557309

Rossi Roma 645698Rossi Roma 449553

• cognome e filiale di tutti gli impiegati

PROJ Cognome, Filiale (Impiegati)

Page 43: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

43

Cognome Filiale

Neri MilanoNeri Napoli

Rossi Roma

Cognome Filiale

Neri MilanoNeri Napoli

Rossi RomaRossi Roma

selectcognome, filiale

from impiegati

select distinctcognome, filiale

from impiegati

Page 44: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

44

Nome Età

Persone

RedditoAndrea 27

Maria 55Anna 50

Filippo 26Luigi 50

Franco 60Olga 30

Sergio 85Luisa 75

Aldo 2521

4235304020413587

15

MadreMaternità FiglioLuisa

AnnaAnnaMariaMaria

LuisaMaria

OlgaFilippoAndrea

Aldo

Luigi

PadrePaternità Figlio

LuigiLuigi

FrancoFranco

SergioOlga

FilippoAndrea

Aldo

Franco

Page 45: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

45

Selezione, proiezione e join

• I padri di persone che guadagnano più di venti milioni

PROJPadre(paternita JOIN Figlio =Nome

SELReddito>20 (persone))

select distinct padrefrom persone, paternitawhere figlio = nome and

reddito > 20

Page 46: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

46

Join naturale

• Padre e madre di ogni persona

paternita JOIN maternita

select paternita.figlio,padre, madrefrom maternita, paternitawhere paternita.figlio = maternita.figlio

Page 47: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

47

• Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre

PROJNome, Reddito, RP (SELReddito>RP

(RENNP,EP,RP Nome,Eta,Reddito(persone)JOINNP=Padre

(paternita JOIN 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 48: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

48

SELECT, con ridenominazione del risultato

select figlio, f.reddito as reddito, p.reddito as redditoPadre

from persone p, paternita, persone fwhere p.nome = padre and figlio = f.nome

and .reddito > p.reddito

Page 49: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

49

Join esplicito

• Padre e madre di ogni persona

select paternita.figlio,padre, madrefrom maternita, paternitawhere paternita.figlio = maternita.figlio

select madre, paternita.figlio, padre from maternita join paternita on

paternita.figlio = maternita.figlio

Page 50: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

50

SELECT con join esplicito, sintassi

SELECT …FROM Tabella { … JOIN Tabella ON CondDiJoin }, …[ WHERE AltraCondizione ]

Page 51: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

51

• Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre

select f.nome, f.reddito, p.redditofrom persone p, paternita, persone fwhere p.nome = padre and

figlio = f.nome andf.reddito > p.reddito

select f.nome, f.reddito, p.redditofrom persone p join paternita on p.nome = padre

join persone f on figlio = f.nome where f.reddito > p.reddito

Page 52: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

52

Ulteriore estensione: join naturale(meno diffuso)

PROJFiglio,Padre,Madre(paternita JOIN Figlio = Nome REN Nome=Figlio(maternita))

paternita JOIN maternita

select madre, paternita.figlio, padre from maternita join paternita on

paternita.figlio = maternita.figlio

select madre, paternita.figlio, padre from maternita natural join paternita

Page 53: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

53

Join esterno: "outer join"

• Padre e, se nota, madre di ogni persona

select paternita.figlio, padre, madrefrom paternita left join maternita

on paternita.figlio = maternita.figlio

select paternita.figlio, padre, madrefrom paternita left outer join maternita

on paternita.figlio = maternita.figlio

• outer e' opzionale

Page 54: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

54

Outer join

select paternita.figlio, padre, madrefrom maternita join paternita

on maternita.figlio = paternita.figlio

select paternita.figlio, padre, madrefrom maternita left outer join paternita

on maternita.figlio = paternita.figlio

select paternita.figlio, padre, madrefrom maternita full outer join paternita

on maternita.figlio = paternita.figlio

Page 55: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

55

Ordinamento del risultato

• Nome e reddito delle persone con meno di trenta anni in ordine alfabetico

select nome, redditofrom personewhere eta < 30order by nome

Page 56: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

56

Persone

Nome RedditoAndrea 21

Aldo 15Filippo 30

Persone

Nome Reddito

Andrea 21Aldo 15

Filippo 30

select nome, redditofrom personewhere eta < 30

select nome, redditofrom personewhere eta < 30order by nome

Page 57: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

57

Operatori aggregati

• Nelle espressioni della target list possiamo avere anche espressioni che calcolano valori a partire da insiemi di ennuple:• conteggio, minimo, massimo, media, totale• sintassi base (semplificata):

Funzione ( [ DISTINCT ] * )Funzione ( [ DISTINCT ] Attributo )

Page 58: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

58

Operatori aggregati: COUNT

• Il numero di figli di Franco

select count(*) as NumFigliDiFrancofrom Paternitawhere Padre = 'Franco'

• l’operatore aggregato (count) viene applicato al risultato dell’interrogazione:

select * from Paternitawhere Padre = 'Franco'

Page 59: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

59

PadrePaternità Figlio

LuigiLuigi

SergioOlga

FilippoFrancoFranco

AndreaAldo

Franco

FrancoFranco

AndreaAldo

NumFigliDiFranco2

Page 60: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

60

COUNT e valori nulli

select count(*) from persone

select count(reddito) from persone

select count(distinct reddito) from persone

Nome EtàPersone RedditoAndrea 27

Maria 55Anna 50

Aldo 2521

2135

NULL

Page 61: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

61

Altri operatori aggregati

• SUM, AVG, MAX, MIN

• Media dei redditi dei figli di Franco

select avg(reddito) from persone join paternita on nome=figlio where padre='Franco'

Page 62: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

62

Operatori aggregati e valori nulli

select avg(reddito) as redditomediofrom persone

Nome EtàPersone RedditoAndrea 27

Maria 55Anna 50

Aldo 2530

3636

NULL

Page 63: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

63

Operatori aggregati e target list

• un’interrogazione scorretta:

select nome, max(reddito)from persone

• di chi sarebbe il nome? La target list deve essere omogenea

select min(eta), avg(reddito)from persone

Page 64: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

64

• Le funzioni possono essere applicate a partizioni delle relazioni

• Clausola GROUP BY:GROUP BY listaAttributi

Operatori aggregati e raggruppamenti

Page 65: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

65

• Il numero di figli di ciascun padre

select padre, count(*) AS NumFiglifrom paternitagroup by Padre

Operatori aggregati e raggruppamenti

Padrepaternita Figlio

LuigiLuigi

SergioOlga

FilippoFrancoFranco

AndreaAldo

Franco Padre NumFigli

LuigiSergio

2Franco 2

1

Page 66: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

66

Semantica di interrogazioni con operatori aggregati e

raggruppamenti

1. interrogazione senza group by e senza operatori aggregatiselect *from paternita

2. si raggruppa e si applica l’operatore aggregato a ciascun gruppo

Page 67: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

67

Raggruppamenti e target list

scorrettaselect padre, avg(f.reddito), p.redditofrom persone f join paternita on figlio = nome join

persone p on padre =p.nomegroup by padre

correttaselect padre, avg(f.reddito), p.redditofrom persone f join paternita on figlio = nome join

persone p on padre =p.nomegroup by padre, p.reddito

Page 68: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

68

Condizioni sui gruppi

• I padri i cui figli hanno un reddito medio maggiore di 25

select padre, avg(f.reddito)from persone f join paternita on figlio = nome group by padre having avg(f.reddito) > 25

Page 69: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

69

WHERE o HAVING?

• I padri i cui figli sotto i 30 anni hanno un reddito medio maggiore di 20

select padre, avg(f.reddito)from persone f join paternita on figlio = nomewhere eta < 30 group by padre having avg(f.reddito) > 25

Page 70: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

70

Sintassi, riassumiamo

SelectSQL ::= select ListaAttributiOEspressionifrom ListaTabelle[ where CondizioniSemplici ][ group by

ListaAttributiDiRaggruppamento ][ having CondizioniAggregate ][ order by ListaAttributiDiOrdinamento ]

Page 71: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

71

Unione, intersezione e differenza

• La select da sola non permette di fare unioni; serve un costrutto esplicito:

select … union [all]select ...

• i duplicati vengono eliminati (a meno che si usi all); anche dalle proiezioni!

Page 72: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

72

Notazione posizionale!

select padre from paternitaunionselect madrefrom maternita

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

Page 73: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

73

Luisa

AnnaAnnaMariaMaria

LuisaMaria

OlgaFilippoAndrea

Aldo

Luigi

Figlio

LuigiLuigi

FrancoFranco

SergioOlga

FilippoAndrea

Aldo

Franco

Luisa

AnnaAnnaMariaMaria

LuisaMaria

OlgaFilippoAndrea

Aldo

Luigi

Padre Figlio

LuigiLuigi

FrancoFranco

SergioOlga

FilippoAndrea

Aldo

Franco

Page 74: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

74

Notazione posizionale, 2

select padre, figliofrom paternitaunionselect figlio, madrefrom maternita

select padre, figliofrom paternitaunionselect madre, figliofrom maternita

Page 75: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

75

Notazione posizionale, 3

• Anche con le ridenominazioni non cambia niente:select padre as genitore, figliofrom paternitaunionselect figlio, madre as genitorefrom maternita

• Corretta:select padre as genitore, figliofrom paternitaunionselect madre as genitore, figlio from maternita

Page 76: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

76

Differenza

select Nomefrom Impiegatoexceptselect Cognome as Nomefrom Impiegato

• vedremo che si può esprimere con select nidificate

Page 77: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

77

Intersezione

select Nomefrom Impiegatointersectselect Cognome as Nomefrom Impiegato

• equivale a

select I.Nomefrom Impiegato I, Impiegato Jwhere I.Nome = J.Cognome

Page 78: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

78

Interrogazioni nidificate

• le condizioni atomiche permettono anche • il confronto fra un attributo (o più,

vedremo poi) e il risultato di una sottointerrogazione

• quantificazioni esistenziali

Page 79: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

79

• nome e reddito del padre di Franco

select Nome, Redditofrom Persone, Paternitawhere Nome = Padre and Figlio = 'Franco'

select Nome, Redditofrom Personewhere Nome = ( select Padre

from Paternita where Figlio = 'Franco')

Page 80: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

80

Interrogazioni nidificate, commenti

• 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 81: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

81

• Nome e reddito dei padri di persone che guadagnano più di 20 milioni

select distinct P.Nome, P.Redditofrom Persone P, Paternita, Persone Fwhere P.Nome = Padre and Figlio = F.Nome

and F.Reddito > 20

select Nome, Redditofrom Personewhere Nome in (select Padre

from Paternitawhere Figlio = any (select Nome

from Personewhere Reddito > 20))

Page 82: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

82

• Nome e reddito dei padri di persone che guadagnano più di 20 milioni

select distinct P.Nome, P.Redditofrom Persone P, Paternita, Persone Fwhere P.Nome = Padre and Figlio = F.Nome

and F.Reddito > 20

select Nome, Redditofrom Personewhere Nome in (select Padre

from Paternita, Persone where Figlio = Nomeand Reddito > 20)

Page 83: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

83

Interrogazioni nidificate, commenti, 2

• 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

Page 84: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

84

• Nome e reddito dei padri di persone che guadagnano più di 20 milioni, con indicazione del reddito del figlio

select distinct P.Nome, P.Reddito, F.Redditofrom Persone P, Paternita, Persone Fwhere P.Nome = Padre and Figlio = F.Nome

and F.Reddito > 20

select Nome, Reddito, ???? from Personewhere Nome in (select Padre

from Paternitawhere Figlio = any (select Nome

from Personewhere Reddito > 20))

Page 85: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

85

Interrogazioni nidificate, commenti, 3

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

• in un blocco si può fare riferimento a variabili definite in blocchi più esterni; la semantica base (prodotto cartesiano, selezione, proiezione) non funziona più, vedremo presto

Page 86: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

86

Quantificazione esistenziale

• Ulteriore tipo di condizione• EXISTS ( Sottoespressione )

Page 87: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

87

• Le persone che hanno almeno un figlio

select *from Personewhere exists ( select *

from Paternitawhere Padre = Nome)

orexists ( select *

from Maternitawhere Madre = Nome)

Page 88: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

88

• 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 and Reddito <= 20)

Page 89: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

89

Semantica delle espressioni “correlate”

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

Page 90: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

90

Visibilità

• scorretta:

select *from Impiegatowhere Dipart in (select Nome from Dipartimento D1 where Nome = 'Produzione') or Dipart in (select Nome from Dipartimento D2 where D2.Citta = D1.Citta)

Page 91: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

91

Disgiunzione e unione (ma non sempre)select * from Persone where Reddito > 30

union select F.*from Persone F, Paternita, Persone Pwhere F.Nome = Figlio and Padre = P.Nome

and P.Reddito > 30

select *from Persone Fwhere Reddito > 30 or

exists (select *from Paternita, Persone Pwhere F.Nome = Figlio and Padre =

P.Nomeand P.Reddito > 30)

Page 92: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

92

Differenza e nidificazione

select Nome from Impiegatoexceptselect Cognome as Nome from Impiegato

select Nomefrom Impiegato Iwhere not exists (select *

from Impiegatowhere Cognome = I.Nome)

Page 93: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

93

Massimo e nidificazione

• La persona (o le persone) con il reddito massimo

select *from personewhere reddito = ( select max(reddito)

from persone)

Page 94: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

94

Operazioni di aggiornamento

• operazioni di• inserimento: insert• eliminazione: delete• modifica: update

• di una o più ennuple di una relazione• sulla base di una condizione che può

coinvolgere anche altre relazioni

Page 95: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

95

Inserimento

INSERT INTO Tabella [ ( Attributi ) ] VALUES( Valori )

oppure

INSERT INTO Tabella [ ( Attributi )] SELECT ...

Page 96: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

96

INSERT INTO Persone VALUES ('Mario',25,52)

INSERT INTO Persone(Nome, Eta, Reddito) VALUES('Pino',25,52)

INSERT INTO Persone(Nome, Reddito) VALUES('Lino',55)

INSERT INTO Persone ( Nome )SELECT PadreFROM PaternitaWHERE Padre NOT IN (SELECT Nome FROM Persone)

Page 97: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

97

Inserimento , commenti

• 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 98: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

98

Eliminazione di ennuple

DELETE FROM Tabella [ WHERE Condizione ]

Page 99: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

99

DELETE FROM PersoneWHERE Eta < 35

DELETE FROM PaternitaWHERE Figlio NOT in ( SELECT Nome FROM Persone)

DELETE FROM Paternita

Page 100: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

100

Eliminazione, commenti

• 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

Page 101: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

101

Modifica di ennuple

UPDATE NomeTabellaSET Attributo = < Espressione |

SELECT … | NULL | DEFAULT >

[ WHERE Condizione ]

Page 102: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

102

UPDATE Persone SET Reddito = 45WHERE Nome = 'Piero'

UPDATE Persone SET Reddito = Reddito * 1.1WHERE Eta < 30

Page 103: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

103

Vincoli di integrità generici: check

• Specifica di vincoli di ennupla (e anche vincoli più complessi)

check ( Condizione )

Page 104: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

104

Check, esempio

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 J where Superiore = J.Matricola) )

Page 105: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

105

Vincoli di integrità generici: asserzioni

• Specifica vincoli a livello di schema

create assertion NomeAss check ( Condizione )

create assertion AlmenoUnImpiegato check (1 <= ( select count(*) from Impiegato ))

Page 106: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

106

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

Page 107: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

107

create view ImpiegatiAmminPoveri asselect *from ImpiegatiAmminwhere Stipendio < 50with check option

Page 108: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

108

Un’interrogazione non standard

• La nidificazione nella having non è ammessa

select Dipartfrom Impiegatogroup by Diparthaving sum(Stipendio) >= all (select sum(Stipendio) from Impiegato group by Dipart)

Page 109: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

109

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 110: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

110

Ancora sulle viste

• Interrogazione scorrettaselect avg(count(distinct Ufficio))from Impiegatogroup by Dipart

• Con una vistacreate view DipartUffici(NomeDip,NroUffici) as

select Dipart, count(distinct Ufficio)from Impiegatogroup by Dipart;

select avg(NroUffici)from DipartUffici

Page 111: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

111

Access control

• Every element of the DB can be protected (tables, attributes, views, domains, etc.)

• The creator of a resource assigns privileges to others • A predefined user _system represents the database

administrator and has complete access to all the resources

• A privilege is characterized by:• the resource• the user who grants the privilege• the user who receives the privilege• the action that is allowed on the resource• whether or not the privilege can be passed on to

other users

Page 112: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

112

Types of privilege

• SQL offers six types of privilege• insert: to insert a new object into the resource• update: to modify the resource content• delete: to remove an object from the resource• select: to access the resource content in a query• references: to build a referential integrity

constraint with the resource (may limit the ability to modify the resource)

• usage: to use the resource in a schema definition (e.g., a domain)

Page 113: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

113

grant and revoke

• To grant a privilege to a user:grant < Privileges | all privileges > on Resource

to Users [ with grant option ]• grant option specifies whether the privilege of

propagating the privilege to other users must be granted

grant select on Department to Stefano• To take away privileges:

revoke Privileges on Resource from Users [ restrict | cascade ]

Page 114: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

114

SQL immerso in linguaggio ospite "embedded SQL"

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

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

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

Page 115: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

115

Embedded SQL

• 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 116: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

116

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 117: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

117

Operazioni sui cursori

Definizione del cursoredeclare NomeCursore [ scroll ] cursor for Select …

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)current of NomeCursore

nella clausola where

Page 118: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

118

write('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 119: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

119

void 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 120: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

120

Dynamic SQL

• When applications do not know at compile-time the SQL statement to execute, they need dynamic SQL

• Major problem: managing the transfer of parameters between the program and the SQL environment

• For direct execution:execute immediate SQLStatement

• For execution preceded by the analysis of the statement:

prepare CommandName from SQLStatement• followed by:execute CommandName [ into TargetList ] [ using ParameterList ]

Page 121: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

121

Procedures

• SQL-2 allows for the definition of procedures, also known as stored procedures

• Stored procedures are part of the schemaprocedure AssignCity(:Dep char(20), :City char(20))

update Departmentset City = :Citywhere Name = :Dep

• SQL-2 does not handle the writing of complex procedures

• Most systems offer SQL extensions that permit to write complex procedures (e.g., Oracle PL/SQL)

Page 122: Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999

11/10/2001 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 4

122

Procedure in Oracle PL/SQLProcedure Debit(ClientAccount char(5),Withdrawal integer) is OldAmount integer; NewAmount integer; Threshold integer;begin select Amount, Overdraft into OldAmount, Threshold from BankAccount where AccountNo = ClientAccount for update of Amount; NewAmount := OldAmount - WithDrawal; if NewAmount > Threshold then update BankAccount set Amount = NewAmount where AccountNo = ClientAccount; else insert into OverDraftExceeded values(ClientAccount,Withdrawal,sysdate); end if;end Debit;


Recommended