BDD - Linguaggio SQL
BDD - Linguaggio SQL
1
fi
fi
fi
fi
fi
ff
fi
character [ varying ] [ ( Lunghezza ) ] [ character set
NomeFamigliaCaratteri ]
• Lunghezza indica la lunghezza (numero di caratteri) della stringa; se
omesso si assume 1
• varying indica che la lunghezza è variabile; in tal caso Lunghezza
indica la lunghezza massima.
• character set NomeFamigliaCaratteri permette di specificare una
famiglia di caratteri di default
• Forme compatte: char per character e varchar per character
varying
2
Il numero di bit utilizzati per la rappresentazione dipende
dall’implementazione
Il numero di bit utilizzati per integer deve essere maggiore o uguale al
numero di bit utilizzati per smallint
3
interval UnitàDiTempo [ to UnitàDiTempo ]
Le due unità di tempo rappresentano le unità che devono essere
utilizzate per misurare l’intervallo
Per esempio interval year to month rappresenta un intervallo
espresso in anni e mesi
Le unità di misura possono essere year, month, day, hour, minute e
second
Poiché gli anni e i mesi non sono confrontabili con precisione le unità di
misura sono divise in due gruppi year e month da una parte e le altre
dall’altra
Per la prima unità di misura è possibile specificare una precisione che
indica il numero di cifre da utilizzare
Se la seconda unità di misura è second è possibile specificare una
precisione che indica il numero di cifre decimali che si devono usare per
le frazioni di secondo
Esempio:
create domain Voto as smallint
default null
check(value>=18 and value<=30)
4
L’istruzione CREATE TABLE definisce uno schema di relazione e ne crea
un’istanza vuota
create table NomeTabella
(NomeAttributo Dominio [Default] [Vincoli]
{,NomeAttributo Dominio [ Default ] [ Vincoli ] } [ AltriVincoli ])
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)
on delete set null
on update cascade,
unique (Cognome,Nome)
)
5
Esempio create table Impiegato(
Matricola character(6)primary key,
Nome character(20) not null,
Cognome character(20) not null,
unique (Cognome,Nome)
)
Vincoli interrelazionali predefiniti: references e foreign key
Per un attributo:
references NomeTabella (NomeAttributo)
Per più attributi:
foreign key (NomeAttributo{,NomeAttributo})
references NomeTabella(NomeAttributo {, NomeAttributo})
6
Reazioni a cancellazioni:
- cascade: tutte le righe della tabella interna corrispondenti alla riga.
Cancellata nella tabella esterna vengono cancellate
- set null: all’attributo referente viene assegnato il valore null
- set default: all’attributo referente viene assegnato il valore di
default
- no action: l’operazione viene proibita
on < delete | update > < cascade | set null | set default | no
action >
Va specificato di seguito alla definizione del vincolo
comando ALTER TABLE
alter table NomeTabella
< alter column NomeAttributo
< set default NuovoDefault |
drop default > |
add constraint NuovoVincolo |
drop constraint NomeVincolo |
add column DefAttributo |
drop column NomeAttributo >
MATERNITA’
PATERNITA’
Madre Figlio
Padre Figlio
Luisa Maria
Sergio Franco
Luisa Luigi
Luigi Olga
Anna Olga
Luigi Filippo
Anna Filippo
Franco Andrea
Maria Andrea
Franco Aldo
7 Maria Aldo
PERSONE
Nome Età Reddito
Andrea 27 21
Aldo 25 15
Maria 55 42
Anna 50 35
Filippo 26 30
Luigi 50 40
Franco 60 20
Olga 30 41
Sergio 85 35
Luisa 75 87
8
È possibile usare l’abbreviazione * per indicare tutti gli attributi delle
tabelle elencate nella clausola FROM
Possono comparire ridenominazioni
select *
from persone
where eta < 30
Esempio di ridenominazione:
select nome
as giovane,
Nome Reddito Giovane Salario reddito as
Andrea 21 Andrea 21 salario
from persone
Aldo 15 Aldo 15
where eta <
Filippo 30 30 Filippo 30
9
Nome Età Reddito Padre Figlio
Andrea 27 21 Sergio Franco
Andrea 27 21 Luigi Olga
Padre Figlio
Esempio: Andrea 27 21 Luigi Filippo
Sergio Franco
padri di Andrea 27 21 Franco Andrea
Luigi Olga persone che
Aldo 25 15 Sergio Franco
guadagnano
Luigi Filippo
più di venti Aldo 25 15 Luigi Olga
Franco Andrea milioni Aldo 25 15 Luigi Filippo
10
select padre
from persone, paternita
where figlio=nome and reddito>20
11
Esempio: persone che hanno un nome che inizia per ‘A’ e ha una ‘d’
come terza lettera
select *
from persone
where nome like ‘A_d%'
select *
from impiegati
where eta > 40 or eta is null
• SQL E ALGEBRA RELAZIONALE
Consideriamo il seguente schema di base di dati e la seguente
interrogazione su esso: R1(A1,A2) R2(A3,A4)
12
• SQL E CALCOLO RELAZIONALE
Consideriamo il seguente schema di base di dati e la seguente
interrogazione su esso: R1(A1,A2) R2(A3,A4)
Per quanto riguarda SQL e Join negli esempi visti finora il join veniva
realizzato mediante una opportuna condizione di join espressa nella
clausola WHERE
13
Nome Età Reddito Padre Figlio
Andrea 27 21 Sergio Franco
Andrea 27 21 Luigi Olga
Andrea 27 21 Luigi Filippo
select distinct padre Andrea 27 21 Franco Andrea
from persone, paternita Aldo 25 15 Sergio Franco
where figlio=nome
Aldo 25 15 Luigi Olga
and reddito>20
Aldo 25 15 Luigi Filippo
Aldo 25 15 Franco Andrea
Maria 55 42 Sergio Franco
Nome Età Reddito Padre Figlio Maria 55 42 Luigi Olga
14
SQL offre la possibilità di indicare esplicitamente un’operazione di Join
Sintassi:
select AttrEspr [[as] Alias] {, AttrEspr [[as] Alias] }
from Tabella [[as] Alias]
{ [TipoJoin] join Tabella [[as]Alias] on CondizioneDiJoin }
[ where AltraCondizione ]
Madre Figlio
Padre Figlio
Luisa Maria
Sergio Franco
Luisa Luigi
Luigi Olga
Anna Olga
Luigi Filippo
Anna Filippo
Franco Andrea
Maria Andrea
Franco Aldo
Maria Aldo
15
TipoJoin può essere uno tra: inner, natural, right outer, left outer, full
outer
- Join naturale: padre e madre di ogni persona
paternita IXI maternita
Franco Andrea 2
Franco Aldo
Padre Figlio
select * from Paternita
Franco Andrea
where Padre = ‘Franco'
Franco Aldo
17
max : Massimo
Un’interrogazione scorretta:
select nome, max(reddito)
from persone
Intuitivamente tale interrogazione vorrebbe trovare la persona che
guadagna di più, ma:
Se ne esiste più di una?
Se invece di max ci fosse avg, o sum?
Non è possibile inserire nella target list operatori aggregati ed
espressioni a livello di singola tupla (come ad esempio nomi di attributi)
Fanno eccezione le query che usano raggruppamenti (vedi appresso)
Una interrogazione corretta:
select min(eta), max(reddito)
from persone
Gli operatori aggregati vengono applicati ad un insieme di tuple
Negli esempi visti finora, a tutte le tuple del risultato
Può essere utile applicarli a sottoinsiemi delle tuple del risultato
Clausola group by :
group by ListaAttributi
18
- Attributi che compaiono nella clausola group by
- Operatori aggregati
Infatti in ogni tupla t del risultato dobbiamo avere un valore unico per
tutte le tuple t’ del gruppo che dà luogo a t
Esempio:
Un’interrogazione scorretta:
select padre, f.nome, avg(f.reddito),
from persone f join paternita on figlio = nome
group by padre
Per ogni padre abbiamo una unica tupla nel risultato…
…ma per ogni padre abbiamo più valori di f.nome
La restrizione che abbiamo appena visto in alcuni casi può risultare
eccessiva:
select padre, avg(f.reddito), p.reddito
from persone f join paternita on figlio = nome join
persone p on padre = p.nome
group by padre
In questo caso, pur non comparendo nella group by, l’attributo
p.reddito assume un valore unico per ogni tupla del risultato
Sarebbe possibile, in casi analoghi al precedente, consentire nella
target list la presenza di attributi che non compaiono nella group by
Per semplicità si preferisce però mantenere anche in questi casi la
restrizione che abbiamo visto
Come possiamo eseguire l’interrogazione precedente?
Basta mettere l’attributo p.reddito nella group by
select padre, avg(f.reddito), p.reddito
from persone f join paternita on
figlio = nome join persone p on padre = p.nome
group by padre, p.reddito
19
Esempio: padri i cui figli hanno un reddito medio maggiore di 25
select padre, avg(f.reddito)
from persone f join paternita on figlio = nome
group by padre
having avg(f.reddito) > 25
Si può usare la having senza la group by; in tal caso tutte le tuple del
risultato sono considerate un unico gruppo
Sintatticamente è possibile esprimere nella having condizioni sugli
attributi che non compaiono nella group by…
…è però preferibile esprimere tali condizioni nella clausola where e
lasciare nella having solo le condizioni sugli operatori aggregati
20
Non è richiesto che gli schemi siano identici…
…ma solo che gli attributi siano in ugual numero e abbiano domini
compatibili
La corrispondenza non avviene in base al nome ma in base alla
posizione
21
select figlio, madre as genitore
from maternita
22
Il confronto tra un attributo e una interrogazione nidificata pone un
problema: si confronta il valore assunto da un attributo su una certa
tupla con l’insieme di valori (in generale più di uno) che
costituiscono il risultato della interrogazione nidificata
Si usano le parole chiave:
• any se si richiede che il confronto debba essere verificato per almeno
una tupla dell’insieme
• all se si richiede che il confronto debba esser verificato per ciascuna
tupla dell’insieme
L’appartenenza può essere verificata anche con gli operatori in e not
in
Si hanno le seguenti equivalenze:
• in ⇔ =any
• not in ⇔ <>all
23
Esempio: CANTANTE (Nome,Canzone) AUTORE(Nome,Canzone)
Trovare i cantautori (cioè le persone che hanno cantato almeno una
canzone scritta da loro)
select Nome from Cantante C
where Nome in(select Nome from Autore
where Autore.Canzone= C.Canzone)
Regole di visibilità:
• In un blocco si può fare riferimento a variabili definite in esso o in
blocchi più esterni;
• non è possibile fare riferimento a variabili definite in blocchi più interni
• non è possibile fare riferimenti a variabili definite in blocchi allo stesso
livello
• se un nome di variabile è omesso, si assume riferimento alla variabile
più “vicina”
24
Operazioni di aggiornamento
Le operazioni di aggiornamento possono essere operazioni di:
- inserimento: insert
- eliminazione: delete
- modifica: update
di una o più ennuple di una relazione sulla base di una condizione che
può coinvolgere anche altre relazioni.
Inserimento-sintassi:
insert into Tabella [ ( Attributi ) ]
values( Valori )
Esempi.
insert into persone values ('mario',25,52)
25
Eliminazione-sintassi
delete from Tabella
[ where Condizione ]
Esempi.
delete from persone
where eta < 35
Modifica-sintassi
update NomeTabella
set Attributo = < Espressione |
IstruzioneSelect | null | default >
{, Attributo = < Espressione |
IstruzioneSelect | null | default >}
[ where Condizione ]
Esempi.
update persone set reddito = 45
where nome = 'piero'
update persone
set reddito = reddito * 1.1
where eta < 30
26
Vincoli di integrità generici
Il costrutto check consente di specificare vincoli di integrità sia
intrarelazionali che interrelazioanli
Sintassi: check( Condizione )
Esempi.
create table Impiegato(
Matricola smallint primary key,
Cognome character(20) not null,
Nome character(20) not null,
Sesso character not null check (Sesso in
(‘M’,‘F’))
Stipendio integer,
Superiore character(6),
check (Stipendio <= (select Stipendio
from Impiegato J
where Superiore =
J.Matricola))
)
Esempio.
create assertion AlmenoUnImpiegato
check (1 <= (select count(*)
from Impiegato ))
Viste
In SQL è possibile definire viste (ovvero relazioni i virtuali)
Sintassi:
create view NomeVista [ ( ListaAttributi )] as IstruzioneSelect
[ with [ local | cascaded ] check option ]
Esempio.
Impiegati del reparto amministrazione che guadagnano più di 10
27
create view ImpiegatiAmmin
(Matricola,Nome,Cognome,Stipendio) as
select Matricola,Nome,Cognome,Stipendio
from Impiegato
where Dipart = 'Amministrazione‘ and Stipendio > 10
28
Ogni elemento di un DB può essere protetto (tabelle, attributi, viste,
domini, etc.)
Il creatore di una risorsa assegna i privilegi agli altri
Un utente predefinito _system rappresenta il database administrator e
ha accesso completo a tutte le risorse
Un privilegio é caratterizzato da:
- La risorsa
- L’ utente che garantisce i privilegi
- L’ utente che riceve i privilegi
- L’azione permessa sulla risorsa
- Se il privilegio può essere passato ad altri utenti o no
SQL offre sei tipi di privilegi
- insert: per inserire nuovi oggetti nella risorsa
- update: per modificare il contenuto della risorsa
- delete: per rimuovere un oggetto dalla risorsa
- select: per accedere al contenuto della risorsa mediante una query
- references: per creare un vincolo di integrità referenziale con la
risorsa
- usage: per usare la risorsa nella definizione di uno schema
Concessione di privilegi
grant < Privileges | all privileges > on Resource
to Users [ with grant option ]
Rimozione di privilegi
revoke Privileges on Resource from Users
[ restrict | cascade ]
29