Modifica dei dati



inserimento
cancellazione
modifica
SQL
1
Insert
insert into <NomeTabella> [(<colonna_i>, …,
<colonna_j>)] values (<valore_i>, …,
<valore_j>);



deve essere specificato un valore per ogni colonna
della lista
se una colonna non è specificata, viene inserito il
valore null
se non viene fornita la lista delle colonne, deve
essere specificato un valore per ogni colonna della
tabella così come appare nella istruzione create
SQL
2
Esempio
insert into PROGETTO (PNO, PNOME,
COMPONENTI, BUDGET, PSTART, PMGR) values
(313, 'BD', 3,150000.15, to_date('06-022001','dd-mm-yyyy'), 7411);
insert into PROGETTO values (314, 'SI',
7411, 5, 350000.75, to_date('12-022001','dd-mm-yyyy'), null);
SQL
3
Insert (2)
insert into <NomeTabella> [(<colonna_i>, …,
<colonna_j>)] <querySQL>;
create table VECCHI_IMP (
INO number(4) not null,
ASS_DATA date);
insert into VECCHI_IMP select INO, DATA_ASS from
IMPIEGATI where DATA_ASS<'31-DIC-60';
SQL
4
Updates
updates <tabella> set
<colonna_i>=<espressione_i>, …,
<colonna_j>=<espressione_j>
[where <condizione>];

espressione può essere



una costante,
una espressione funzionale,
una query SQL
SQL
5
Esempio
update IMPIEGATI set
LAVORO='DIRIGENTE', DIPNO=20,
STIPENDIO=STIPENDIO+1000
where INOME='FORD';
(Il sig. Ford ha avuto un avanzamento di
carriera)
SQL
6
Esempio
update IMPIEGATI set
STIPENDIO=STIPENDIO*1.15
where DIPNO in (10,30);
(Gli impiegati dei dipartimenti 10 e 30
hanno avuto un aumento dello
stipendio del 15%)
SQL
7
Esempio
update IMPIEGATI set
STIPENDIO = (select min(STIPENDIO)
from IMPIEGATI where
LAVORO='DIRIGENTE')
where LAVORO='VENDITORE' and DIPNO=30;
(I venditori del dipartimento 30 ricevono lo stesso
stipendio del manager che ha lo stipendio più
basso)
SQL
8
Delete
delete from <tabella>
[where <condizione>];

senza la clausola where, vengono cancellate
tutte le righe
SQL
9
Esempio
delete from PROGETTO
where PEND < sysdate;
(Cancella tutti i progetti terminati alla
data odierna)
SQL
10
Commit e Rollback

commit: rende permanenti le modifiche
fatte durante l'ultima transazione


quit, create, drop realizzano un commit
implicito
rollback: annulla le modifiche fatte
durante l'ultima transazione
SQL
11
Query su più tabelle (JOIN)
select [distinct]
[<alias_k>.]<colonna_i>,
…,
[<alias_m>.]<colonna_j>
from
<tabella_1>[<alias_1>],
…,
<tabella_n>[<alias_n>]
[where <condizione>];
SQL
12
Alias
Se colonne di tabelle diverse hanno lo
stesso nome, è necessario usare la
notazione
<tabella>.<colonna>
per eliminare ambiguità.
Al posto di <tabella> si può usare l'alias
SQL
13
Esempi
select INOME, I.DIPNO, DIPNOME
from IMPIEGATI I, DIPARTIMENTO D
where I.DIPNO=D.DIPNO and LAVORO='VENDITORE';
select INOME, DIPNOME, PNOME
from IMPIEGATI I, DIPARTIMENTO D, PROGETTO P
where I.INO=P.PMGR and D.DIPNO=I.DIPNO;
select I1.INOME, I2.INOME
from IMPIEGATI I1, IMPIEGATI I2
where I1.CAPO=I2.INO;
SQL
14
Query annidate

La condizione in una clausola where
può contenere anche una query:
select … where … (select …)
subquery
query annidata
SQL
15
Interpretazione delle query
annidate
1.
2.
3.
viene eseguita la subquery
il risultato viene salvato in una tabella
temporanea
il controllo della query esterna viene
fatto sulle righe della tabella
temporanea
SQL
16
Regole per le query annidate




più condizioni possono essere combinate con gli
operatori and, or
si può arrivare fino a 16 livelli di annidamento!
una query esterna non può far riferimento a
tabelle della query più interna (viceversa è
possibile)
se non specificato esplicitamente, i nomi di
colonna fanno riferimento alle tabelle più “vicine”
SQL
17
Subquery
<espressione> [not] in (<subquery>)
<espressione> <operatore_cfr> [any |
all] (<subquery>)
[not] exists (<subquery>)
SQL
18
Esempio
select INOME, STIPENDIO from IMPIEGATI
where INO in
(select PMGR from PROGETTO
where PSTART < ’31-DIC-90’)
and DIPNO=20;
Seleziona gli impiegati del dipartimento 20 (ed il loro
stipendio) che partecipano a progetti partiti prima del
31/12/90
SQL
19
Esempio
select * from IMPIEGATI
where DIPNO in
(select DIPNO from DIPARTIMENTI
where CITTA =‘BOSTON’);
Seleziona gli impiegati dei dipartimenti di Boston
Poiché la subquery ha come risposta un solo valore, si
poteva usare = invece di in.
SQL
20
Subquery correlata


