Vincoli interrelazionali
Vincoli di integrità referenziale
In SQL si usa il vincolo di foreign key (chiave esterna) per creare un legame fra i valori di un attributo della tabella corrente (interna) e un attributo di un’altra tabella (esterna). Si impone che per ogni riga della tabella interna il valore dell’attributo sia presente nel corrispondente attributo della tabella esterna.
L’attributo della tabella esterna deve essere unique.
Se l’attributo è unico allora si usa references.
Altrimenti si usaforeign key.
Vincoli interrelazionali
Es.
create table Impiegato (
Matricola character(6) primary key, Nome character(20) not null, Cognome character(20) not null, Dipart character(15)
references Dipartimento(NomeDip), Stipendio numeric(9) default 0,
unique (Cognome, Nome), foreign key(Nome, Cognome)
references Anagrafica(Nome,Cognome) )
Vincoli Interrelazionali
Per i vincoli visti l’inserimento di un valore che li viola viene semplicemente impedito.
In caso di vincoli di integrità referenziale, quando la violazione avviene per un cambiamento apportato alla tabella esterna, si hanno diverse possibili reazioni associabili al comando di aggiornamento che causa l’inconsistenza.
Modifica (comando update):
cascadeil nuovo valore dell’attributo della tabella esterna viene riportato su tutte le corrispondenti righe della tabella interna.
set null all’attributo referente viene assegnato il valore nullo.
set default all’attributo referente viene assegnato il valore di default.
no action la modifica non viene consentita.
Vincoli Interrelazionali
Cancellazione (comando delete):
cascade tutte le corrispondenti righe della tabella interna vengono cancellate.
set null all’attributo referente viene assegnato il valore nullo.
set default all’attributo referente viene assegnato il valore di default.
no action la cancellazione non viene consentita.
Per applicare una delle politiche:
on < delete | update >
< cascade | set null | set default | no action >
subito dopo la specifica del riferimento
Modifica degli schemi
E’ possibile modificare gli schemi con i comandi altere drop.
alterconsente di modificare domini e schemi di tabelle.
alter domain NomeDominio
< set default ValDefault | drop default |
add constraint DefVincolo | drop constraint NomeVincolo >
Modifica degli Schemi
alter table NomeTabella <
alter column NomeAttributo
< set default NuovoDefault | drop default >|
add constraint DefVincolo | drop constraint NomeVincolo | add column NomeAttributo | drop column NomeAttributo
>
NB Quando si inserisce un nuovo vincolo, questo deve essere soddisfatto dai dati già presenti
Modifica degli Schemi
Il comandodrop permette di rimuovere dei componenti
drop < schema | domain | table | view | assertion > NomeElemento
[ restrict | cascade ]
restrict specifica di non eseguire il comando in presenza di oggetti non vuoti.
cascade implica che gli oggetti specificati vengano rimossi.
Inoltre vengono rimossi tutti gli oggetti da essi dipendenti.
Quindi, ATTENZIONE!!!!
Interrogazioni
Le interrogazioni in SQL sono formulate in modo dichiarativo specificando cioè cosa si vuole ottenere e non come lo si vuole ottenere.
L’interrogazione viene passata all’ottimizzatore di interrogazioni (query optimizer) che fa parte del DBMS. Questo la analizza e la traduce nel linguaggio di interrogazione interno al DBMS.
Per questo chi programma in SQL deve cercare di scrivere codice leggibile e facilmente modificabile, piuttosto che efficiente.
Interrogazioni
L’istruzione base per le interrogazioni èselect select ListaAttributi (target list) from ListaTabelle (clausola from)
[ where Condizione ] (clausola where)
Più in dettaglio:
select AttrEspr [[as]Alias]{, AttrEspr [[as]Alias]}
from Tabella [[as]Alias]{, Tabella [[as]Alias]}
[ where Condizione]
Seleziona le righe che soddisfano la condizione wherefra quelle appartenenti al prodotto cartesiano delle tabelle in ListaTabelle.
Ogni colonna (tabella) può essere ridenominata con un alias.
Interrogazioni
Es.
Data una base di dati che contiene le tabelle:
IMPIEGATO(Nome, Cognome, Dipart, Ufficio, Stipendio, Città) DIPARTIMENTO(Nome, Indirizzo,Città)
select Stipendio/12 as SalarioMensile from Impiegato
where Cognome = `Rossi`
Il risultato è una tabella con una colonna rinominata SalarioMensile e tante righe quanti sono gli impiegati che si chiamano Rossi.
Se si usa *dopo select si selezionano tutti gli attributi
Nome Età Persone
Reddito Andrea 27
Maria 55 Anna 50 Filippo 26 Luigi 50 Franco 60 Olga 30 Sergio 85 Luisa 75 Aldo 25
21
42 35 30 40 20 41 35 87 15 Madre
Maternità Figlio Luisa
Anna Anna Maria Maria Luisa
Maria
Olga Filippo Andrea Aldo Luigi
Padre Paternità Figlio
Luigi Luigi Franco Franco Sergio
Olga Filippo Andrea Aldo Franco
Selezione e proiezione
Nome e reddito delle persone con meno di trenta anni PROJNome, Reddito(SELEta<30(Persone))
selectnome, reddito frompersone whereeta < 30
selectp.nome as nome, p.reddito as reddito frompersone p
wherep.eta < 30
Interrogazioni su più tabelle
Se si vogliono estrarre informazioni da più tabelle, si pone come argomento della clausola fromuna lista delle tabelle.
Se si deve formulare un join, è possibile farlo esplicitando il collegamento fra le due tabelle nella clausola where.
Es.
Estrarre i nomi degli impiegati e le città dove lavorano.
select Impiegato.Nome, Impiegato.Cognome, Dipartimento.Città
from Impiegato, Dipartimento
where Impiegato.Dipart = Dipartimento.Nome
Attenzione: specificare una lista di tabelle nella clausola from senza specificare anche una condizione di join nella clausola whereequivale ad eseguire la query sul prodotto cartesiano delle tabelle riportate nella lista!