42
www.dia.uniroma3.it/~torlone/ Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc Graw Hill 2001) 1 SQL: Structured Query Language DDL DML www.dia.uniroma3.it/~torlone/ Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc Graw Hill 2001) 2 SQL, Data Manipulation Language: -Query SQL (SFW), SQL come ling. interrogazione -Gestione valori nulli -order -aggregati -query innestate operatori: Exists, In, Not In, -Unione, intersezione e differenza tra SFW queries -Outer e Inner join in SQL 2 -Views www.dia.uniroma3.it/~torlone/ Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc Graw Hill 2001) 3 SQL, Data Definition Language: -Domini -Creazione di Tabelle -Creazione di view -Insert, Update, Delete

SQL: Structured Query Language DDL DML - dns2.icar.cnr.it · Basi di Dati P. Atzeni, R.Torlone et al., Mc Graw Hill 2001) 2 SQL, Data Manipulation Language: ... 4 SQL come linguaggio

Embed Size (px)

Citation preview

1

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 1

SQL: Structured Query LanguageDDLDML

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 2

SQL, Data Manipulation Language:-Query SQL (SFW), SQL come ling.

interrogazione-Gestione valori nulli-order-aggregati-query innestate

operatori: Exists, In, Not In, -Unione, intersezione e differenza tra SFW queries-Outer e Inner join in SQL 2-Views

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 3

SQL, Data Definition Language:-Domini-Creazione di Tabelle-Creazione di view-Insert, Update, Delete

2

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 4

SQL come linguaggio di interrogazione

• SQL esprime una query in modo dichiarativo• Queries SQL specificano le proprietà del

risultato e non il modo come è ottenuto• Queries sono tradotte dall’ottimizzatore di queries

in un linguaggio procedurale interno al DBMS• Così facendo, ci si preoccupa della leggibilità

della query più che della sua efficienza.

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 5

SQL queries• Sono espresse da una operazione di SELECT• Sintassi:

select AttrExpr [[ as ] Alias ] {, AttrExpr [[ as ] Alias ] }

from Table [[ as ] Alias ] {, [[ as ] Alias ] }[ where Condition ]

• Le tre parti della query sono in genere chiamate:• target list (dopo il SELECT)• from clause• where clause

• La query genera il prodotto cartesiano delle tabelle nellaclausola FROM, e prende solo le tuple (righe) chesoddisfano la condizione WHERE, e per ogni tupla valutal’espressione degli attributi nella clausola SELECT

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 6

Istruzione SELECT (versione base)

SELECT ListaAttributiFROM ListaTabelle[ WHERE Condizione ]

• target list (lista attributi)• clausola FROM • clausola WHERE

3

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 7

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

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 8

Selezione e proiezione

• Nome e reddito delle persone con meno di trenta anni

πNome, Reddito(σEta<30(Persone))

SELECT nome, redditoFROM personeWHERE eta < 30

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 9

Altro Esempio di Database

EMPLOYEE FirstName Surname Dept Office Salary City Mary Brown Administration 10 45 London Charles White Production 20 36 ToulouseGus Green Administration 20 40 Oxford Jackson Neri Distribution 16 45 Dover Charles Brown Planning 14 80 London Laurence Chen Planning 7 73 WorthingPauline Bradshaw Administration 75 40 Brighton Alice Jackson Production 20 46 Toulouse

DEPARTMENT DeptName Address CityAdministration Bond Street LondonProduction Rue Victor Hugo ToulouseDistribution Pond Road BrightonPlanning Bond Street LondonResearch Sunset Street San José

4

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 10

Semplice query SQL

• Trovare lo Stipendio dell’impiegato di nomeBrown:SELECT Salary as RemunerationFROM EmployeeWHERE Surname = ‘Brown’

• Risultato: Remuneration4580

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 11

* nella lista degli attributi (target list)

• Trovare tutte le informazioni sull’impiegato dinome Brown:SELECT *FROM EmployeeWHERE Surname = ‘Brown’

• Risultato:

FirstName Surname Dept Office Salary CityMary Brown Administration 10 45 LondonCharles Brown Planning 14 80 London

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 12

Espressioni nella lista attributi

• Trovare il salario mensile degli impiegati di nomeWhite:

SELECT Salary / 12 as MonthlySalaryFROM EmployeeWHERE Surname = ‘White’

• Risultato:MonthlySalary

3.00

5

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 13

Una join in SQL

• Trovare il nome e il cognome degli impiegati e la città in cui lavorano:SELECT Employee.FirstName, Employee.Surname,

Department.CityFROM Employee, DepartmentWHERE Employee.Dept = Department.DeptName

• Risultato:FirstName Surname CityMary Brown LondonCharles White ToulouseGus Green LondonJackson Neri BrightonCharles Brown LondonLaurence Chen LondonPauline Bradshaw LondonAlice Jackson Toulouse

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 14

Variabili associate a tabelleTrovare il nome e il cognome degli impiegati

e la città in cui lavorano (usando alias)SELECT FirstName, Surname, D.CityFROM Employee, Department DWHERE Dept = DeptName

• Risultato FirstName Surname CityMary Brown LondonCharles White ToulouseGus Green LondonJackson Neri BrightonCharles Brown LondonLaurence Chen LondonPauline Bradshaw LondonAlice Jackson Toulouse

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 15

Congiunzione nella condizione

• Trovare nome e cognome degli impiegati chelavorano nell’ufficio 20 del dipartimento“Amministrazione”.SELECT FirstName, SurnameFROM EmployeeWHERE Office = ‘20’ and

