Sei sulla pagina 1di 71

Parte IV

Il linguaggio SQL

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 1


SQL
• Acronimo di Structured Query Language“
• Copre tutti gli aspetti: sia il DDL sia il DML
• Evoluzione dell’SQL:
– Prima proposta: SEQUEL (IBM Research, 1974)
– Prime implementazioni SQL/DS (IBM) e Oracle (1981);
– Dal 1983 circa è uno standard ‘de facto’
• Standardizzazione
– 1986, poi 1989, poi 1992 (ISO 90 75)
– Successive revisioni fina a ISO/IEC 9075:2011
– Lo standard del 1992 è ragionevolmente implementato
in tutti i DBMS commerciali

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 2


SQL 92
• È un linguaggio ricco e complesso
• Ancora nessun sistema mette a disposizione tutte le
funzionalità del linguaggio
• 3 livelli di aderenza allo standard:
– Entry SQL: abbastanza simile a SQL-89
– Intermediate SQL: caratteristiche più importanti per le
esigenze del mercato; supportato dai DBMS
commerciali
– Full SQL: funzioni avanzate, in via di inclusione nei
sistemi
• Molti sistemi offrono anche funzionalità non standard

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 3


Definizione dei dati
• create schema: definisce uno schema di DB
• create table : definisce uno schema di relazione:
– Specifica attributi e vincoli
– Crea un’istanza vuota dello schema
• Sintassi:
create table NomeTabella (
NomeAttributo Dominio [ Vincoli ]
........
NomeAttributo Dominio [ Vincoli ]
[ AltriVincoli ]
)

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 4


Create table: esempio

create table Impiegato (


Matricola character(6) primary key,
Nome character(20) not null,
Cognome character(20) not null,
Dipart character(15),
Stipendio numeric(9) default 0,
Citta character(15),
foreign key(Dipart) references
Dipartimento(NomeDip),
unique (Cognome,Nome)
)

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 5


SQL e modello relazionale
• Una tabella in SQL è definita come un multiinsieme di n-uple
• Se una tabella non ha una primary key o un insieme di
attributi definiti come unique, allora potranno comparire due
n-uple uguali nella tabella
• Una tabella SQL non è in generale una relazione.
• Se invece una tabella ha una primary key o un insieme di
attributi definiti come unique, allora non potranno mai
comparire nella tabella due ennuple uguali
• Per questo, è consigliabile (anche se non obbligatorio)
definire almeno una primary key per ogni tabella.

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 6


Domini
• Domini elementari (predefiniti)
– Carattere: singoli caratteri o stringhe, anche di
lunghezza variabile
– Bit: singoli booleani o stringhe
– Numerici: esatti e approssimati
– Data, ora, intervalli di tempo
– Altri domini ntrodotti in SQL:1999
• Boolean
• BLOB, CLOB (binary/character large object): per
grandi immagini e testi
• Domini definiti dall'utente (semplici, ma riutilizzabili)
Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 7
Domini definiti dall’utente
• create domain: definisce un dominio (semplice) con
vincoli e valori di default, utilizzabile in definizioni di
relazioni.
• Sintassi
create domain NomeDominio
as Tipo [ Default ] [ Vincoli ]

• Esempio:
create domain Voto
as smallint default null
check ( value >=18 and value <= 30 )

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 8


Vincoli intrarelazionali
• not null (su singoli attributi)
• unique: definisce attributi che identificano la tupla:
– singolo attributo:
unique dopo la specifica del dominio
– Insieme di attributi:
unique (Attributo,..., Attributo)
• primary key: definisce la chiave primaria (una sola,
implica not null); sintassi come per unique
• check: definisce vincoli complessi (più avanti)
Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 9
Vincoli intrarelazionali esempi

create table Impiegato (


Matricola character(6) primary key,
Nome character(20) not null,
Cognome character(20) not null,
Dipart character(15),
Stipendio numeric(9) default 0,
Citta character(15),
foreign key(Dipart) references
Dipartimento(NomeDip),
unique (Cognome,Nome)
)

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 10


