Gestione dei valori nulli nei database sql-AD4

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
tu_pla

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
interrogazione

 

 

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

gestione, valori, nulli SQL

• 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:

gestione, valori, nulli SQL, DML

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:

 gestione, valori, nulli SQL, DML, MySQLRight 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)

• Risultato:
 gestione, valori, nulli SQL, DML, MySQL

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:

 gestione, valori, nulli SQL, DML, MySQL

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?

database , gestione, valori, nulli SQL, DML, MySQL

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’

gestione sql