Dept = ‘Administration’

• Risultato:FirstName SurnameGus Green

6

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 16

Disgiuzione (or) nella condizione

• Selezionare il nome e il cognome degli impiegatiche lavorano nell’Amministrazione o neldipartimento di Produzione.SELECT FirstName, SurnameFROM EmployeeWHERE Dept = ‘Administration’ or

Dept = ‘Production’

• Risultato: FirstName SurnameMary BrownCharles WhiteGus GreenPauline BradshawAlice Jackson

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 17

Espressioni logiche un po’ più complesse• Selezionare il nome degli impiegati di nome Brown che

lavorano nell’Amministrazione o nel dipartimento diProduzione.

SELECT FirstNameFROM EmployeeWHERE Surname = ‘Brown’ and

(Dept = ‘Administration’ orDept = ‘Production’)

• Risultato: FirstNameMary

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 18

Operatore like

• Selezionare gli impiegati che hanno un cognomela cui seconda lettera è una ‘r’ e termina in ‘n’:

SELECT *FROM EmployeeWHERE Surname like ‘_r%n’

• Risultato:FirstName Surname Dept Office Salary CityMary Brown Administration 10 45 LondonGus Green Administration 20 40 OxfordCharles Brown Planning 14 80 London

7

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 19

Interpretazione algebrica delle queries SQL

• La query generica

SELECT T_1.Attribute_11, …, T_h.Attribute_hmFROM Table_1 T_1, …, Table_n T_nWHERE Condition

• Corrisponde alla seguente query in algebra relazionale:

π T_1.Attribute_11,…,T_h.Attribute_hm (σ Condition (Table_1 ×… ×Table_n))

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 20

Gestione dei valori nulli• Un valore nullo può essere interpretato in diversi modi

• Il valore non è applicabile• Il valore dell’attributo è applicabile ma sconosciuto• Non è noto se il valore sia applicabile oppure no (vedi

capitolo 2)E.g., Stipendio > 40

• SQL-89 usa una logica a due valori• Un confronto con un valore NULL ritorna FALSE

• SQL-2 usa una logica a tre valori• Un confronto con il valore NULL ritorna UNKNOWN

• Si può comunque testare il valore di un attributo:

Attribute is [ not ] null

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 21

Cognome Filiale EtàMatricola

Neri Milano 455998Rossi Roma 327309

Bruni Milano NULL9553

Impiegati

Neri Milano 455998Bruni Milano NULL9553

Neri Milano 455998Bruni Milano NULL9553

Gestione dei valori nulli

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

8

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 22

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

SELECT *FROM impiegatiWHERE eta > 40 OR eta is NULL

Gestione dei valori nulli: test IS NULL

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 23

Duplicati• Nell’algebra relazionale (e come vedremo nel calcolo) I

risutati delle query non contengo duplicati• Il risultato di una query SQL, può avere tuple uguali• I duplicati possono essere eliminati usando l’operatore

DISTINCT

SELECT City SELECT distinct CityFROM Department FROM Department

CityLondonToulouseBrightonLondonSan José

CityLondonToulouseBrightonSan José

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 24

Variabili associate alle tabelleIn alcuni casi è necessario usarle:• Trovare nome e cognome di impiegati con lo stesso

cognome che lavorano nell’amministrazione.SELECT E1.FirstName, E1.SurnameFROM Employee E1, Employee E2WHERE E1.Surname = E2.Surname and

E1.FirstName <> E2.FirstName andE2.Dept = ‘Administration’

• Risultato:

FirstName SurnameCharles Brown

9

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 25

Ordinamento del risultato

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

SELECT nome, redditoFROM personeWHERE eta < 30ORDER by nome

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 26

PersoneNome Reddito

Andrea 21Aldo 15

Filippo 30

PersoneNome Reddito

Andrea 21Aldo 15

Filippo 30

SELECT nome, redditoFROM personeWHERE eta < 30

SELECT nome, redditoSELECT personeWHERE eta < 30ODER BY nome

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 27

Order by: sintassi

La clausola rispetta la seguente sintassi:order by AttributoDiOrdinamento [asc | desc]

{, AttributoDiOrdinamento [asc | desc] }Le righe vengono ordinate in base al primo attributo. Per

valori uguali si considera il secondo attributo della lista, e così via

In assenza di qualificatore (asc, o desc) quello di default è asc: ordinamento dal più piccolo al più grande

10

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 28

Order by: un altro esempio

MI 2020030UNOFIATBB 421 JJ

PZ 1002009DELTALANCIABJ 747 XX

VR 2030020BRAVAFIATAA 652 FF

VR 2030020 PUNTOFIATAB 574 WWNroPatenteModelloMarcaTarga

Ordinare la tabella Automobile ordinato in base alla marcaDiscendente) e al modello

Automobile

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 29

Order by: un altro esempioOrdinare la tabella Automobile in base alla marca disc) e al modello

MI 2020030UNOFIATBB 421 JJ

VR 2030020BRAVAFIATAA 652 FF

VR 2030020BRAVAFIATAA 652 FF

PZ 1002009DELTALANCIABJ 747 XX

NroPatenteModelloMarcaTarga

SELECT *FROM AutomobileORDER BY Marca desc, Modello

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 30

Operatori aggregati (o di aggregazione)

• Non sono presenti in Algebra• Il risultato di una query di aggregazione è cacolta su

tutte le tuple• SQL-2 presenta 5 operatori di aggregazione:

• count• sum• max• min

• avg