Chiavi su più attributi
create table Impiegato ( ...
Nome character(20) not null,
Cognome character(20) not null,
unique (Cognome,Nome)
)

è diverso da:
create table Impiegato ( ...
Nome character(20) not null unique,
Cognome character(20) not null unique
)

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 11


Vincoli di integrità refrenziale
• references: per singoli attributi, dopo la specifica del
dominio
• foreign key: riferimenti su più attributi:
foreign key(Attributo,...,Attributo)references
• Gli attributi nella tabella di arrivo devono formare una
chiave (primay key o unique). Se mancano, il
riferimento si intende alla chiave primaria.
• Ogni combinazione (senza NULL) di valori per gli attributi
nella tabella di partenza deve comparire nella tabella di
arrivo.
• Possibile associare politiche di reazione alla violazione

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 12


Integrità referenziale: esempio
Infrazioni Codice Data Vigile Prov Numero
34321 1/2/95 3987 MI 39548K
53524 4/3/95 3295 TO E39548
64521 5/4/96 3295 PR 839548
73321 5/2/98 9345 PR 839548

Auto Prov Numero Cognome Nome


MI 39548K Rossi Mario
TO E39548 Rossi Mario
PR 839548 Neri Luca

Vincolo di integrità referenziale fra {Prov,Numero} in Infrazioni


e la chiave di Auto
Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 13
Integrità referenziale: esempio (2)
Infrazioni Codice Data Vigile Prov Numero
34321 1/2/95 3987 MI 39548K
53524 4/3/95 3295 TO E39548
64521 5/4/96 3295 PR 839548
73321 5/2/98 9345 PR 839548

Vigili Matricola Cognome Nome


3987 Rossi Luca
3295 Neri Piero
9345 Neri Mario
7543 Mori Gino

Vincolo di integrità referenziale fra Vigile in Infrazioni e la


relazione Vigili
Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 14
Integrità referenziale: esempio (3)

create table Infrazioni (


Codice character(6) not null primary key,
Data date not null,
Vigile integer not null
references Vigili(Matricola),
Provincia character(2),
Numero character(6),
foreign key(Provincia, Numero)
references Auto(Provincia, Numero)
)

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 15


Catalogo dei dati
• Ogni sistema relazionale mette a disposizione delle tabelle
già definite che raccolgono tutti i dati relativi a:
• tabelle
• attributi
• domini
• ...
• Ad esempio, la tabella Columns contiene i campi:
• Column_Name
• Table_name
• Ordinal_Position
• Column_Default
• …
Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 16
Interrogazioni in SQL
• Le interrogazione in SQL si formulano tramite l’istruzione
select, la quale:
– Definisce l’interrogazione
– Restituisce il risultato in forma di tabella
select Attributo … Attributo
from Tabella … Tabella
[where Condizione]
• Le tre sezioni dell’istruzione vengono di solito chiamate
– Target list
– From clause
– Where clause

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 17


Database: la famiglia
Maternità Madre Figlio Persone
Luisa Maria Nome Età Reddito
Luisa Luigi Andrea 27 21
Anna Olga Aldo 25 15
Anna Filippo Maria 55 42
Maria Andrea Anna 50 35
Maria Aldo Filippo 26 30
Luigi 50 40
Paternità Padre Figlio Franco 60 20
Sergio Franco Olga 30 41
Luigi Olga Sergio 85 35
Luigi Filippo Luisa 75 87
Franco Andrea
Franco Aldo

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 18


Query di selezione e proiezione
Query 1: Nome e reddito delle persone con meno di 30 anni

PROJNome, Reddito(SELEtà<30(Persone))

select Nome, Reddito


from Persone
where Età < 30
Nome Reddito
Andrea 21
Aldo 15
Filippo 30

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 19


