Basi di Dati S Q L Lezione 3 Antonio Virdis a.virdis@iet.unipi.it
Sommario Binding tra query e visibilità Query annidate non scalari Tabelle come insiemi Viste 2
Query annidate di nuovo!?!) Possiamo annidare query nel: Select From Where Ci permettono di unire diverse domande in una stessa query 3
Query annidate scalari di nuovo!?!) Indicare nome e cognome del medico con la parcella più alta... SELECT m1.nome, m1.cognome FROM medico AS m1 WHERE parcella = SELECT MAXparcella) FROM medico AS m2 ) 1 2 Non correlate! 4
Query annidate scalari correlate Indicare nome e cognome del medico con la parcella più alta...per ogni città SELECT m1.nome, m1.cognome FROM medico AS m1 WHERE parcella = SELECT MAXparcella) FROM medico AS m2 WHERE m1.citta = m2.citta ) Correlate! 5
Visibilità Una variabile è usabile solo Nella query in cui è definita In una query nidificata interna a quella in cui è definita SELECT m1.nome, m1.cognome FROM medico AS m1 WHERE parcella = SELECT MAXparcella) FROM medico AS m2 WHERE m1.citta = m2.citta ) 6
Query annidate NON scalari E' possibile confrontarsi con una query che produce più di un risultato Si fanno seguire agli operatori di confronto le parole chiave ALL, ANY E' richiesta la compatibilità di dominio tra gli attributi coinvolti 7
Esercizio 1 Indicare nome e cognome del medico con la parcella più alta in un DB in cui non funzioni l'operatore MAX) SELECT nome, cognome FROM medico WHERE parcella >= ALL SELECT parcella FROM medico ) 8
Esercizio 2 Indicare nome e cognome del medico con la parcella più alta in un DB in cui non funzioni l'operatore MAX e in cui si sia rotto il tasto = ) SELECT nome, cognome FROM medico m1 WHERE parcella > ALL SELECT parcella FROM medico m2 WHERE m1.matricola<>m2.matricola ) 9
Esercizio 3 Indicare nome e cognome dei pazienti che abitano in città in cui non si trova neppure un medico specializzato in otorinolaringoiatria SELECT nome, cognome FROM paziente p WHERE p.citta <> ALL SELECT m.citta FROM medico m WHERE specializzazione='otorinolaringoiatria' ) 10
Operazioni Insiemistiche Query 1 Query 2 11
Appartenenza ad un insieme??? Expr IN SELECT ) Restituisce vero se l'espressione Expr appartiene alla sottoquery Expr NOT IN SELECT ) Restituisce vero se l'espressione Expr non appartiene alla sottoquery 12
Esistenza??? EXISTS SELECT ) Restituisce vero se la sottoquery restituisce un risultato non vuoto NOT EXISTS SELECT ) Restituisce vero se la sottoquery restituisce un risultato vuoto 13
UNIONE Query 1 Query 2 UNION 14
Esercizio 4 Indicare nome e cognome dei pazienti e dei medici SELECT nome, cognome FROM paziente UNION SELECT nome, cognome FROM medico pazienti medici 15
Intersezione A B 16
Esempio Indicare nome e cognome dei pazienti di Roma che sono stati visitati almeno una volta nel 2007 SELECT nome,cognome FROM paziente WHERE citta='roma' AND CodFiscale IN SELECT paziente FROM visita WHERE YEARdata)=2007 ) ROMA 2007 17
Differenza B A C 18
Esercizio 5 Indicare nome e cognome dei medici di Pisa che hanno visitato solamente persone con reddito inferiore a 3400 SELECT nome, cognome FROM medico m PISA WHERE città= pisa AND NOT EXISTS SELECT v.medico FROM paziente p JOIN visita v ON p.codfiscale=v.paziente WHERE p.reddito>3400 AND m.matricola=v.medico ) >3400 19
Esercizio 6 Indicare nome e cognome dei pazienti che non sono mai stati visitati da un proprio compaesano SELECT p.nome, p.cognome FROM paziente p WHERE NOT EXISTS SELECT * FROM medico m JOIN visita v ON m.matricola=v.medico WHERE m.citta=p.citta AND v.paziente=p.codfiscale ) 20
Viste Possono essere viste come tabelle di appoggio Vengono ricalcolate ogni volta che le si usa SINTASSI CREATE OR REPLACE VIEW NomeVista Attr1, Attr2, ) AS SELECT FROM WHERE ) 21
Esempio Viste Indicare quanti sono i pazienti maschi di Pisa CREATE OR REPLACE VIEW PazientiPisani AS SELECT * FROM paziente WHERE citta='pisa' AND sesso='m' ); SELECT COUNT*) FROM PazientiPisani 22
Viste: benefici Query complesse possono essere realizzate in maniera più semplice Gestione della sicurezza viste con restrizioni) Supporto per la modifica del DB 23
Esercizio 7 Indicare nome e cognome dei pazienti che sono stati visitati da tutti i medici TUTTI I MEDICI Medici che hanno visitato A 24
Soluzione 7 SELECT nome,cognome FROM paziente p WHERE NOT EXISTS SELECT paziente, medico FROM visita WHERE medico NOT IN SELECT medico FROM visita WHERE p.codfiscale=paziente ) ) 25