11

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 31

Operatore count• count ritorna il numero di valori distinti. Usa la seguente

sintassi

count( * | [ distinct | all ] ListaAttributi )

La prima opzione (*) restituisce il numero di righe

es. Trovare il numero di impiegati:select count(*)from Employee

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 32

distinct ritorna il numero di valori diversi negli attributi della ListaAttributi

es. Trovare il numero di diversi valori dell’attributo Salary per tutte le righe nella tabella Employee. select count(distinct Salary)from Employee

L’opzione ‘all’ ritorna il numero di valori diversi dal valore NULL su un attributo in ListaAttributi

es. Trovare il numero di tuple in EMPLOYEE che hanno valore non NULL sull’attributo Salary.

select count(all Salary)from Employee

Operatore count

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 33

Sum, average, maximum e minimum

• Sintassi< sum | max | min | avg > ([ distinct | all ] AttrEspr )

Sum e Avg, ammettono solo espressioni numeriche.Anche qui gli operatori si applicano sulle righe che soddisfano la

clausola WHERE.sum: somma dei valori preceduti dall’espressionemax, min: rispettivamente ritornano il valore massimo e il minimo

per un attributoAvg: restituisce la media dei valori (i.e., sum diviso count)

12

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 34

Sum, average, maximum e minimum

• Sintassi< sum | max | min | avg > ([ distinct | all ] AttrEspr )

Distinct: elimina i duplicatiAll: trascura solo i valori nulliNon hanno effetto con max e min

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 35

Altro Esempio di Database

EMPLOYEE FirstName Surname Dept Office Salary City Mary Brown Administration 10 45 London Charles White Production 20 36 ToulouseGus Green Administration 20 40 Oxford Jackson Neri Distribution 16 45 Dover Charles Brown Planning 14 80 London Laurence Chen Planning 7 73 WorthingPauline Bradshaw Administration 75 40 Brighton Alice Jackson Production 20 46 Toulouse

DEPARTMENT DeptName Address CityAdministration Bond Street LondonProduction Rue Victor Hugo ToulouseDistribution Pond Road BrightonPlanning Bond Street LondonResearch Sunset Street San José

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 36

Sum, average, maximum e minimum

Trovare la somma dei salari per il dipartimentoamministrativo

SELECT sum(Salary) as SumSalaryFROM EmployeeWHERE Dept = ‘Administration’

• Result: SumSalary125

13

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 37

Sum, average, maximum e minimum

Trovare il salario medio degli impiegati del dipartimentoamministrativo

SELECT avg(Salary) as AvgSalaryFROM EmployeeWHERE Dept = ‘Administration’

• Result:

41.6AvgSalary

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 38

Queries con aggregati e Join

• Trovare il massimo tra i salari tra gli impiegati chelavorano nel dipartimento con sede a Londra:

SELECT max(Salary) as MaxLondonSalFROM Employee, DepartmentWHERE Dept = DeptName and

Department.City = ‘London’

• Result: MaxLondonSal80

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 39

Queries con aggregati

• Trovare il valore massimo e minimo dei salari di tutti gli impiegati

SELECT max(Salary) as MaxSal, min(Salary) as MinSal

FROM Employee

• Risultato:MaxSal MinSal

80 36

14

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 40

Queries con aggregati e target list• E’ corretta la seguente query?

SELECT FirstName, Surname, max(Salary)FROM Employee, DepartmentWHERE Dept = DeptName and

Department.City = ‘London’

Su chi viene fatta il calcolo del max? a quale tupla associarlo?

Gli operatori di aggregazione non costituiscono un meccanismo di selezione ma solo delle funzioni che restituiscono un valore quando sono applicate ad un insieme

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 41

Group by queriesLe queries con aggregati permettono di calcolare l’aggregato

ad un sottoinsieme di tuple (righe)E’ possibile allora avere nella target list un attributo e un

aggregato, A PATTO CHE tale attributo sia specificato in una clausola di group by

• Trovare la somma dei salari di tutti gli impiegati dello stesso dipartimento

select Dept, sum(Salary)as TotSalfrom Employeegroup by Dept

• Risultato: Dept TotSal Administration 125 Distribution 45 Planning 153 Production 82

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 42

Semantica del group by

• Prima, la query è calcolata senza aggregati e senzagroup by

SELECT Dept, SalaryFROM Employee

Dept SalaryAdministration 45Production 36Administration 40Distribution 45Planning 80Planning 73Administration 40Production 46

15

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 43

• … poi, il risultato della query è diviso in sottoinsiemi caratterizzati dagli stessi valori per gli attributi che appaiano come argomenti della cluasolagroup by (è il caso dell’attributo Dept):

• Infine, l’operatore di aggregazione è applicato separatamente ad ogni sottoinsieme

Dept SalaryAdministration 45Administration 40Administration 40Distribution 45Planning 80Planning 73Production 36Production 46

Dept TotSalAdministration 125Distribution 45Planning 153Production 82

Semantica del group by

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 44

Group by ed attributi della target list• Query non corretta

select Officefrom Employeegroup by Dept

• Query non correttaselect DeptName, count(*), D.Cityfrom Employee E join Department D

on (E.Dept = D.DeptName)group by DeptName

• Query correttaselect DeptName, count(*), D.Cityfrom Employee E Department D where (E.Dept = D.DeptName)group by DeptName, D.City

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 45

Condizioni sui Gruppi

• Quando esprimiamo condizioni sul risultato di una groupby, è necessario usare la clausola having

