Upload
hoanglien
View
238
Download
4
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 ]