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 usa foreign 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): cascade il 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 alter domain NomeDominio E’ possibile modificare gli schemi con i comandi alter e drop. alter consente 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 comando drop 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 select ListaAttributi (target list) 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 where fra 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 Madre Maternità Figlio Luisa Anna Maria Olga Filippo Andrea Aldo Luigi Andrea 27 Maria 55 Anna 50 Filippo 26 Luigi Franco 60 Olga 30 Sergio 85 Luisa 75 Aldo 25 21 42 35 40 20 41 87 15 Padre Paternità Figlio Luigi Franco Sergio Olga Filippo Andrea Aldo
Selezione e proiezione Nome e reddito delle persone con meno di trenta anni PROJNome, Reddito(SELEta<30(Persone)) select nome, reddito from persone where eta < 30 select p.nome as nome, p.reddito as reddito from persone p where p.eta < 30
Interrogazioni su più tabelle Se si vogliono estrarre informazioni da più tabelle, si pone come argomento della clausola from una 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 where equivale ad eseguire la query sul prodotto cartesiano delle tabelle riportate nella lista!