Convenzioni sui nomi
• Per evitare ambiguità, ogni nome di attributo è composto da
NomeRelazione.NomeAttributo
• Quando l’ambiguità non sussiste, si può omettere la parte
NomeRelazione.
select Persone.Nome, Persone.Reddito
from Persone
where Persone.Età < 30
si può scrivere come:
select Nome, Reddito
from Persone
where Età < 30
Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 20
Proiezione e duplicati
Query 2: Cognome e filiale di tutti gli impiegati

Impiegati
matricola cognome filiale stipendio
7309 Neri Napoli 55
5998 Neri Milano 64
9553 Rossi Roma 44
5698 Rossi Roma 64

PROJ Cognome, Filiale (Impiegati)

N.B.: Se non specificato la proiezione conserva I duplicati

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 21


Eliminazione dei duplicati
Query 2: Cognome e filiale di tutti gli impiegati

select Cognome, select distinct


Filiale Cognome,Filiale
from Impiegati from Impiegati

Cognome Filiale Cognome Filiale


Neri Napoli Neri Napoli
Neri Milano Neri Milano
Rossi Roma Rossi Roma
Rossi Roma

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 22


Ridenominazione degli attributi
• Tramite il costrutto as è possibile specificare i nomi degli
attributi del risultato, altrimenti restano quelli di origine
• Esempio:

select Nome as nomePersone,


Reddito as salario
from Persone
where Età < 30
restituisce come risultato una relazione con due attributi, il
primo di nome nomePersone ed il secondo di nome
salario

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 23


Selezione senza proiezione
• Inserire un asterisco nella target list equivale a prendere
tutti gli attributi

Query 3: Nome, età e reddito delle persone con meno di 30 anni

SELEta<30(Persone)

select *
from Persone
where Età < 30

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 24


Proiezione senza selezione
Query 4: Nome e reddito di tutte le persone
PROJNome, Reddito(Persone)

select Nome, Reddito


from Persone

È equivalente a:
select Nome, Reddito
from Persone
where true

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 25


Espressioni
• È possibile avere espressioni sia nella target list che nelle
condizioni delle where list

select reddito/2 as redditoSemestrale


from persone
where nome = 'Luigi'

select *
from persone
where reddito > 25
and (eta < 30 or eta > 60)

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 26


Condizione like
• Permettere di considerare uguali stringhe ‘simili’
• Si indica come costante una stringa tra apici in cui
– Il carattere ‘_’ indica un qualsiasi carattere
– Il carattere ‘%’ indica una qualsiasi stringa

select *
from Persone
where Nome like 'A_d%‘

Le persone che hanno un nome che inizia per 'A' e ha una


'd' come terza lettera

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 27


Gestione dei valori nulli
• Il riferimento ai valori nulli nelle condizioni può essere fatto
tramite i predicati is null e is not null

Query 5: Cognome e filiale di tutti gli impiegati di più di 40 anni

SEL Eta > 40 OR Eta IS NULL (Impiegati)

select Cognome, Filiale


from Impiegati
where Età > 40 or Età is null

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 28


Query di selezione, proiezione e join
• Istruzioni select con una sola relazione nella clausola
from permettono di realizzare:
– Selezioni
– Proiezioni
– Ridenominazioni
• Join (e prodotti cartesiani) si realizzano indicando due o più
relazioni nella clausola from
• Le condizioni nella clausola where permettono di
esprimere le condizioni del join naturale e del theta join

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 29


SQL e algebra relazionale
Date le relazioni R1(A1,A2) e R2(A3,A4), la query
select R1.A1, R2.A4
from R1, R2
where R1.A2 = R2.A3
si può descrivere in termini di
– Prodotto cartesiano (from)
– Selezione (where)
– Proiezione (select)

N.B.: questo non significa che il DBMS calcola davvero il


prodotto cartesiano!
Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 30
SQL e algebra relazionale (2)