• Trovare quali dipartimenti spendono più di 100 mila euro come salario:

select Deptfrom Employeegroup by Depthaving sum(Salary) > 100

• Risultato:DeptAdministrationPlanning

16

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 46

where o having?

• Solo predicati contenente operatori di aggregazione possono essere inserite nella clausola having

• Selezionare I dipartimenti in cui il salario medio degli impiegati che lavorano nell’ufficio 20 è piu’ alto di 20 mila euro:

select Deptfrom Employeewhere Office = ‘20’group by Depthaving avg(Salary) > 25

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 47

Sintassi di una query SQL

• La sintassi di una query SQL:

select TargetListfrom TableList[ where Condition ][ group by GroupingAttributeList ][ having AggregateCondition ][ order by OrderingAttributeList ]

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 48

Unione, intersezione, differenza in SQLSyntassi:SelectSQL { < union | intersect | except > [ all

] SelectSQL }• Di default gli operatori insiemistici eseguono

eliminazione dei duplicati. Se si vogliono i duplicati si usa l’opzione all

• Selezionare nome e cognome di tutti gli impiegatiselect FirstName as Namefrom Employeeunionselect Surnamefrom Employee

17

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 49

Intersezione• Trovare nella tabella Employee, I nomi che sono

uguali ai cognomi:select FirstName as Namefrom Employeeintersectselect Surnamefrom Employee

• Equivalente a:select E1.FirstName as Namefrom Employee E1, Employee E2where E1.FirstName = E2.Surname

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 50

Differenza

• Selezionare i cognomi degli impiegati che non sono anche nomi di impiegati:select FirstName as Namefrom Employeeexceptselect Surnamefrom Employee

• Come vedremo questa query si può calcolare con query innestate.

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 51

• Nella clausola where, possiamo confrontare un attributo (o più di un attributo) con il risultato di una query SQL:

where listaAttr Operator < any | all > SFW-SQL• any: la condizione where è soddisfatta (true) se almeno una

tupla risultato della query SQL soddisfa la condizione• all: il predicato è soddisfatto (true) se tutte le tuple ritornate

dalla query SQL soddisfano la condizione.

• Possiamo trovare un test esistenzialewhere exists SFW-SQL• La condizione è soddisfatta se SFW-SQL ritorna un insieme

non vuoto• La query SFW-SQL nel where viene chiamata nested query

Interrogazioni nidificate o innestate (nested queries)

18

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 52

Esempio di nested query• Gli impiegati che lavorano nei dipartimenti di Londra

select FirstName, Surnamefrom Employeewhere Dept = any (select DeptName

from Departmentwhere City = ‘London’)

• Senza nested query, è equivalente a:select FirstName, Surnamefrom Employee, Department Dwhere Dept = DeptName and

D.City = ‘London’

• In casi complessi, le queries innestate semplificano la leggibilità

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 53

• Gli impiegati del dipartmento di pianificazione (planning) che hanno lo stesso nome di un membro del dipartimento di produzione (senzanested queries):

SELECT E1.FirstName, E1.SurnameFROM Employee E1, Employee E2WHERE E1. FirstName = E2.FirstName

AND E2.Dept = ‘Production’AND E1.Dept = ‘Planning’

• Con una query innestataSELECT FirstName, SurnameFROM EmployeeWHERE Dept = ‘Planning’AND FirstName = any

(SELECT FirstNameFROM EmployeeWHERE Dept = ‘Production’)

Esempio di nested query

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 54

Negazione con queries innestate

• Trovare il nome dei dipartimenti dove non c’e’ alcun impiegato dinome Brown:SELECT DeptNameFROM DepartmentWHERE DeptName <> all(SELECT Dept

FROM EmployeeWHERE Surname= ‘Brown’)

• Alternatively:SELECT DeptNameFROM Department

EXCEPTSELECT DeptFROM EmployeeWHERE Surname = ‘Brown’

19

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 55

Equivalenza in Algebra

• Trovare il nome dei dipartimenti dove non c’e’ alcun impiegato dinome Brown:SELECT DeptNameFROM DepartmentWHERE DeptName <> all(SELECT Dept

FROM EmployeeWHERE Surname= ‘Brown’)

πdeptName(Departement)-πdeptName (σ surname=‘brown’ EMPLOYEE)

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 56

Operatori in e not in

• Operatore in è equivalente a ‘= any’SELECT FirstName, SurnameFROM EmployeeWHERE Dept in (select DeptName

from Departmentwhere City = ‘London’)

• Operatore not in è equivalente a ‘<> all’SELECT DeptNameFROM DepartmentWHERE DeptName not in(select Dept

from Employeewhere Surname = ‘Brown’)

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 57

max e min con una query innestata• Queries con operatori di aggregazione max e min possono

essere usate come inner queries (interne)• Trovare il dipartimento degli impiegati che guadagnano lo

