Gestione dei valori nulli
La gestione dei valori nulli si rappresentano in tre diverse situazioni:
– un valore non è applicabile
– un valore è applicabile ma sconosciuto gestione
– non si sa se il valore è applicabile o meno.
Predicati e valori nulli
• Logica a tre valori (V,F,U) – V and U = U – V or U = V – F and U = F – F or U = U – U and U = U – U or U = U – not U = U |
P = (Città is not null) and (CDip like ’Inf%’) |
Interrogazioni sui valori nulli
select *
from Studente
where Cdip = ’Inf’ or
Cdip <> ’Inf’
è equivalente a:
select *
from Studente
where Cdip is not null
Interrogazione semplice con due tabelle
• Estrarre il nome degli studenti di “Logistica” che hanno preso almeno un 30.
select Nome
from Studente, Esame
where Studente.Matr = Esame.Matr
and CDip like ’Lo%’ and Voto = 30
Interrogazione semplice con tre tabelle
Estrarre il nome degli studenti di “Matematica” che hanno preso almeno un 30
select Nome
from Studente, Esame, Corso
where Studente.Matr = Esame.Matr
and Corso.CodCorso = Esame.CodCorso
and Titolo like ’Mat%’ and Voto = 30
Join in SQL‐2
• SQL‐2 ha introdotto una sintassi alternativa per i join, rappresentadoli esplicitamente nella clausola from:
select AttrEspr {, AttrEspr}
from Tabella { [TipoJoin] join Tabella on Condizioni }
[ where AltreCondizioni ]
• TipoJoin può inner, outer ], left [outer] essere right [ oppure full [ outer ], consentendo la rappresentazione dei join esterni.
• La parola chiave naturalpuò precedere TipoJoin (però è implementato di rado).
Join di due tabelle in SQL‐2
select Nome
from Studente, Esame
where Studente.Matr = Esame.Matr
and CDip like ’Lo%’ and Voto = 30
select Nome
from Studente join Esame
on Studente.Matr = Esame.Matr
where CDip like ’Lo%’ and Voto = 30
Database d’esempio: guidatori e automobili
• Notate che Marco Neri NON guida e che la BMW 316 NON è guidata
Inner Join (normale)
• TipoJoin può essere inner, right, left oppure full, consentendo la rappresentazione dei join esterni
• Estrarre i guidatori con le loro macchine
select FirstName, Surname, Driver.DriverID,
CarRegNo, Make, Model
from Driver join Automobile on
(Driver.DriverID = Automobile.DriverID)
• Risultato:
Left join
• Estrarre i guidatori g con le loro macchine, includendo anche i guidatori senza macchine:
select FirstName, Surname, Driver.DriverID
CarRegNo, Make, Model
from Driver left join Automobile on
(Driver.DriverID=Automobile.DriverID)
• Risultato:
Right join
• Estrarre i guidatori con le loro macchine, includendo anche le macchine senza guidatori:
Select FirstName, Surname, Driver.DriverID
CarRegNo, Make, Model
from Driver right join Automobile on
(Driver.DriverID=Automobile.DriverID)
Full join
• Estrarre tutti i guidatori e tutte le automobili, includendo sia le macchine senza guidatori che i guidatori senza macchine:
select FirstName, Surname, Driver.DriverID
CarRegNo, Make, Model
from Driver full join Automobile on
(Driver.DriverID=Automobile.DriverID)
• Risultato:
Sintassi completa
select AttrEspr [[ as ] Alias ] {, AttrEspr [[ as ] Alias ]
from Tabella [[ as ] Alias ] {, Tabella [[ as ] Alias ] }
[ where Condizione ]
ALIAS:
• ridenominazione del risultato nella clausola select
• nomi di variabili relazionali nella clausola from
Interrogazione semplice con variabili relazionali
Chi sono i dipendenti di Giorgio?
Chi sono i dipendenti di Giorgio?
select X.Nome, , X.MatrMgr, Y.Matr, Y.Nome
from Impiegato as X, Impiegato as Y
where X.MatrMgr = Y.Matr
and Y.Nome = ’Giorgio’