Date le relazioni R1(A1,A2) e R2(A3,A4), la query

select R1.A1, R2.A4


from R1, R2
where R1.A2 = R2.A3

Corrisponde all’espressione algebrica:

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

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 31


Ridenominazioni
• Possono essere necessarie ridenominazioni
– Nella target list (come nell’algebra relazionale)
– Nel prodotto cartesiano: in particolare quando occorre
riferirsi due volte alla stessa tabella
select X.A1 as B1, ...
from R1 X, R2 Y, R1 Z
where X.A2 = Y.A3 and ...
• Notaziona alternativa
select X.A1 as B1, ...
from R1 as X, R2 as Y, R1 as Z
where X.A2 = Y.A3 and ...
Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 32
SQL e algebra relazionale: esempio
R1(A1,A2) e R2(A3,A4)
select X.A1 as B1, Y.A4 as B2
from R1 X, R2 Y, R1 Z
where X.A2 = Y.A3 and Y.A4 = Z.A1
PASSO 1: Z = REN C1,C2  A1,A2 (R1)
PASSO 2: S1 = R2 JOIN Z
PASSO 3: S2 = R1 JOIN S1
PASSO 4: S3 = SEL A2 = A3 and A4 = C1(S2 )
PASSO 5: S4 = PROJ A1,A4 (S3)
PASSO 6: S5 = REN B1,B2A1,A4 (S4)
Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 33
SQL: esecuzione delle interrogazioni
• Le espressioni SQL sono dichiarative
• In pratica, i DBMS eseguono le operazioni in modo
efficiente, ad esempio:
– eseguono le selezioni al più presto
– se possibile, eseguono join e non prodotti cartesiani
• La capacità dei DBMS di "ottimizzare" le interrogazioni,
rende (di solito) non necessario preoccuparsi
dell'efficienza quando si specifica un'interrogazione
• È perciò più importante preoccuparsi della chiarezza
(anche perché così è più difficile sbagliare …)

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 34


Join esplicito

• È possibile anche esprimere esplicitamente l’operazione


di join, con la sintassi:
select …
from Tabella { join Tabella on CondDiJoin }, …
[ where AltraCondizione ]
• Questa è una modalità alternativa, in quanto è sempre
possibile esprimere le stesse query tramite
– prodotto cartesiano nella clausola from
– condizioni della clausola where

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 35


Join esplicito: esempio
Query 6: Le persone che guadagnano più dei rispettivi padri,
mostrando nome, reddito e reddito del padre
select f.Nome, f.Reddito, p.Reddito
from Persone p, Paternità t, Persone f
where p.Nome = t.Padre and
t.Figlio = f.Nome and
f.Reddito > p.Reddito

select f.Nome, f.Reddito, p.Reddito


From Persone p join Paternità t on p.Nome = t.Padre
join Persone f on t.Figlio = f.Nome
where f.Reddito > p.Reddito

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 36


Join esterno (outer join)
Query 7: Padre e, se nota, madre di ogni persona
select paternita.figlio, padre, madre
from paternita left outer join maternita
on paternita.figlio = maternita.figlio
• “outer” è opzionale
select paternita.figlio, padre, madre
from paternita left join maternita
on paternita.figlio = maternita.figlio
N.B. Il join esterno sinistro prende comunque tutte le tuple
della relazione di sinistra
Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 37
Join esterno: esempi
select paternita.figlio, padre, madre
from maternita join paternita
on maternita.figlio = paternita.figlio
select paternita.figlio, padre, madre
from maternita left outer join paternita
on maternita.figlio = paternita.figlio
select paternita.figlio, padre, madre
from maternita right outer join paternita
on maternita.figlio = paternita.figlio

select paternita.figlio, padre, madre


from maternita full outer join paternita
on maternita.figlio = paternita.figlio

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 38


Ordinamento del risultato
Query 8: Nome e reddito delle persone con meno di trenta
anni in ordine alfabetico