stipendio più alto • con max:SELECT DeptFROM EmployeeWHERE Salary in (select max(Salary)

from Employee

• Con una nested query:SELECT DeptFROM EmployeeWHERE Salary >= all (select Salary

from Employee)

20

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 58

Semantica delle query innestate

• Una prima interpretazione consiste nel calcolare la query interna e poi valutare la query esterna sul risultato della query interna.

• Questa interpretazione è possibile solo quando non si hanno correlazioni tra variabili definite nella query esterna e variabili nelle query interne

• In questi casi la query interna è valutata per ogni tupla da testare nella query esterna

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 59

Nested queries e variabili:l’operatore exists

Es.: Persone(Nome, Cognome, CodiceTasse)trovare tutti le persone omonime, i.e., persone che hanno lo stesso nome e cognome ma hanno diversi codici delleimposte:SELECT *FROM Persone PWHERE exists (select *

from Persone P1WHERE P1.Nome = P.NomeAND P1.Cognome = P.CognomeAND P1.CodiceTasse <>

P.CodiceTasse)

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 60

Query innestate e l’operatore exists

• Trovare le persone che non hanno omonimi:SELECT *FROM Persone PWHERE not exists

(select *from Persone P1where P1.Nome =

P.Nomeand P1.Cognome = P.Cognomeand P1.CodiceTasse <>

P.CodiceTasse)

21

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 61

Operatore existsConsideriamo le relazioni:Employee (Fname, Sname,Ssn, Bdate, address, sex, salary,

superss, Dno), Dependent (Essn, DpendentName, sex, Bdate, relationship)Departement (Dname, Dnumber, Mgrssn, MgrStartDate)Project (Pname, Pnumb, Plocation, Dnum)

Nome degli impiegati che non hanno persone a caricoSELECT Fname, Sname FROM Employee WHERE NOT EXISTS (SELECT *

FROM DependentWHERE Ssn = Essn)

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 62

Operatore exists

Nome dei manager che hanno almeno una persona a carico: SELECT Fname, Sname FROM Employee WHERE EXISTS (SELECT *

FROM DependentWHERE Ssn = Essn)

AND EXISTS (SELECT *FROM DepartementWHERE SSN = Mgrssn)

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 63

Operatore existsNome degli impiegati che lavorano in tutti i progetti controllati dal

dipartimento n. 5

SELECT E.Fname, E. SnameFROM EMPLOYEE EWHERE not exists (SELECT *

FROM WorksOnWHERE WorksOn.ssn= E.ssnAND WorksOn.pnumb not in

(Select pnumbfrom project where dnumb = 5))

22

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 64

Costruttore di tuple• Confronti con il risultato di una query innestata può

coinvolgere più di un solo attributo• Gli attributi devono essere raggruppati in una coppia di

parentesi (costruttori di tuple) • La precedente query può essere scritta nel modo seguente:select *from Persone Pwhere (Nome,Cognome) not in

(select Nome, Cognomefrom Persone P1where P1.CodiceTasse <>

P.CodiceTasse)

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 65

Osservazioni su query innestate• L’uso di queries innestate può semplificare la

leggibilità• Query complesse possono risultare di difficile

lettura• L’uso delle variabili deve rispettare le regole di

visibilità• Una variabile può essere usata solo dentro la

query dove è definita oppure dentro una queryinnestata in una condizione where di una query(esterna) che definisce la variabile

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 66

Visibilità delle variabili• Query non corretta

select *from Employeewhere Dept in

(select DeptNamefrom Department D1where DeptName = ‘Production’)

OR Dept in (select DeptNamefrom Department D2where D2.City = D1.City)

• La variabile D1 non è visibile alla seconda query innestata

23

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 67

Visibilità delle variabili• Query sintatticamente corretta

select *from Employeewhere Dept in

(select DeptNamefrom Department D1where DeptName in

(select DeptNamefrom Department D2where D2.City = D1.City)

• La variabile D1 è ora visibile alla seconda query innestata(anche se NON otteniamo gli stessi valori)

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 68

Joins in SQL-2

• SQL-2 presenta una sintassi esplicita per il join, aggiungendolo come clausola nella parte from:

select AttrExpr [[ as ] Alias ] {, AttrExpr [[ as ] Alias ] }from Table [[ as ] Alias ]

{ [ JoinType] join Table [[ as ] Alias ] on JoinConditions }[ where OtherCondition ]

• JoinType può essere: inner, right [ outer ], left [outer] oppure full [ outer ], che esprime il tipo di outer join

• natural può precedere JoinType (raramente implementata)

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 69

Inner join in SQL-2• Nome degli impiegati e le città in cui lavorano:

select FirstName, Surname, D.Cityfrom Employee inner join Department as D on Dept = DeptName

• Risultato

FirstName Surname CityMary Brown LondonCharles White ToulouseGus Green LondonJackson Neri BrightonCharles Brown LondonLaurence Chen LondonPauline Bradshaw LondonAlice Jackson Toulouse

24

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 70

Esempio di database

DRIVER FirstName Surname DriverIDMary Brown VR 2030020YCharles White PZ 1012436BMarco Neri AP 4544442R

AUTOMOBILE CarRegNo Make Model DriverIDABC 123 BMW 323 VR 2030020YDEF 456 BMW Z3 VR 2030020YGHI 789 Lancia Delta PZ 1012436BBBB 421 BMW 316 MI 2020030U

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 71

Left join• Trovare I guidatori con le loro auto, includendo anche I

guidatori senza auto :select FirstName, Surname,

Driver.DriverID,CarRegNo, Make, Model

from Driver left join Automobile on(Driver.DriverID = Automobile.DriverID)

• Risultato :

FirstName Surname DriverID CarRegNo Make ModelMary Brown VR 2030020Y ABC 123 BMW 323Mary Brown VR 2030020Y DEF 456 BMW Z3Charles White PZ 1012436B GHI 789 Lancia DeltaMarco Neri AP 4544442R NULL NULL NULL

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 72

Full join• Trovare tutti I guidatori e tutte le auto mostrando le

relazioni tra essi :select FirstName, Surname,

Driver.DriverIDCarRegNo, Make, Model

from Driver full join Automobile on(Driver.DriverID = Automobile.DriverID)

• Risultato:FirstName Surname DriverID CarRegNo Make ModelMary Brown VR 2030020Y ABC 123 BMW 323Mary Brown VR 2030020Y DEF 456 BMW Z3Charles White PZ 1012436B GHI 789 Lancia DeltaMarco Neri AP 4544442R NULL NULL NULLNULL NULL NULL BBB 421 BMW 316

25

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 73

Viste in SQL (views)

• Creano una tabella temporanea, virtuale, contenente il risultatodi una query

• Il query processor usa la sua definizione (la query) per calcolarele queries sulla vista

• Sono dette materializzate, quando memorizzano I risultati dellaquery che le definisce

• Viste possono essere usate per formulare queries complesse• Le viste decompongono il problema e rendono più leggibile

la query• In alcuni casi sono necessarie per esprimere alcune queries:

• Es. Queries che combinano e hanno operatori diaggregazione innestati

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 74

Viste: definizione

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

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 75

Aggiornamenti sulle viste

• Ammessi (di solito) solo su viste definite su una sola relazione

• Alcune verifiche possono essere imposte

26

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 76

CREATE VIEW ImpiegatiAmminPoveri asSELECT *FROM ImpiegatiAmminWHERE Stipendio < 50with check option

• check option permette modifiche, ma solo a condizione che la ennupla continui ad appartenere alla vista (non posso modificare lo stipendio portandolo a 60)

Aggiornamenti sulle viste

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 77

Uso di viste per le interrogazioni

Selezionare nome e cognome degli impiegati dell’amministrazione

SELECT nome, cognomeFROM ImpiegatiAmmin

Si usa la vista dopo la sua definizione come se fosse una tabella del database

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 78

Un’interrogazione non standard

• La nidificazione nella having non è ammessa

Es. Trovare il dipartimento con la più alta voce di spesa per i salari:

SELECT DipartFROM ImpiegatoGROUP BY DipartHAVING sum(Stipendio) >= all

(SELECT sum(Stipendio)FROM ImpiegatoGROUP BY Dipart)

27

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 79

Soluzione con le viste

CREATE VIEW BudgetStipendi(Dip,TotaleStipendi) asSELECT Dipart, sum(Stipendio)FROM ImpiegatoGROUP BY Dipart

SELECT DipFROM BudgetStipendiWHERE TotaleStipendi = any (SELECT max(TotaleStipendi)

FROM BudgetStipendi)

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 80

Ancora sulle viste• Interrogazione scorretta

SELECT 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

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 81

Modificazione di tuple in SQL

• Istruzioni di:• Inserimento (insert)• cancellazione (delete)• Cambio del valore di attributi (update)

• Tutte le istruzioni operano su tuple• Nella condizione (where) è possibile accedere ad

altre relazioni

28

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 82

Inserimento

• Sintassi:insert into nomeTabella [ (AttributeList) ]

< values (ListOfValues) | SelectSQL>• Usando valori:

insert into Department(DeptName, City)values(‘Production’,’Toulouse’)

• Usando una sub-query:insert into LondonProducts

(select Code, Descriptionfrom Productwhere ProdArea = ‘London’)

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 83

Inserimento, 2

• L’ordine degli attributi (se presente) e i valori sono significativi (primo valore con il primo attributo, secondo valore con secondo attributo...)

• Se la lista di attributi (AttributeList) è omesso, tutti gli attributi della relazione sono considerati, nell’ordine nel quale appaiono nella definizione della tabella.

• Se AttributeList non contiene tutti gli attributi, in corrispondenza degli attributi mancanti, la tupla viene completata con valori di default (dove definiti) o nulli (ove consentito)

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 84

Rimozione (delete) di tuple

• Sintassi:delete from TableName [ where Condition ]

• Rimuovi il dipartimento di Produzione:delete from Department

where DeptName = ‘Production’

• Rimuovi I dipartimenti senza impiegati:delete from Departmentwhere DeptName not in (select Dept

from Employee)

29

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 85

• L’istruzione di delete rimuove dalla relazione tutte le tupleche soddisfano la condizione

• La cancellazione può generare la cancellazione di tuple da altre relazioni se una integrità referenziale è stata definita (i.e., on delete cascade, vedi Data Definition Language)

• Se la clausola where è omessa, delete cancella tutte le tuple• Per rimuovere tutte le tuple dalla tabella Departement (senza

rimuovere lo schema di tabella)delete from Department

• Per rimuovere completamente la tabella Departement (content and schema):drop table Department cascade

Rimozione (delete) di tuple e tabelle

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 86

Updates, 1• Sintassi:

update TableNameset Attribute = < Expression | SelectSQL | null | default >{, Attribute = < Expression | SelectSQL | null | default >}[ where Condition ]

• Esempi:update Employee

set Salary = Salary + 5where RegNo = ‘M2047’

update Employeeset Salary = Salary * 1.1where Dept = ‘Administration’

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 87

Updates, 2

• Il linguaggio è set oriented, quindi l’ordine di esecuzione delleupdates è rilevanteupdate Employeeset Salary = Salary * 1.1where Salary <= 30

update Employeeset Salary = Salary * 1.15where Salary > 30

• Se le sitruzioni sono eseguite in questo ordine, alcuni impiegatipossono avere un incremento di salario non desiderato (i.e., 1.1 et 1.5 il salario)

30

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 88

Data Definition Language

• Definizione delle tabelle in SQL

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 89

Schema definition

• A schema is a collection of objects:• domains, tables, indexes, assertions, views,

privileges• A schema has a name and an owner (the

authorization)

• Syntax:create schema [ SchemaName ]

[ [ authorization ] Authorization ] { SchemaElementDefinition }

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 90

Definizione di tabelle

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

un’istanza vuota• specifica attributi, domini e vincoli

31

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 91

Table definition• An SQL table consists of

• an ordered set of attributes • a (possibly empty) set of constraints

• Statement create table• defines a relation schema, creating an empty instance

• Syntax:create table TableName

( AttributeName Domain [ DefaultValue ] [ Constraints ]{, AttributeName Domain [ DefaultValue ] [ Constraints ] }[ OtherConstraints ])

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 92

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)

)

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 93

