Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Vincoli interrelazionali in SQL
Cognome character(20) not null, unique (Cognome, Nome) • è diverso da: Nome character(20) not null unique, Cognome character(20) not null unique
SQL Vincoli interrelazionali (chiave esterna) permettono di • references foreign key definire vincoli di integrità referenziale; sintassi: – per singoli attributi: dopo il dominio references – riferimenti su più attributi: Attributo { Attributo } foreign key( , ) references ...
• è possibile associare politiche di reazione alla violazione dei vincoli (causate da modifiche sulla tabella esterna, cioè quella cui si fa riferimento)
SQL Richiamo: base di dati con vincoli di integrità referenziale
SQL Vincoli interrelazionali, esempiocreate table Infrazioni(Codice character(6) primary key, Data date not null, Vigile integer not null references Vigile(Matricola), Provincia character(2), Numero character(6), foreign key(Provincia, Numero) references Automobili(Provincia, Numero)) e’ una
Infrazioni Vigile Auto | SQL Violazione dei vincoli |
---|---|
14 |
|
15 |
|
- update< cascade | set null | set default |>no action 16SQL Reazioni per deletesi propagano le cancellazioni
- cascade: all'attributo referente viene assegnato il valore nullo
- set null: al posto del valore cancellato nella tabella all'attributo referente viene assegnato il valore
- set default: di default al posto del valore cancellato nella tabella esterna la cancellazione non viene consentita
- no action:
- 17SQL Reazioni per update
- il nuovo valore valore viene propagato nell'altra
- cascade: tabella all'attributo referente viene assegnato il valore nullo
- set null: al posto del valore modificato nella tabella all'attributo referente viene assegnato il valore
- set default: di default al posto del valore modificato nella tabella esterna l'azione di modifica non viene consentita
- no action:
- 18SQL Modifiche degli schemi
- Fornisce primitive per la manipolazione di schemi che permettono di modificare gli schemi:
- alter
- quelle contente i dati, e
- quelle contenente i metadati (dati che descrivono dati), detti il catalogo della base di dati oppure il dizionario dei dati
- target list
- clausola from
- clausola where
seleziona tra le righe che appartengono al prodotto cartesiano delle tabelle elencate nella clausola quelle che soddisfano la condizione espressa
nell'argomento della clausola where SQL Selezione e proiezione "Nome e reddito delle persone con meno di trenta anni"
select nome, reddito
from persona
where eta < 30
SQL SELECT, abbreviazioni
• data una relazione R su A e B
select *
from R
• equivale (intutivamente) a
select X.A AS A, X.B AS B
from R X
where true
SQL Selezione, senza proiezione
select *
from Impiegato
where Cognome = 'Rossi'
SQL Espressioni nella target list
select Stipendio/12 as StipendioMensile
from Impiegato
where Cognome = 'Bianchi'
SQL Disgiunzione
select Nome, Cognome
from Impiegato
where Dipart = 'Amministrazione' or Dipart = 'Produzione'
SQL Condizione complessa
select Nome
from Impiegato
where Cognome = 'Rossi' and (Dipart = 'Amministrazione' or Dipart = 'Produzione')
SQL Condizione "LIKE"
"Gli impiegati che hanno un cognome che ha una 'o' in seconda posizione e finisce per"
Numero | Argomento | Query |
---|---|---|
30 | SQL Gestione dei valori nulli | SELECT * FROM Impiegato WHERE Cognome LIKE '_o%i' OR Stipendio < 50 OR Stipendio IS NULL |
31 | SQL Selezione, proiezione e join | SELECT * FROM Impiegato WHERE Stipendio > 20 |
32 | SQL Proiezione, senza selezione | SELECT Nome, Cognome FROM Impiegato |
33 | SQL Proiezione: duplicati | SELECT Cognome FROM Impiegato |
34 | SQL Join naturale | SELECT paternita.figlio, padre, madre FROM maternita, paternita WHERE paternita.figlio = maternita.figlio |
35 | SQL Join di una relazione con se stessa | SELECT f.nome, f.reddito, p.reddito FROM persone p, paternita f WHERE p.nome = f.figlio AND p.reddito > f.reddito |
persone fwhere p.nome = padre andfiglio = f.nome andf.reddito > p.reddito 36
SQL Ridenominazione del risultato“Le persone che guadagnano più dei rispettivi padri;mostrare nome, reddito e reddito del padre”
select figlio,f.reddito as reddito,p.reddito as redditoPadrefrom persone p, paternita, persone fwhere p.nome = padre andfiglio = f.nome andf.reddito > p.reddito 37
SQL SELECT, con join esplicito, sintassiAttrExpr [ [as] Alias ] {,AttrExpr [ [as] Alias ] }selectTabella [ [ ] Alias ]from as{[ TipoJoin ] Tabella [ [ ] Alias ] CondDiJoin }, ...join as on[ AltraCondizione ]where 38
SQL Join esplicito“Padre e madre di ogni persona”select madre, paternita.figlio, padrefrom maternita join paternita onpaternita.figlio = maternita.figlio 39
SQL Ulteriore estensione: join naturale“Padre e madre di ogni persona”select madre, paternita.figlio, padrefrom maternita natural join paternitaselect madre, paternita.figlio, padrefrom maternita join paternita
= 'Amm'group by Dipartimento45SQL Operatori aggregati (continua)select Dipartimento, count(*) AS NumeroImpiegatifrom Impiegatogroup by Dipartimento46SQL Operatori aggregati (continua)select Dipartimento, avg(Stipendio) AS StipendioMediofrom Impiegatogroup by Dipartimento47SQL Operatori aggregati (continua)select Dipartimento, max(Stipendio) AS StipendioMassimofrom Impiegatogroup by Dipartimento48SQL Operatori aggregati (continua)select Dipartimento, min(Stipendio) AS StipendioMinimofrom Impiegatogroup by Dipartimento49SQL Operatori aggregati (continua)select Dipartimento, sum(Stipendio) AS StipendioTotalefrom Impiegatogroup by Dipartimento50SQL Operatori aggregati (continua)select Dipartimento, count(*) AS NumeroImpiegati, avg(Stipendio) AS StipendioMedio, max(Stipendio) AS StipendioMassimo, min(Stipendio) AS StipendioMinimo, sum(Stipendio) AS StipendioTotalefrom Impiegatogroup by Dipartimento51SQL Operatori aggregati (continua)select Dipartimento, count(*) AS NumeroImpiegatifrom Impiegatogroup by Dipartimentohaving count(*) > 252SQL Operatori aggregati (continua)select Dipartimento, avg(Stipendio) AS StipendioMediofrom Impiegatogroup by Dipartimentohaving avg(Stipendio) > 300053SQL Operatori aggregati (continua)select Dipartimento, max(Stipendio) AS StipendioMassimofrom Impiegatogroup by Dipartimentohaving max(Stipendio) > 500054SQL Operatori aggregati (continua)select Dipartimento, min(Stipendio) AS StipendioMinimofrom Impiegatogroup by Dipartimentohaving min(Stipendio) < 200055SQL Operatori aggregati (continua)select Dipartimento, sum(Stipendio) AS StipendioTotalefrom Impiegatogroup by Dipartimentohaving sum(Stipendio) > 100000
<p>Produzione</p>
<p>l'operatore aggregato (count) viene applicato al risultato dell'interrogazione:</p>
<p>select * from Impiegato where Dipart = 'Produzione'</p>
<p>SQL COUNT: sintassi< | [ | ] ListaAttributi > ) count ( * distinct all select count(Stipendio) as NumeroStipendi from Impiegato select count(distinct Stipendio) as StipendiDiversi from Impiegato</p>
<p>SQL COUNT e valori nulli select count(*) as NumeroImpiegati from Impiegato select count(Stipendio) as NumeroStipendi from Impiegato</p>
<p>SQL Somma, media, massimo, minimo< | | | > [ | ] AttrEspr sum max min avg ( distinct all ) Totale degli stipendi del dipartimento amministrazione select sum(Stipendio) as TotaleStipendi from Impiegato where Dipart = 'Amministrazione'</p>
<p>escludono opportunamente i valori nulli</p>
<p>SQL Join e operatore aggregato "Il massimo stipendio tra quelli degli impiegati che lavorano in un dipartimento con sede a Milano" select max(Stipendio) from Impiegato, Dipartimento D where</p>
Dipart = D.Nome and Citta = 'Milano'
Nota: non abbiamo usato la e l'attributo nel risultato non ha asnome 49
SQL Operatori aggregati e target list
un'interrogazione scorretta: select Cognome, Nome, max(Stipendio) from Impiegato, Dipartimento where Dipart = NomeDip and Citta = 'Milano'
di chi sarebbe il cognome? La target list deve essere omogenea 50
SQL Interrogazioni con raggruppamento
gli operatori aggregati vengono applicati ad un insieme di righe
gli esempi visti operano su tutte le righe
spesso esiste l'esigenza di applicare operatori aggregati ad distintamente ad insiemi di tuple
in SQL l'operatore group by ci consente di fare questo 51
SQL Operatori aggregati e raggruppamenti
"Per ogni dipartimento, la somma degli stipendi" select Dipart, sum(Stipendio) as SommaStipendi from Impiegato group by Dipart 52
SQL Semantica di interrogazione con operatori aggregati