select nome, reddito


from persone
where eta < 30
order by nome
select nome, reddito
from persone
where eta < 30
order by nome desc

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 39


Operatori aggregati
• Nelle espressioni della target list possiamo avere anche
espressioni che calcolano valori a partire da insiemi di
ennuple:
– Conteggio
– Minimo
– Massimo
– Media
– Somma
• Sintassi base (semplificata):

Funzione ( [ distinct ] EspressioneSuAttributi )

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 40


Operatori aggregati: count
Sintassi:

– Conta il numero di ennuple:


count (*)
– Conta i valori di un attributo (considerando i duplicati):
count (Attributo)

– Conta i valori distinti di un attributo:


count (distinct Attributo)

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 41


Operatore count: esempio
Query 9: Quanti sono i figli di Franco

select count(*) as NumFigliDiFranco


from Paternità
where Padre = 'Franco'
Semantica: l’operatore aggregato (count), che conta le
ennuple, viene applicato al risultato dell’interrogazione:

select *
from Paternità
where Padre = 'Franco'

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 42


Operatore count: esempio (risultato)
Query 9: Quanti sono i figli di Franco

Paternità padre figlio


Sergio Franco
Luigi Olga
Luigi Filippo
Franco Andrea
Franco Aldo

NumFigliDiFranco
2

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 43


Operatore count e valori nulli
select count(*) 4 = n. di tuple
from Persone

select count(Reddito) 3 = n. valori non nulli


from persone
select count(distinct Reddito) 2 = n. di valori non nulli
from Persone distinti

Persone Nome Età Reddito


Andrea 27 21
Aldo 25 NULL
Maria 55 21
Anna 50 35
Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 44
Raggruppamento
• Le funzioni di aggregazione possono essere applicate a
partizioni delle ennuple delle relazioni

• Esecuzione in tre passi:


1. Il risultato dell’interrogazione viene calcolato
2. Le n-uple sono partizionate secondo un criterio dato
3. L’operatore è applicato agli insiemi della partizione
• Per specificare le partizioni delle ennuple, si utilizza la
clausola group by:
group by listaAttributi

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 45


Raggruppamento: esempio
Query 10: Il numero di figli di ciascun padre

select Padre, count(*) as NumFigli


from Paternità
group by Padre

Paternità Padre Figlio Padre NumFigli


Sergio Franco Sergio 1
Luigi Olga Luigi 2
Luigi Filippo Franco 2
Franco Andrea
Franco Aldo

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 46


Semantica del raggruppamento

1. Si esegue l’interrogazione ignorando la group by e gli


operatori aggregati:

select *
from Paternità

2. Si raggruppano le ennuple che hanno lo stesso valore


per gli attributi che compaiono nella group by

3. Si produce una n-upla del risultato per ogni gruppo, e


si applica l’operatore aggregato a ciascun gruppo.

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 47


Raggruppamento: esempio 2
Query 11: Il massimo dei redditi per ogni gruppo di persone
che sono maggiorenni ed hanno la stessa età
(indicando anche l’età)

Persone Nome Età Reddito

select eta, max(reddito)


from persone
where eta > 17
group by eta

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 48


Raggruppamento e target list
Se si fa uso di group by, possono comparire nella target list
solamente funzioni di aggregazione e attributi che compaiono
nella group by

select Età, Reddito SCORRETTA


from persone
group by Età
(Potrebbero esistere più valori di Reddito nello stesso gruppo)

select Età, avg(Reddito) CORRETTA


from persone
group by Età
(Il valore medio di Reddito è definito per ogni gruppo)
Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 49
Condizioni sui gruppi (having)
• La clausola having (che appare dopo la group by)
impone condizioni di selezione sui gruppi
• Le condizioni si possono applicare ai valori aggregati

Query 12: I padri i cui figli hanno un reddito medio maggiore di 25

select padre, avg(f.reddito)