create table Employee(

RegNo character(6) primary key,FirstName character(20) not null,Surname character(20) not null,Dept character (15)

references Department(DeptName)on delete set nullon update cascade,

Salary numeric(9) default 0,City character(15),unique(Surname,FirstName)

)

CREATE TABLE, esempio

32

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 94

Domini

• Specificano il contenuto degli attributi• Due categorie:

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

riutilizzabili)

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 95

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• Introdotti in SQL:1999:

• Boolean• BLOB, CLOB (binary/character large object):

per grandi immagini e testi

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 96

Domini di base (elementari)• Character

• Carattere singolo o stringa (a lunghezza fissa o variabile)• Si può specificare un alfabeto differente da quello di default

(e.g., Latin, Greek, Cyrillic, etc.)• Sintassi:

character [ varying ] [ (Length) ] [ character set CharSetName ]

• Si può usare char e varchar, rispettivamente per character e character varying

Ex: character(20) stringa di 20 carattericharacter varying (100) character set Greekequiv. a varchar (100) ….

33

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 97

• Bit• Bit singolo o insieme di bit a lunghezza fissa o variabile• Sintassi:

bit [ varying ] [ (Length) ]• Domini di valori numerici esatti

• Interi o con parte frazionaria• 4 alternative

numeric [ ( Precision [, Scale ] ) ]decimal [ ( Precision [, Scale ] ) ]integersmallint