Subquery che fa riferimento a colonne
di tabelle utilizzate nella query
principale
Non si può usare l’intepretazione vista
per le query annidate!!
SQL
21
Interpretazione delle subquery
correlate
1.
Per ogni riga della query esterna,
1.
2.
viene valutata la subquery
viene valutato il predicato della query
esterna
SQL
22
Esempio
select * from IMPIEGATI I1
where DIPNO in
(select DIPNO from IMPIEGATI [I2]
where [I2.]INO=I1.CAPO);
Seleziona i dipendenti che lavorano nello
stesso dipartimento del loro capo
SQL
23
any e all
<espressione> <operatore_cfr> [any |
all] (<subquery>)

confrontano <espressione> con ogni
valore selezionato da <subquery>
SQL
24
any


la condizione è vera se esiste almeno
una riga selezionata dalla subquery per
cui il confronto ha successo
se la subquery restiuisce un insieme
vuoto, la condizione fallisce
SQL
25
Esempio
select * from IMPIEGATI
where STIPENDIO >= any
(select STIPENDIO from IMPIEGATI
where DIPNO = 30)
and DIPNO = 10
Seleziona gli impiegati del dipartimento 10 che hanno uno
stipendio maggiore o uguale di almeno un impiegato del
dipartimento 30
SQL
26
all


la condizione è vera se il confronto ha
successo per tutte le righe selezionate
dalla subquery
se la subquery restiuisce un insieme
vuoto, la condizione ha successo
SQL
27
Esempio
select * from IMPIEGATI
where STIPENDIO > all
(select STIPENDIO from IMPIEGATI
where DIPNO = 30)
and DIPNO <> 30
Seleziona gli impiegati che non lavorano nel dipartimento
30 e che hanno uno stipendio maggiore di tutti gli
impiegati del dipartimento 30
SQL
28
Equivalenze


in è equivalente a = any
not in è equivalente a <> all
SQL
29
Exists
[not] exists (<subquery>)


restituisce valore vero solo se
l’interrogazione fornisce un risultato non
vuoto [vuoto].
ha senso solo per query correlate
SQL
30
Esempio
select * from DIPARTIMENTI
where not exists
(select * from IMPIEGATI
where
DIPNO=DIPARTIMENTI.DIPNO);
Restituisce i dipartimenti che non hanno
impiegati
SQL
31
Operazioni su risultati di query
<query_1>
[union [all] | intersect | minus ]
<query_2>
SQL
32
union

Restituisce l'unione delle tuple risultato
delle due query. Se non viene
specificata la clausola all, i duplicati
vengono eliminati
select INO from IMPIEGATI
union
select CAPO from IMPIEGATI;
SQL
33
intersect

Restituisce l'intersezione delle tuple
risultato delle due query.
select INO from IMPIEGATI
intersect
select CAPO from IMPIEGATI;
SQL
34
minus

Restituisce le tuple che sono risultato
della prima query ma che non sono
risultato della seconda
select INO from IMPIEGATI
minus
select CAPO from IMPIEGATI;
SQL
35
Query con raggruppamento
Consentono di applicare le funzioni di
gruppo non a tutte le righe ma a gruppi
di righe che soddisfano certe proprietà
select <colonna/e>
from <tabella/e>
where <condizione>
group by <colonna/e_gruppo>
[having <condizione/i_gruppo>];

SQL
36
Interpretazione
Le righe risultato della select che hanno gli
stessi valori di <colonna/e_gruppo>
vengono raggruppate.
2.
Le funzioni di gruppo specificate nella select
vengono applicate a ciascun gruppo
separatamente.
N.B. solo le colonne di <colonna/e_gruppo>
possono essere listate nella clausola select
senza funzioni di gruppo
1.
SQL
37
Esempi
select DIPNO, min(STIPENDIO),
max(STIPENDIO)
from IMPIEGATI
group by DIPNO;
select DIPNO, min(STIPENDIO),
max(STIPENDIO)
from IMPIEGATI
where LAVORO='VENDITORE'
group by DIPNO;
SQL
38
having
Dopo che i gruppi sono stati formati, se
ne possono eliminare alcuni in base a
certe condizioni
select DIPNO, min(STIPENDIO),
max(STIPENDIO)
from IMPIEGATI
group by DIPNO
having count(*)>3;

SQL
39
Accesso a tabelle di altri utenti