from Persone F, Paternità P
where P.Figlio = F.nome
group by padre
having avg(F.reddito) > 25

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 50


Operazioni insiemistiche
• Le operazioni insiemistiche estendono il potere
espressivo del linguaggio SQL
• union effettua l’unione dei risultati di due interrogazioni
select ...
union [all]
select ...
• La corrispondenza tra attributi è posizionale, in base
all’ordine nelle rispettive select
• Vengono presi i nomi di attributo della prima select
• I duplicati vengono eliminati salvo che non sia presente
l’opzione all

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 51


Unione
Query 13: Tutte le coppie genitore figlio

select Padre as Genitore, Figlio


from Paternità
union
select Madre, Figlio
from Maternità

• Notare la corrispondenza posizionale degli attributi


• Il risultato ha nello schema gli attributi Genitore e
Figlio

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 52


Intersezione e differenza (2)
• L’operatore di intersezione è intersect
• Il risultato è costituito da tutte le tuple che compaiono in
entrambi gli operandi
• L’operatore di differenza è except
• Il risultato è costituito da tutte le tuple ce compaiono nel primo
operando e non nel secondo

N.B. Non tutti i DBMS supportano gli operatori intercept


ed except. Il loro uso è assolutamente sconsigliato visto
che non estendono il potere espressivo del linguaggio e
possono essere sostituiti da altri costrutti.

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 53


Intersezione e differenza
Query 14: Tutti nomi di impiegati che sono anche cognomi
select Nome
from Impiegato
intersect
select Cognome as Nome
from Impiegato
Query 15: Tutti nomi di impiegati che non sono anche cognomi
select Nome
from Impiegato
except
select Cognome as Nome
from Impiegato
Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 54
Interrogazioni nidificate
• Nelle condizioni atomiche può comparire una select
(sintatticamente, deve comparire tra parentesi).
• In particolare, le condizioni atomiche permettono:
– il confronto fra un attributo (o più attributi) e il risultato di
una sottointerrogazione
– quantificazioni esistenziali: cioè imporre l’esistenza o
meno di un determinato ’fatto’ nella base di dati
• Le interrogazioni nidificate arricchiscono il linguaggio e
semplificano la formulazione di alcune interrogazioni
complesse

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 55


Operatori di confronto
• Uguaglianza o altri operatori di confronto (il risultato della
interrogazione nidificata deve essere unico)
• Se non si è sicuri che il risultato sia unico, si può far precedere
l’interrogazione nidificata da:
— any: vero, se il confronto è vero per una qualunque delle
tuple risultato dell’interrogazione nidificata
— all: vero, se il confronto è vero per tutte le tuple risultato
dell'’interrogazione nidificata
• L’operatore in, che è equivalente a =any
• L’operatore not in, che è equivalente a <> all
• L’operatore exists che rende la condizione vera se il
risultato dell’interrogazione nidificata è non vuoto.

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 56


Operatori di disuguaglianza
Query 16: Il nome delle persone che hanno un reddito
maggiore del reddito di tutte le persone con meno di 30
anni.

select P.Nome
from Persone P
where Reddito >= all(select Reddito
from Persone
where Età < 30)

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 57


Operatori di disuguaglianza
Query 16: Il nome delle persone che hanno un reddito
maggiore del reddito di tutte le persone con meno di 30
anni.

select P.Nome
from Persone P
where Reddito >= (select max(Reddito)
from Persone
where Età < 30)

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 58


Operatore exists
Query 17: Il nome delle persone che hanno almeno un figlio
select Nome
from Persone P
where exists (select *
from Paternità
where Padre = P.nome)
or
exists (select *
from Maternità
where Madre = P.nome)
N.B. La query nidificata ha consentito di fare anche una Union

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 59


Operatori di appartenenza
Query 18: Nome ed età delle madri che hanno almeno un
figlio minorenne

select P.Nome, P.Età