Domini di base (elementari)

Es. numeric(6,4): -99,9999 +99,9999

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 98

• Tipi numerici approssimati• Valori numerici approssimati• Basati sulla rappresentazione a virgola mobile

(mantissa + esponente)float [ ( Precision ) ] dove precision= num. di cifre

della mantissareal (precisione fissa che dip. Dal calcolatore)double precision (doppia prec. Rispetto a

real)

Domini di base (elementari)

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 99

• Valori temporalidatetime [ ( Precision) ] [ with time zone ]timestamp [ ( Precision) ] [ with time zone ]

• Intervalli temporaliinterval FirstUnitOfTime [ to LastUnitOfTime ]

• Unità di tempo sono divisi in due gruppi• year, month• day, hour, minute, second

Domini di base (SQL-2)

34

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 100

Domini definiti da utenti• Istruzione CREATE DOMAIN:

• definisce un dominio (semplice), utilizzabile in definizioni di relazioni, anche con vincoli e valori di default

• Sintassi:create domain DomainName as ElementaryDomain

[ DefaultValue ] [ Constraints ]• Esempio:

create domain Mark as smallint default null

create domain Voto smallint default nullCHECK ( value >=18 AND value <= 30 )

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 101

Valori di default• Definisce il valore che l’attributo deve assumere quando

non specificato durante l’inserimento di una riga

• Sintassidefault < GenericValue | user | null >

• GenericValue rappresenta un valore compatibile con ildominio dell’attributo, (anche come risult. Di unaespressione)

• user is the login name of the user who issues the command

Es. Salary numeric(9) default 0,

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 102

Intra-relational constraints

• Constraints are conditions that must be verified by every database instance

• Intra-relational constraints involve a single relation• not null (on single attributes)• unique: permits the definition of keys; syntax:

• for single attributes:unique, after the domain

• for multiple attributes:unique( Attribute {, Attribute } )

• primary key: defines the primary key (once for each table; implies not null); syntax like unique

• check: described later

35

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 103

Example of intra-relational constraints

• Each pair of FirstName and Surname uniquely identifies each element

FirstName character(20) not null,Surname character(20) not null,unique(FirstName,Surname)

• Note the difference with the following (stricter) definition:FirstName character(20) not null unique,Surname character(20) not null unique,

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 104

UNIQUE e PRIMARY KEY

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

solo la chiave• come elemento separato

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 105

Matricola CHAR(6) PRIMARY KEY--Matricola CHAR(6),…,PRIMARY KEY (Matricola)--Matricola CHAR(6),…,constraint chiavePrimaria PRIMARY KEY (Matricola)

PRIMARY KEY, alternative

36

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 106

Unique 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!

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 107

Inter-relational constraints

• Constraints may take into account several relations• check: described later• references and foreign key permit the

definition of referential integrity constraints; syntax:• for single attributes

references after the domain• for multiple attributes

foreign key ( Attribute {, Attribute } )references …

• It is possible to associate reaction policies to violations of referential integrity

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 108

create table Employee(

RegNo character(6) primary key,FirstName character(20) not null,Surname character(20) not null,Dept character (15)

references Department(DeptName)on delete set nullon update cascade,

Salary numeric(9) default 0,City character(15),unique(Surname,FirstName)

)

Esempio di chiave esterna

37

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 109