Per accedere a tabelle di altri utenti
(sempre che se ne abbiano i privilegi)
bisogna far precedere il nome di tabella
dal nome dell'utente
<user>.<tabella>
SQL
40
Sinonimi
Si possono creare sinonimi sia per le
proprie tabelle che per quelle di altri
utenti:
create synonym <sinonimo> for
[<user>.]<tabella>;

SQL
41
Commenti alle definizioni

Si possono aggiungere commenti esplicativi alle definizioni
di tabelle e alle colonne
comment on table <tabella> is '<testo>';
comment on column <tabella>.<colonna> is '<testo>';

I commenti sono inseriti nelle viste del dizionario dei dati
USER_TAB_COMMENTD e USER_COL_COMMENTS
SQL
42
Modifiche di definizioni

E' possibile modificare la struttura di
una tabella



aggiungendo colonne
aggiungendo vincoli di tabella
modificando definizioni di colonne
SQL
43
alter table
alter table <tabella> add
(<definizione_colonna>);
alter table <tabella> add
(<vincoli_di_tabella>)
alter table <tabella> modify
(<nuova_definizione_colonna>);
SQL
44
Cancellazione di una tabella
drop table <tabella> [cascade
constraints];
Cancella le righe e la definizione di una
tabella
SQL
45
Viste
Una vista è una tabella virtuale costruita
selezionando righe e colonne di altre
tabelle.
Una vista può essere usata come le altre
tabelle per la ricerca e per la modifica di
dati.
Una vista viene rivalutata ogni volta che vi si
accede.
SQL
46
Viste (2)
create view <nome_vista> [(<colonna/e>)] as
<query> [with check option [constraint
<nome_vincolo>]];


se (<colonna/e>) non viene specificato, le colonne
della vista avranno lo stesso nome delle colonne
selezionate
il vincolo with check option consente di rifiutare le
modifiche e gli inserimenti di righe nella vista che non
rispondono alla definizione, ovvero che non verrebbo
selezionati dalla query
SQL
47
Esempi
create view DIP20 as select INOME,
LAVORO, STIPENDIO*12 STIP_ANNUO
from IMPIEGATI where DIPNO=20;
create view DIP20 (INOME, LAVORO,
STIP_ANNUO) as select INOME,
LAVORO, STIPENDIO*12 from
IMPIEGATI where DIPNO=20;
SQL
48
Cancellazione di viste
delete <nome_vista>;
SQL
49
Vincoli di integrità

check constraint


limita i valori possibili per un attributo
foreign key constraint

specifica interdipendenze tra relazioni
SQL
50
check constraint

specifica il rango dei possibili valori di uno o
più attributi o certe condizioni che tali valori
devono soddisfare
[constraint <nome>] check (<condizione>)

può essere un vincolo di colonna (se
condizione agisce su una sola colonna) o di
tabella (se condizione agisce su più colonne)
SQL
51
Esempio
create table IMPIEGATI (
…
INOME varchar2(30) constraint CK_NOME
check(INOME=upper(INOME)),
STIPENDIO number(5,2) check (STIPENDIO >=
500),
DIPNO number(3) check (DIPNO between 10 and
100)
);
SQL
52
Esempio
create table PROGETTO (
…
COMPONENTI number(5) constraint
CK_COMPONENTI check(COMPONENTI>2),
…
constraint CK_DATE check(PEND > PSTART)
);
SQL
53
foreign key constraint


crea un legame tra i valori di un attributo
della tabella corrente (interna) ed i valori di
un attributo chiave primaria di un'altra tabella
(esterna), in modo tale che ogni valore
dell'attributo della tabella interna, se non
nullo, sia presente tra i valori dell'attributo
chiave primaria della tabella esterna
può essere un vincolo di colonna o un vincolo
di tabella
SQL
54
foreign key
[constraint <nome>]
[foreign key (<colonna/e>)]
references <tabella> [(<colonna/e>)]
[on delete cascade]
SQL
55



la clausola foreign key deve essere usata se si tratta
di un vincolo di tabella, ovvero se coinvolge più
colonne e deve indicare le colonne della tabella
interna coinvolte
references indica quali colonne della tabella esterna
sono coinvolte; in assenza di specifica viene presa la
colonna che costituisce la chiave primaria della
tabella esterna
on delete cascade specifica che se viene cancellato
un elemento dalla tabella esterna, tutte le righe della
tabella interna che hanno il valore dell'attributo
cancellato, vengono a loro volta cancellate
SQL
56
Esempio
create table IMPIEGATI (
INO number(4) primary key,
…
DIPNO number(3) references
DIPARTIMENTO(DIPNO)
);
SQL
57
Esempio
create table PROGETTO (
PNO number(3) primary key,
PMGR number(4) not null references
IMPIEGATI,
…
);
SQL
58
Esempio
create table IMPIEGATI (
INO number(4) primary key,
…
CAPO number(4) not null references
IMPIEGATI,
…
);
SQL
59
Scarica

as select