from Persone P, Maternità M
where P.Nome = M.Madre and
M.Figlio in (select Nome
from Persone
where Età < 18)

N.B. L’operatore in può essere sostituito con =any

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 60


Alternativa
Query 18: Nome ed età delle madri che hanno almeno un figlio
minorenne

select P.Nome, P.Età


from Persone P, Maternità M, Persone F
where P.Nome = M.Madre and M.Figlio=F.Nome
and F.Età<18

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 61


Manipolazione dei dati

• L’ SQL comprende istruzioni per effettuare operazioni di


manipolazione dei dati

– Inserimento: insert
– Eliminazione: delete
– Modifica: update
• Agiscono su di una o più n-uple di una relazione
• Le n-ple sono selezionate sulla base di una condizione
che può coinvolgere anche altre relazioni

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 62


Inserimento: sintassi
insert into Tabella [ ( Attributi ) ]
values( Valori )
oppure
insert into Tabella [ ( Attributi ) ]
select ...

• Le liste degli attributi e dei valori devono avere lo stesso


numero di valori; l’ordine è significativo
• Se la lista di attributi è omessa vengono presi tutti
• Liste di attributi parziali generano valori nulli

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 63


Inserimento: esempi
insert into Persone values('Mario',25,52)

insert into Persone(Nome, Età, Reddito)


values('Pino',25,52)

insert into Persone(Nome, Reddito)


values('Lino',55)

insert into Persone (Nome)


select distinct Padre
from Paternità
where Padre not in (select Nome from
Persone)

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 64


Eliminazione: sintassi
• Sintassi
delete from Tabella [ where Condizione ]
• Elimina le n-uple che soddisfano la condizione
• Esempi
delete from Persone
where Età < 35

delete from Paternità


where Figlio not in (select Nome from
Persone)
Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 65
Modifica: sintassi
• Sintassi
update NomeTabella
set Attributo = Espr. | select … | null | default 
[ where Condizione ]
• Modifica le n-uple della tabella che soddisfano la “where”
• Esempi
update Persone
set Reddito = Reddito * 1.1
where Reddito < 40

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 66


Viste
• Una vista è una tabella la cui istanza è derivata da altre
tabelle mediante una interrogazione
create view NomeVista [(ListaAttributi)] as SelectSQL
• Le viste sono tabelle virtuali, cioè non materializzate
• Possono essere utilizzate in altre interrogazioni
• Solo quando vengono utilizzate in altre interrogazioni la
loro istanza viene calcolata
• Le viste consentono di creare per la stessa base di dati
mapping diversi per utenti diversi tra schema esterno e
schema logico

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 67


Viste: esempio
• Creare la tabella con i soli impiegati che lavorano nel dipartimento
‘Amministrazione’, e il cui stipendio è maggiore di 10
create view ImpAmmin(Mat,Nome,Cognome,Stip) as
select Matricola, Nome, Cognome, Stipendio
from Impiegato
where Dipart = 'Amministrazione' and
Stipendio > 10

• È come se allo schema (ma non alla base di dati) fosse stata
aggiunta la tabella
ImpAmmin(Mat,Nome,Cognome,Stip)

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 68


Controllo degli accessi

• In SQL è possibile specificare chi (utente) e con quali


privilegi 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
di dati) ha tutti i privilegi
• Il creatore di una risorsa ha tutti i privilegi su di essa

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 69


Tipi di privilegio
• insert: permette di inserire nuovi oggetti (n-uple)
• 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)

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 70


Tipi di privilegio
• Concessione di privilegi:
grant  Privileges | all privileges  on
Resource to Users [ with grantOption ]
(grantOption consente di trasmettere il privilegio)

• Esempio:
grant select on Dipartmento to Giuseppe
• Revoca di privilegi:
revoke Privileges on Resource from Users
[ restrict | cascade ]

Basi di dati - prof. Silvio Salza - a.a. 2014-2015 IV - 71