create table Employee(

RegNo character(6) primary key,FirstName character(20) not null,Surname character(20) not null,Dept character (15,Salary numeric(9) default 0,City character(15),unique(Surname,FirstName),foreign key (Dept) references Department(DeptName)

on delete set nullon update cascade,

)

Esempio di chiave esterna: anche come..

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 110

create table Employee(

RegNo character(6) primary key,FirstName character(20) not null,Surname character(20) not null,Dept character (15,Salary numeric(9) default 0,City character(15),unique(Surname,FirstName),constraint chiaveEsterna foreign key (Dept) references Department(DeptName)

on delete set nullon update cascade,

)

E’ possibile dare un nome al vincolo:

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 111

Matricola398732959345

Vigili CognomeRossiNeriNeri

NomeLucaPieroMario

Mori Gino7543

InfrazioniCodice34321

733216452153524

Data1/2/954/3/955/4/965/2/98

Vigile3987329532959345

Prov NumeroMITOPRPR

39548KE39548839548839548

38

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 112

InfrazioniCodice34321

733216452153524

Data1/2/954/3/955/4/965/2/98

Vigile3987329532959345

Prov NumeroMITOPRPR

39548KE39548839548839548

Auto Prov NumeroMITOPR

39548KE39548839548

CognomeRossiRossiNeri

NomeMarioMarioLuca

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 113

Vincoli esterni, esempio

CREATE TABLE Infrazioni(Codice CHAR(6) NOT NULL PRIMARY KEY, Data DATE NOT NULL, Vigile INTEGER

REFERENCES Vigili(Matricola) on delete cascade,

Provincia CHAR(2), Numero CHAR(6) ,FOREIGN KEY(Provincia, Numero)

REFERENCES Auto(Provincia, Numero) )

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 114

Reaction policies for referential integrity constraints

• Reactions operate on the internal table, after changes to the external table

• Violations may be introduced (1) by updates on the referred attribute or (2) by row deletions

• Reactions:• cascade: propagate the change• set null: nullify the referring attribute• set default: assign the default value to the referring

attribute• no action: forbid the change on the external table

• Reactions may depend on the event; syntax:on < delete | update >

< cascade | set null | set default | no action >

39

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 115

Example of inter-relational constraintcreate table Employee(

RegNo char(6),FirstName char(20) not null,Surname char(20) not null,Dept char(15),Salary numeric(9) default 0,City char(15),primary key(RegNo),foreign key(Dept)

references Department(DeptName)

on delete set nullon update cascade,

unique(FirstName,Surname))

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 116

Generic integrity constraints• The check clause can be used to express arbitrary constraints

during schema definition• Syntax:

check (Condition)• Condition is what can appear in a where clause (including

nested queries)• E.g., the definition of an attribute Superior in the schema of

table EMPLOYEE:Superior character(6)check (RegNo like “1%” or

Dept = (select Deptfrom Employee Ewhere E.RegNo = Superior)

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 117

Assertions

• Assertions permit the definition of constraints outside of tabledefinitions

• Useful in many situations (e.g., to express generic inter-relational constraints)

• An assertion associates a name to a check clause; syntax:create assertion AssertionName check (Condition)

• There must always be at least one tuple in table EMPLOYEE:create assertion AlwaysOneEmployeecheck (1 <= (select count(*)

from Employee))

40

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 118

ALTER DOMAINALTER TABLEDROP DOMAINDROP TABLE...

Schema updates

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 119

Schema updates• Two SQL statements:

• alter (alter domain ..., alter table …)• drop

drop < schema | domain | table | view | assertion >

ComponentName [ restrict | cascade ]• Examples:

• alter table Departmentadd column NoOfOffices

numeric(4)• drop table TempTable cascade

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 120

Relational catalogues

• The catalog contains the data dictionary, the description of the data contained in the data base

• It is based on a relational structure (reflexive)• The SQL-2 standard describes a

Definition_Schema (composed of tables) and an Information_Schema (composed of views)

41

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 121

Controllo dell'accesso

• In SQL è possibile specificare chi (utente) e come (lettura, scrittura, …) può utilizzare la base di dati (o parte di essa)

• Oggetto dei privilegi (diritti di accesso) sono di solito le tabelle, ma anche altri tipi di risorse, quali singoli attributi, viste o domini

• Un utente predefinito _system (amministratore della base didati) ha tutti i privilegi

• Il creatore di una risorsa ha tutti i privilegi su di essa

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 122

Privilegi

• Un privilegio è caratterizzato da:• la risorsa cui si riferisce• l'utente che concede il privilegio• l'utente che riceve il privilegio• l'azione che viene permessa• la trasmissibilità del privilegio

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 123

Tipi di privilegi offerti da SQL

• insert: permette di inserire nuovi oggetti (ennuple)• update: permette di modificare il contenuto• delete: permette di eliminare oggetti• select: permette di leggere la risorsa• references: permette la definizione di vincoli di integrità referenziale

verso la risorsa (può limitare la possibilità di modificare la risorsa)• usage: permette l'utilizzo in una definizione (per esempio, di un

dominio)

42

www.dia.uniroma3.it/~torlone/

Pierangelo Veltri, Unicz. (slides del testo Basi di Dati P. Atzeni, R.Torlone et al., Mc

Graw Hill 2001) 124

grant e revoke

• Concessione di privilegi:grant < Privileges | all privileges > on Resource

to Users [ with grant option ]• grant option specifica se il privilegio può essere trasmesso

ad altri utentigrant select on Department to Stefano

• Revoca di privilegirevoke Privileges on Resource from Users

[ restrict | cascade ]