il linguaggio sql - unibg · sql come query language enrico cavalli anno accademico 2012-2013...
TRANSCRIPT
Elaborazione Automatica dei Dati
SQL come Query Language
Enrico Cavalli
Anno Accademico 2012-2013
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 2
Il linguaggio SQL
• SQL = Structured Query Language
• Diverse versioni del linguaggio
– gli standard ANSI: SQL, SQL2, SQL3– le versioni proposte dai produttori di DBMS
• SQL è un linguaggio che permette di:
– definire uno schema relazionale - DDL– modificare la base di dati - DML– costruire interrogazioni - QL
• Le interrogazioni che si costruiscono con SQL sono un’estensione di quelle dell’algebra relazionale
Esaminiamo SQL come linguaggio per
interrogare il database
Le interrogazioni dell’algebra relazionale con SQL
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 4
Interrogazioni in SQL (1)
• Considerando la base di dati definita dallo schema:
Film ( Titolo, Anno, Lunghezza, aColori, NomeStudio )Attori ( Titolo, Anno, NomeAttore )
• Costruiamo le interrogazioni per ottenere:
– Titolo ed Anno dei film della Fox lunghi almeno 100 minuti
– Tutti gli attributi dei film della Fox lunghi più di 100 minuti
SELECT Titolo, AnnoFROM Film WHERE NomeStudio = ‘Fox’ AND Lunghezza >= 100;
SELECT *FROM Film WHERE NomeStudio = ‘Fox’ AND Lunghezza > 100;
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 5
Interrogazioni in SQL (2)
• L’elenco degli attori del film: Moulin Rouge del 2002
• L’elenco degli studi che hanno prodotto i film con Nicole Kidman
Film ( Titolo, Anno, Lunghezza, aColori, NomeStudio )Attori ( Titolo, Anno, NomeAttore )
SELECT NomeAttoreFROM Attori WHERE Titolo = ‘Moulin Rouge’ AND Anno = 2002;
SELECT NomeStudioFROM Film, AttoriWHERE Film.Titolo = Attori.Titolo AND
Film.Anno = Attori.Anno ANDNomeAttore = ‘Nicole Kidman’;
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 6
• I protagonisti dei film che durano almeno 100 minuti
• I protagonisti e la durata in ore dei film che durano più di 100 minuti
Interrogazioni in SQL (3)
SELECT NomeAttoreFROM Film, Attori WHERE Film.Titolo = Attori.Titolo AND
Film.Anno = Attori.Anno AND Lunghezza >= 100;
SELECT NomeAttore, Lunghezza/60 AS DurataFROM Film AS F, Attori AS AWHERE F.Titolo = A.Titolo AND F.Anno = A.Anno
AND Lunghezza > 100;
Film ( Titolo, Anno, Lunghezza, aColori, NomeStudio )Attori ( Titolo, Anno, NomeAttore )
Estensioni rispetto all’algebra relazionale
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 7
Condizioni di ricerca (1)
• I film di durata compresa tra 90 e 120 minuti
– Equivale all’interrogazione:
SELECT Titolo, AnnoFROM FilmWHERE Lunghezza Between 90 AND 120;
Film ( Titolo, Anno, Lunghezza, aColori, NomeStudio )Attori ( Titolo, Anno, NomeAttore )
SELECT Titolo, AnnoFROM FilmWHERE Lunghezza>=90 AND Lunghezza<=120;
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 8
Condizioni di ricerca (2)
• I film dove recitano gli attori ‘X’ o ‘Y’ o ’Z’
• Equivale all’interrogazione:
SELECT Titolo, AnnoFROM AttoriWHERE NomeAttore IN (‘X’,‘Y’,‘Z’);
SELECT Titotlo, AnnoFROM AttoriWHERE NomeAttore = ‘X’ OR NomeAttore = ‘Y’ OR
NomeAttore = ‘Z’;
Film ( Titolo, Anno, Lunghezza, aColori, NomeStudio )Attori ( Titolo, Anno, NomeAttore )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 9
Confronto di Stringhe (1)
• Elenco degli impiegati il cui cognome inizia per ‘B’ o per ‘C’
• Si è fatto uso dei caratteri Jolly
– % ( 0 o più caratteri arbitrari )
– _ ( 1 carattere arbitrario )
• In molti SQL sono accettati ? e * al posto di _ e %
Matricola Nome Età Stipendio
101 M.Rossi 34 40103 M.Bianchi 23 35104 L.Neri 38 61105 N.Bini 44 38210 M.Celli 49 60231 S.Bisi 50 60252 N.Bini 44 70301 S.Rossi 34 70375 M.Rossi 50 65
Matricola Nome Età Stipendio
101 M.Rossi 34 40103 M.Bianchi 23 35104 L.Neri 38 61105 N.Bini 44 38210 M.Celli 49 60231 S.Bisi 50 60252 N.Bini 44 70301 S.Rossi 34 70375 M.Rossi 50 65
Matricola Nome Età Stipendio
103 M.Bianchi 23 35
105 N.Bini 44 38
210 M.Celli 49 60
231 S.Bisi 50 60
252 N.Bini 44 70
Matricola Nome Età Stipendio
103 M.Bianchi 23 35
105 N.Bini 44 38
210 M.Celli 49 60
231 S.Bisi 50 60
252 N.Bini 44 70
SELECT *FROM ImpiegatiWHERE Nome LIKE ‘_.B%' OR
Nome LIKE ‘_.C%' ;
Estensione rispetto
all’algebra relazionale
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 10
Confronto di Stringhe (2)
• L’operatore LIKE fa uso di due caratteri speciali:
– _ ( ? ) al posto di un carattere arbitrario
– % ( * ) al posto di n caratteri arbitrari ( n >= 0 )
• Il carattere ‘ (apice) in una stringa è indicato con ‘’ (due apici)
• Una stringa può spesso essere delimitata con “ (doppio apice)
• I caratteri speciali: _ % in una stringa sono indicati con le sequenze di escape , precisando il carattere di escape con ESCAPE
– Nome LIKE ‘%&_%’ ESCAPE ‘&’ Nome deve contenere _
– Valore LIKE ‘%£%’ ESCAPE ‘£’ Valore deve terminare con %
– Titolo LIKE ‘%’’s%’ Titolo deve contenere un genitivosassone
– Valore LIKE ‘_%£%’ ESCAPE ‘£’ Valore deve terminare con % preceduto da almeno un carattere
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 11
Ordinamenti
• Elenco degli impiegati il cui cognome inizia per ‘B’ o per ‘C’, ordinato per valori decrescenti di Età:
• ORDER BY Colonna [ ASC | DESC ]
Matricola Nome Età Stipendio
231 S.Bisi 50 60
210 M.Celli 49 60
252 N.Bini 44 70
105 N.Bini 44 38
103 M.Bianchi 23 35
Matricola Nome Età Stipendio
231 S.Bisi 50 60
210 M.Celli 49 60
252 N.Bini 44 70
105 N.Bini 44 38
103 M.Bianchi 23 35
SELECT *FROM ImpiegatiWHERE Nome LIKE ‘_.B%' OR
Nome LIKE ‘_.C%‘ORDER BY Età DESC;
Estensione rispetto
all’algebra relazionale
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 12
• Elenco di tutti i film con titolo anno e nome dello studio
• I film in bianco e nero girati dopo il 1970
• I film della MGM girati dopo il 1970 di durata minore di 90 minuti
Comprendere l’SQL (1)
SELECT Titolo FROM Film WHERE Anno > 1970 AND NOT aColori;
SELECT Titolo FROM Film WHERE ( Anno > 1970 AND Lunghezza < 90 ) AND
NomeStudio = ‘MGM’;
SELECT Titolo, Anno, NomeStudio FROM Film;
Film ( Titolo, Anno, Lunghezza, aColori, NomeStudio )Attori ( Titolo, Anno, NomeAttore )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 13
Comprendere l’SQL (2)
• Elenco dei film girati dopo il 1970 e che contengono ‘love’ nel titolo ordinato per valori crescenti di NomeStudio e, a parità di nome studio, per valori decrescenti di durata
• I film recitati da attori nel cui nome compare la sequenza ‘cruis’
SELECT Titolo, NomeStudio, LunghezzaFROM Film WHERE Anno > 1970 AND Titolo LIKE ‘%love%’ORDER BY NomeStudio, Lunghezza DESC;
SELECT TitoloFROM Film AS F, Attori AS AWHERE A.Titolo = F.Titolo AND A.Anno = F.Anno
AND NomeAttore LIKE ‘%cruis%’;
Film ( Titolo, Anno, Lunghezza, aColori, NomeStudio )Attori ( Titolo, Anno, NomeAttore )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 14
Il comando Select (1)
SELECT
FROM
WHERE
ORDER BY
Quali colonne mostrare, ridenominazioni e calcoli
Da quali tabelle si prelevano i dati
Le condizioni che devono essere soddisfatte da una riga per essere
scelta con il comando SELECT
Le clausole obbligatorie Sono: SELECT e FROM
Deve essere rispettato l’ordine: SELECT – FROM –
WHERE – ORDER BY
Il comando SELECT termina con ;
Ordinamenti
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 15
Il comando Select (2)
SELECT
FROM
WHERE
ProiezioniRidenominazioni
Calcoli
Prodotti CartesianiJoin Il Join di tabelle è ottenuto con il
Theta Join : si costruisce il prodotto cartesiano delle tabelle
elencandole nella clausola FROM e si specifica nella
clausola WHERE quali righe scegliere
SelezioniCondizioni di Join
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 16
Date le tabelle: Impiegati ( Matricola, Nome, Età, Stipendio )Supervisione ( Capo, Impiegato )
Matricola Nome Età Stipendio
101 M.Rossi 34 40103 M.Bianchi 23 35104 L.Neri 38 61105 N.Bini 44 38210 M.Celli 49 60231 S.Bisi 50 60252 N.Bini 44 70301 S.Rossi 34 70375 M.Rossi 50 65
Matricola Nome Età Stipendio
101 M.Rossi 34 40103 M.Bianchi 23 35104 L.Neri 38 61105 N.Bini 44 38210 M.Celli 49 60231 S.Bisi 50 60252 N.Bini 44 70301 S.Rossi 34 70375 M.Rossi 50 65
Capo Impiegato
210 101210 103210 104231 105301 210301 231375 252
Capo Impiegato
210 101210 103210 104231 105301 210301 231375 252
1. Nome, Matricola, Età dei dipendenti con stipendio > 40
2. Matricola dei capi degli impiegati che hanno Stipendio > 40
3. Nome e Stipendio dei capi degli impiegati che hanno Stipendio > 40
4. L’elenco degli impiegati che guadagnano più del proprio capo, mostrando Matricola, Nome e Stipendio di ogni impiegato e del capo
Interrogazioni in SQL(1)
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 17
• Nome, Matricola, Età degli impiegati con stipendio > 40
• Matricola dei capi degli impiegati con stipendio > 40
Come si è arrivati a questa Select?
Interrogazioni in SQL(2)
SELECT Nome, Matricola, EtàFROM ImpiegatiWHERE Stipendio > 40;
SELECT Supervisione.CapoFROM Impiegati, SupervisioneWHERE Impiegati.Stipendio > 40 AND
Impiegati.Matricola=Supervisione.Impiegato;
Impiegati ( Matricola, Nome, Età, Stipendio )Supervisione ( Capo, Impiegato )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 18
Basta ora visualizzare la matricola del
capo …
• Costruendo la query per passi:
SELECT S.*, I.* FROM Supervisione AS S,
Impiegati AS IWHERE S.Impiegato =
I.Matricola;
Capo Impiegato Matricola Nome Età Stipendio210 101 101 M.Rossi 34 40
210 103 103 M.Bianchi 23 35210 104 104 L.Neri 38 61
231 105 105 N.Bini 44 38
301 210 210 M.Celli 49 60
301 231 231 S.Bisi 50 60375 252 252 N.Bini 44 70
Capo Impiegato Matricola Nome Età Stipendio210 101 101 M.Rossi 34 40
210 103 103 M.Bianchi 23 35210 104 104 L.Neri 38 61
231 105 105 N.Bini 44 38
301 210 210 M.Celli 49 60
301 231 231 S.Bisi 50 60375 252 252 N.Bini 44 70
Capo Impiegato Matricola Nome Età Stipendio210 104 104 L.Neri 38 61
301 210 210 M.Celli 49 60301 231 231 S.Bisi 50 60
375 252 252 N.Bini 44 70
Capo Impiegato Matricola Nome Età Stipendio210 104 104 L.Neri 38 61
301 210 210 M.Celli 49 60301 231 231 S.Bisi 50 60
375 252 252 N.Bini 44 70
SELECT S.*, I.* FROM Supervisione AS S,
Impiegati AS IWHERE S.Impiegato =
I.Matricola AND I.Stipendio > 40;
Interrogazioni in SQL(3)
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 19
• Nome e stipendio dei capi degli impiegati che hanno stipendio > 40
SELECT * FROM Impiegati AS C, Supervisione AS S, Impiegati A S IWHERE C.Matricola=S.Capo AND S.Impiegato=I.Matricol a;
C.Matricola C.Nome C.Età C.Stipendio Capo Impiegato I.Mat ricola I.Nome I.Età I.Stipendio210 M.Celli 49 60 210 101 101 M.Rossi 34 40
210 M.Celli 49 60 210 103 103 M.Bianchi 23 35210 M.Celli 49 60 210 104 104 L.Neri 38 61
231 S.Bisi 50 60 231 105 105 N.Bini 44 38
301 S.Rossi 34 70 301 210 210 M.Celli 49 60
301 S.Rossi 34 70 301 231 231 S.Bisi 50 60375 M.Rossi 50 65 375 252 252 N.Bini 44 70
C.Matricola C.Nome C.Età C.Stipendio Capo Impiegato I.Mat ricola I.Nome I.Età I.Stipendio210 M.Celli 49 60 210 101 101 M.Rossi 34 40
210 M.Celli 49 60 210 103 103 M.Bianchi 23 35210 M.Celli 49 60 210 104 104 L.Neri 38 61
231 S.Bisi 50 60 231 105 105 N.Bini 44 38
301 S.Rossi 34 70 301 210 210 M.Celli 49 60
301 S.Rossi 34 70 301 231 231 S.Bisi 50 60375 M.Rossi 50 65 375 252 252 N.Bini 44 70
Capo Impiegato210 101
210 103210 104
231 105
301 210
301 231375 252
Capo Impiegato210 101
210 103210 104
231 105
301 210
301 231375 252
Estendere la tabella con i dati di Capo
Estendere la tabella con i dati di Impiegato
Interrogazioni in SQL(4)
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 20
SELECT C.Nome, C.StipendioFROM Impiegati AS C, Supervisione AS S, Impiegati A S IWHERE C.Matricola = S.Capo AND S.Impiegato = I.Matrico la
AND I.Stipendio > 40;Nome Stipendio
M.Celli 60
S.Rossi 70S.Rossi 70
M.Rossi 65
I DBMS commerciali, per ragioni di efficienza, non controllano se ci
sono righe duplicate, ..
SELECT DISTINCT C.Nome, C.StipendioFROM Impiegati AS C, Supervisione AS S, Impiegati A S IWHERE C.Matricola = S.Capo AND S.Impiegato = I.Matrico la
AND I.Stipendio > 40;Nome Stipendio
M.Celli 60
S.Rossi 70M.Rossi 65
Interrogazioni in SQL(5)
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 21
• Impiegati che guadagnano più del proprio capo . . .
SELECT C.Matricola,C.Nome,C.Stipendio,I.Matricola,I .Nome, I.StipendioFROM Impiegati AS C, Supervisione AS S, Impiegati A S IWHERE C.Matricola = S.Capo AND S.Impiegato = I.Matrico la
AND I.Stipendio > C.Stipendio;
Volendo esprimere gli stipendi in euro invece che in milioni di lire ..
SELECT . . INT(C.Stipendio*1000/1.93627) AS StipCapo . . INT(I.Stipendio*1000/1.93627)
FROM . . .
C.Matricola C.Nome C.Stipendio I.Matricola I.Nome I.Stip endio
210 M.Celli 60 104 L.Neri 61375 M.Rossi 65 252 N.Bini 70
C.Matricola C.Nome C.Stipendio I.Matricola I.Nome I.Stip endio
210 M.Celli 60 104 L.Neri 61375 M.Rossi 65 252 N.Bini 70
C.Matricola C.Nome StipCapo I.Matricola I.Nome Expr1005
210 M.Celli 30987 104 L.Neri 31503
375 M.Rossi 33569 252 N.Bini 36151
C.Matricola C.Nome StipCapo I.Matricola I.Nome Expr1005
210 M.Celli 30987 104 L.Neri 31503
375 M.Rossi 33569 252 N.Bini 36151
Interrogazioni in SQL(6)
Prodotto Cartesiano, Join Interni, Join Esterni, Operazioni insiemistiche
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 23
Prodotto Cartesiano
• Le tabelle che compaiono nella clausola FROM vengono composte come PRODOTTO CARTESIANO , combinando tutte le righe della prima tabella con tutte le righe della seconda
Padre Paternità.Figlio Madre Maternità.Figlio
Adamo Caino Eva Caino
Adamo Abele Eva Caino
Abramo Isacco Eva Caino
Abramo Ismaele Eva Caino
Adamo Caino Eva Set
Adamo Abele Eva Set
Abramo Isacco Eva Set
Abramo Ismaele Eva Set
Adamo Caino Sara Isacco
Adamo Abele Sara Isacco
Abramo Isacco Sara Isacco
Abramo Ismaele Sara Isacco
Adamo Caino Agar Ismaele
Adamo Abele Agar Ismaele
Abramo Isacco Agar Ismaele
Abramo Ismaele Agar Ismaele
Padre Paternità.Figlio Madre Maternità.Figlio
Adamo Caino Eva Caino
Adamo Abele Eva Caino
Abramo Isacco Eva Caino
Abramo Ismaele Eva Caino
Adamo Caino Eva Set
Adamo Abele Eva Set
Abramo Isacco Eva Set
Abramo Ismaele Eva Set
Adamo Caino Sara Isacco
Adamo Abele Sara Isacco
Abramo Isacco Sara Isacco
Abramo Ismaele Sara Isacco
Adamo Caino Agar Ismaele
Adamo Abele Agar Ismaele
Abramo Isacco Agar Ismaele
Abramo Ismaele Agar Ismaele
Maternità
Madre Figlio
Eva CainoEva SetSara IsaccoAgar Ismaele
Paternità
Padre Figlio
Adamo CainoAdamo AbeleAbramo IsaccoAbramo Ismaele
SELECT *FROM Paternità, Maternità;
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 24
Theta Join
• Il THETA JOIN si ottiene dal Prodotto Cartesiano scrivendo la condizione di Join nella clausola WHERE
• L’esempio mostra un EQUI JOIN• E’ necessaria una proiezione per
eliminare la colonna duplicata e ottenere un JOIN NATURALE
• Nel Join si perde l’associazione tra Adamo e Abele e tra Eva e Set
Maternità
Madre Figlio
Eva CainoEva SetSara IsaccoAgar Ismaele
Paternità
Padre Figlio
Adamo CainoAdamo AbeleAbramo IsaccoAbramo Ismaele
SELECT Padre, P.Figlio, MadreFROM Paternità P, Maternità MWHERE P.Figlio = M.Figlio;
Padre P.Figlio Madre
Adamo Caino Eva
Abramo Isacco Sara
Abramo Ismaele Agar
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 25
Join Interni: SQL-2 (1)
• THETA JOIN
SELECT ElencoColonneFROM R [INNER] JOIN S ON CondizioniDiJoinWHERE CondizioniDiSelezione;
• I figli di Adamo e di Eva
SELECT Padre, P.Figlio AS Figli, MadreFROM Paternità P INNER JOIN Maternità M ON
P.Figlio = M.FiglioWHERE Madre = ‘Eva’ AND Padre = ‘Adamo’;
Padre Figli Madre
Adamo Caino Eva
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 26
Join Interni: SQL-2 (2)
• EQUI JOIN
SELECT ElencoColonneFROM R [INNER] JOIN S USING(Col1, Col2, ..)WHERE CondizioniDiSelezione;
• Elenco, con i genitori, dei figli dei quali sono noti entrambi i genitori
SELECT Padre, P.Figlio , MadreFROM Paternità P JOIN Maternità M USING (Figlio);
Padre P.Figlio Madre
Adamo Caino Eva
Abramo Isacco Sara
Abramo Ismaele Agar
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 27
Join Interni: SQL-2 (3)
• NATURAL JOIN
SELECT ElencoColonneFROM R NATURAL JOIN S WHERE CondizioniDiSelezione;
• Elenco, con i genitori, dei figli dei quali sono noti entrambi i genitori
SELECT *FROM Paternità NATURAL JOIN Maternità;
Padre Figlio Madre
Adamo Caino Eva
Abramo Isacco Sara
Abramo Ismaele Agar
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 28
Join Esterni (1)
• FULL JOIN: nel Join devono comparire tutte le righe di R e di S; le righe senza corrispondenti sono completate con valori nulli
• LEFT JOIN nel Join compaiono tutte le righe di R . . .
• RIGHT JOIN nel Join compaiono tutte le righe di S . . .
• I Join esterni permettono di estrarre informazioni che i Join interni non riescono a catturare
• In molti SQL mancano il FULL JOIN e il RIGHT JOIN
SELECT ElencoColonneLEFT
FROM R FULL [OUTER] JOIN S ON CondizioniDiJoinRIGHT
WHERE CondizioniDiSelezione;
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 29
Join Esterni (2)
• Elenco, con i genitori, dei figli di Adamo (anche se non si conosce la madre):
• Elenco, con i genitori, dei figli di Eva (anche se non si conosce il padre):
SELECT Padre, P.Figlio, MadreFROM Paternità P LEFT JOIN Maternità M ON
P.Figlio = M.FiglioWHERE Padre = ‘Adamo’;
SELECT Padre, M.Figlio, MadreFROM Paternità P RIGHT JOIN Maternità M ON
P.Figlio = M.FiglioWHERE Madre = ‘Eva’;
Padre P.Figlio Madre
Adamo Caino Eva
Adamo Abele
Padre M.Figlio Madre
Adamo Caino Eva
Set Eva
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 30
Join Esterni (3)
• Tutti i figli di Adamo / Eva ( anche se non è noto l’altro genitore ):
• In MySQL, e altri DBMS, il FULL JOIN si costruisce con l’unione di tabelle:
SELECT *FROM Paternità P FULL JOIN Maternità M ON
P.Figlio = M.FiglioWHERE P.Padre = ‘Adamo’ OR M.Madre = ‘Eva’;
( SELECT Padre, P.Figlio AS Figli, MadreFROM Paternità P LEFT JOIN Maternità M ON
P.Figlio = M.FiglioWHERE Padre = 'Adamo')
UNION ( SELECT Padre, M.Figlio AS Figli, Madre
FROM Paternità P RIGHT JOIN Maternità M ON P.Figlio = M.Figlio
WHERE Madre = 'Eva');
Padre Figli Madre
Adamo Caino Eva
Adamo Abele
Set Eva
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 31
Valori Nulli (1)
• I Join Esterni sono sorgenti di valori nulli . . .
• Chi sono i dipendenti che lavorano in dipartimenti inesistenti? Quali dipartimenti non hanno dipendenti?
Nome Cognome Dipart Ufficio Stipendio Città
Carlo Bianchi Produzione 20 36 TorinoCarlo Rossi Direzione 80 MilanoFranco Neri Distribuzione 45 NapoliGiuseppe Verdi Marketing 20 40 RomaLorenzo Lanzi Direzione 7 73 GenovaMarco Franco Produzione 20 46 RomaMario Rossi Amministrazione 10 45 MilanoPaola Borroni Amministrazione 75 40 Venezia
Nome Cognome Dipart Ufficio Stipendio Città
Carlo Bianchi Produzione 20 36 TorinoCarlo Rossi Direzione 80 MilanoFranco Neri Distribuzione 45 NapoliGiuseppe Verdi Marketing 20 40 RomaLorenzo Lanzi Direzione 7 73 GenovaMarco Franco Produzione 20 46 RomaMario Rossi Amministrazione 10 45 MilanoPaola Borroni Amministrazione 75 40 Venezia
Anagrafica ( Nome, Cognome, Dipart, Ufficio, Stipendio, Città ) Dipartimenti ( Dipart, Indirizzo, Città )
Dipart Indirizzo Città
Amministrazione Via Tito Livio, 27 MilanoDirezione Via Tito Livio, 27 MilanoDistribuzione Via Segre, 9 RomaProduzione Piazza Lavater, 3 TorinoRicerca Via Morone, 6 Milano
Dipart Indirizzo Città
Amministrazione Via Tito Livio, 27 MilanoDirezione Via Tito Livio, 27 MilanoDistribuzione Via Segre, 9 RomaProduzione Piazza Lavater, 3 TorinoRicerca Via Morone, 6 Milano
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 32
Valori nulli (2)
• I valori nulli si controllano con il predicato: IS NULL
-- ------------------------------------------------- ---- Dipendenti in dipartimenti inesistenti-- ------------------------------------------------- --SELECT Nome, Cognome, A.DipartFROM Anagrafica A LEFT JOIN Dipartimenti D Using (Di part) WHERE D.Dipart IS NULL;
-- ------------------------------------------------- ------- Dipartimenti senza dipendenti-- ------------------------------------------------- -----SELECT D.DipartFROM Anagrafica A RIGHT JOIN Dipartimenti D Using (D ipart) WHERE Cognome IS NULL; -- WHERE Cognome = NULL ���� ERRORE
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 33
Valori nulli (3)
• L’assenza di valore nulli si controlla con il predicato: IS NOT NULL
-- ------------------------------------------------- ------- Dipendenti per i quali è noto l’ufficio dove lavor ano-- ------------------------------------------------- -----SELECT Nome, Cognome, Dipart, UfficioFROM Anagrafica WHERE Ufficio IS NOT NULL;
-- ------------------------------------------------- ------- Dipendenti per i quali è noto l’ufficio dove lavor ano-- ------------------------------------------------- -----SELECT Nome, Cognome, Dipart, UfficioFROM Anagrafica WHERE Ufficio <> NULL; Errore
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 34
Valori nulli (4)
Esercizi
• Elencare i figli di Adamo dei quali non si conosce la madre partendo dall’elenco visualizzato nella diapositiva dal titolo: Join Esterni (2) e sfruttando i predicati IS NULL oppure IS NOT NULL
• Elencare i figli di Eva dei quali non si conosce il padre partendo dall’elenco visualizzato nella diapositiva dal titolo: Join Esterni (2) e sfruttando i predicati IS NULL oppure IS NOT NULL
• Elencare i dipendenti in Anagrafica (vedi schema nella diapositiva Valori nulli (1)) dei quali si conosce lo stipendio
• Elencare i dipartimenti (vedi schema nella diapositiva Valori nulli (1)) che mancano dell’indirizzo
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 35
• Una strategia per elencare i figli di Eva dei quali non è noto il padre porta a considerare in un primo tempo tutti i figli di Eva
SELECT Figlio FROM MaternitàWHERE Madre='Eva';
Operazioni Insiemistiche (1)
SELECT Padre, Figlio, MadreFROM Paternità NATURAL JOIN MaternitàWHERE Madre='Eva';
Padre Figlio Madre
Adamo Caino Eva
Figlio
Caino
Set
• Quindi i figli di Eva dei quali è noto il padre
Unione IntersezioneDifferenza ?
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 36
• EXCEPT costruisce la differenza tra tabelle
( SELECT Figlio FROM MaternitàWHERE Madre = ‘Eva’ )
EXCEPT( SELECT Figlio
FROM Paternità NATURAL JOIN MaternitàWHERE Madre ='Eva’);
Operazioni Insiemistiche (2)
Figlio
Set
∪∪∪∪ UNION
∩∩∩∩ INTERSECT Spesso Assente
- EXCEPT Spesso Assente
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 37
Esercizi Riassuntivi (1)
1. Individuare lo stipendio degli impiegati di cognome ‘Rossi’
2. Estrarre tutte le informazioni sugli impiegati di cognome ‘Rossi’
3. Restituire lo stipendio mensile ( espresso in euro e non in milioni di lire ) degli impiegati di cognome ‘Bianchi’
4. Per tutti gli impiegati estrarre Nome, Cognome e Città dove lavorano
5. Estrarre Nome e Cognome degli impiegati che lavorano nell’ufficio 20 del dipartimento Amministrazione
6. Estrarre i nomi propri degli impiegati di Cognome ‘Rossi’ che lavorano nel dipartimento Amministrazione o nel dipartimento Produzione
7. Estrarre tutte le informazioni sugli impiegati di cognome con una ‘o’ in seconda posizione e terminano per ‘i’
Anagrafica ( Nome , Cognome , Dipart, Ufficio, Stipendio, Città )
Dipartimenti ( Dipart , Indirizzo, Città )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 38
Esercizi Riassuntivi (2)
8. Estrarre Nome, Cognome e nome del dipartimento degli impiegati che lavorano in città diverse da quelle di residenza
9. Elencare tutti i dati dei dipendenti che lavorano in dipartimenti che hanno sede a Roma
10.Elencare i dipartimenti dove lavorano i dipendenti che risiedono a MiIano
11.Estrarre Nome, Cognome e Retribuzione degli impiegati che lavorano a Milano
12.Elencare i dipartimenti che hanno sede in città dove non risiede alcun dipendente
13.Elencare i dipendenti dell’amministrazione dei quali non è noto lo stipendio
14.Elencare i dipendenti che lavorano a Torino dei quali non è nota la città di residenza
Anagrafica ( Nome , Cognome , Dipart, Ufficio, Stipendio, Città )
Dipartimenti ( Dipart , Indirizzo, Città )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 39
Esercizi Riassuntivi (3)
La tabella Dipendenti contiene, per ogni dipendente, il codice che lo identifica,il cognome, lo stipendio e il codice del dirigente da cui dipendono
15.Con un comando SELECT realizzare una tabella con tre colonne: nella prima compare il codice del dipendente, nella seconda il suo cognome e nell’ultima il cognome del manager da cui dipendono
16.Elencare i dipendenti che non dipendono da alcun manager
17.Elencare i dipendenti che hanno come manager “Leoni”
18.Elencare i dipendenti che hanno retribuzione maggiore od uguale a quella del rispettivo manager
19.Elencare i dipendenti con Cognome, Stipendio e differenza tra il proprio stipendio e quello del manager da cui dipendono
Dipendenti ( Codice , Cognome, Stipendio, Manager )
Funzioni di Aggregazione e Raggruppamenti
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 41
Funzioni di Aggregazione (1)
• Costituiscono un’estensione dell’algebra relazionale
• Sintetizzano i valori di un’intera colonna in un solo valore
• Possono comparire nelle sole clausole SELECT o HAVING
• Aggregazione : producono un solo valore dall’elenco di valori che appaiono in una colonna:
– SUM: la somma dei valori in colonna
– AVG: la media dei valori in colonna
– MIN: il minimo dei valori in colonna
– MAX: il massimo dei valori in colonna
– COUNT: il numero di valori che compaiono in colonna
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 42
Funzioni di Aggregazione (2)
• Somma degli stipendi dei dipendenti che lavorano a Milano
• Viene eseguita come se:
SELECT SUM(Stipendio) AS SommaStipendiFROM Anagrafica JOIN Dipartimenti USING (Dipart)WHERE Dipartimenti.Città = 'Milano';
SELECT StipendioFROM Anagrafica JOIN Dipartimenti USING (Dipart)WHERE Dipartimenti.Città = 'Milano';
Stipendio
4540807340
Alla colonna Stipendio viene applicato SUM
SommaStipendi
278
SommaStipendi
278
Anagrafica ( Nome , Cognome , Dipart, Ufficio, Stipendio, Città )
Dipartimenti ( Dipart , Indirizzo, Città )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 43
Funzioni di Aggregazione (3)
• Da quante città provengono i dipendenti
SELECT COUNT(DISTINCT Città) AS NumeroCittàFROM Anagrafica;
COUNT (Colonna)
Ignora i valori nulli nella colonna
NumeroCittà
6
SELECT COUNT(Città) AS NumeroCittàFROM Anagrafica;
NumeroCittà
8
Anagrafica( Nome , Cognome , Dipart, Ufficio, Stipendio, Città )
Dipartimenti( Dipart , Indirizzo, Città )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 44
• Stipendio massimo e numero di dipendenti della sede di Roma
SELECT MAX(Stipendio) AS StipendioMax,COUNT(Stipendio) AS Dipendenti
FROM Anagrafica JOIN Dipartimenti USING (Dipart)WHERE Dipartimenti.Città = 'Roma';
StipendioMax Dipendenti
45 1
Esercizi• Estrarre stipendio massimo, minimo e medio fra quelli di tutti gli impiegati • Estrarre lo stipendio massimo fra i dipendenti che lavorano in amministrazione
• Quanti dipendenti lavorano a Torino?• Quanti dipendenti lavorano in una città differente da quella di residenza?• Chi è il dipendente della direzione con lo stipendio massimo? (Attenzione!!)
Funzioni di Aggregazione (4)
Anagrafica( Nome , Cognome , Dipart, Ufficio, Stipendio, Città )
Dipartimenti( Dipart , Indirizzo,Città )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 45
Raggruppamenti (1)
• Si presenta, spesso, il problema di aggregare i dati non sull’intera colonna ma su particolari sottoinsiemi di una colonna
-- ----------------------------------------- Media degli stipendi nei dipartimenti-- ---------------------------------------SELECT Dipart AS Dipartimento,
AVG(Stipendio) AS MediaStipendiFROM Anagrafica GROUP BY Dipart;
Dipartimento MediaStipendi
Amministrazione 41,66666667Direzione 76,5Distribuzione 45Produzione 41
Anagrafica( Nome , Cognome , Dipart, Ufficio, Stipendio, Città )
Dipartimenti( Dipart , Indirizzo,Città )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 46
Raggruppamenti (2)
Dipartimento Stipendio
Produzione 36Direzione 80Distribuzione 45Amministrazione 40Direzione 73Produzione 46Amministrazione 45Amministrazione 40
Dipartimento Stipendio
Amministrazione 40Amministrazione 40Amministrazione 45Direzione 73Direzione 80Distribuzione 45Produzione 46Produzione 36
Dipartimento MediaStipendi
Amministrazione 41,66666667Direzione 76,5Distribuzione 45Produzione 41
-- 1SELECT Dipart, StipendioFROM Anagrafica
-- 2SELECT Dipart, StipendioFROM AnagraficaGROUP BY Dipart
-- 3-- Dopo il raggruppamento la -- funzione di aggregazione -- viene applicata separata--- mente ai diversi insiemi
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 47
-- ------------------------------------------------- ------- L’applicazione della funzione di aggregazione ai-- singoli raggruppamenti, passo 3, avviene come se la-- sua valutazione avvenisse nel seguente modo-- ------------------------------------------------- -----
Raggruppamenti (3)
Dipartimento Stipendio
Amministrazione 40Amministrazione 40Amministrazione 45Direzione 73Direzione 80Distribuzione 45Produzione 46Produzione 36
---- 3--SELECT A.Dipart,( SELECT, AVG(Stipendio)
FROM Anagrafica BWHERE A.Dipart=B.Dipart
)FROM Anagrafica AGROUP BY Dipart;
Dipartimento MediaStipendi
Amministrazione 41,66666667Direzione 76,5Distribuzione 45Produzione 41
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 48
• Elencare i produttori con il numero di film prodotti da ciascuno di essi
Raggruppamenti (4)
SELECT * FROM Film, ProduttoriWHERE Produttore = CodProd;
SELECT NomeProduttoreFROM Film, ProduttoriWHERE Produttore = CodProdGROUP BY NomeProduttore;
SELECT NomeProduttore, COUNT(*)FROM Film, ProduttoriWHERE Produttore = CodProdGROUP BY NomeProduttore;
Film ( Titolo ,Anno ,Lunghezza,aColori,NomeStudio, Produttore )
Produttori ( CodProd , NomeProduttore, Indirizzo )
Nella clausola SELECTpossono comparire solo
campi che compaiono anche nella clausola GROUP BY e
funzioni di aggregazione
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 49
-- ------------------------------------------------- ----- I dipartimenti che spendono più di 100 in stipendi-- ------------------------------------------------- ---SELECT Dipart, SUM(Stipendio) AS SommaStipendiFROM AnagraficaGROUP BY DipartHAVING SUM(Stipendio) > 100;
Predicati sui gruppi: Having (1)
Dipartimento Stipendio
Amministrazione 40Amministrazione 40Amministrazione 45Direzione 73Direzione 80Distribuzione 45Produzione 46Produzione 36
Dipartimento Stipendio
Amministrazione 40Amministrazione 40Amministrazione 45Direzione 73Direzione 80Distribuzione 45Produzione 46Produzione 36
Dopo il raggruppamento viene valutato il predicato della
clausola HAVING
Dipart SommaStipendi
Amministrazione 125Direzione 153
Dipart SommaStipendi
Amministrazione 125Direzione 153
Anagrafica( Nome , Cognome , Dipart, Ufficio, Stipendio, Città )
Dipartimenti( Dipart , Indirizzo,Città )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 50
Predicati sui gruppi: HAVING (2)
• Numero di film prodotti dai produttori che hanno cominciato a produrre film prima del 1960
SELECT NomeProduttore, COUNT(*) FROM Film, ProduttoriWHERE Produttore = CodProdGROUP BY NomeProduttoreHAVING Min(anno) < 1960;
HAVING stabilisce condizionisui raggruppamenti generatidalla clausola GROUP BY
SELECT NomeProduttore, COUNT(*) FROM Film, ProduttoriWHERE Produttore = CodProdGROUP BY NomeProduttore;
Film ( Titolo ,Anno ,Lunghezza,aColori,NomeStudio, Produttore )
Produttori ( CodProd , NomeProduttore, Indirizzo )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 51
• Le clausole di un comando SELECT sono:
• SELECT, FROM sono le uniche clausole obbligatorie
• Le diverse clausole, se presenti, devono rispettare l’ordine dell’elenco• Il motore SQL le elabora nel seguente ordine:
FROM � WHERE � GROUP BY � HAVING � SELECT � ORDER BY
Ordine delle clausole
– SELECT– FROM – WHERE– GROUP BY– HAVING– ORDER BY
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 52
Esercizi (1)
• Estrarre i dipartimenti dove non lavorano impiegati di cognome ‘Rossi’
• Determinare lo stipendio massimo del dipartimento Amministrazione
• Stipendio massimo, minimo e medio dei dipendenti che lavorano a Roma
• Dipartimento dell’impiegato che guadagna lo stipendio massimo? (Usare ORDER BY)
• Nome e Cognome dell’impiegato che guadagna lo stipendio minimo (Usare ORDER BY)
• Elenco dei dipartimenti con il numero di dipendenti che vi lavorano
• Da quante città differenti provengono i dipendenti del dipartimento ‘Amministrazione’
• In quanti dipartimenti lavorano i dipendenti che risiedono a ‘Roma’
• Lo stipendio massimo medio e minimo dei dipendenti del dipartimento ‘Marketing’
Anagrafica( Nome , Cognome , Dipart, Ufficio, Stipendio, Città )
Dipartimenti( Dipart , Indirizzo,Città )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 53
• Trovare la velocità media dei PC
• Trovare la velocità media dei PC che costano più di 1500 Euro
• Trovare il prezzo medio dei PC prodotti da HP
• Trovare il produttore che fornisce almeno tre modelli di PC
• Trovare per ogni produttore il prezzo del PC più costoso
• Trovare la velocità massima dei PC di prezzo inferiore a 1000 Euro
• Elencare i PC di velocità massima di prezzo inferiore a 1000 euro
• Elencare i produttori che hanno PC con HD di almeno 80 GB e prezzo mediocompreso tra 500 e 900 euro
Esercizi (2)
PC( Produttore , Modello )
Caratteristiche( Modello , Velocità, Ram, CD, HD, Prezzo )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 54
Esercizi (3)
• Elenco degli esami registrati nel corso del 2005 con: Nome, Cognome, Matricoladello studente, nome del corso, Nome e Cognome del docente. L’elenco deve essere suddiviso per docente.
• Quanti esami sono stati registrati dal docente: Enrico Cavalli nel corso del 2004 ?
• Estrarre il numero degli esami sostenuti dallo studente con matricola 25374.
• Estrarre la media dei voti dello studente con matricola 25374.
• Elenco dei corsi per i quali non sono stati superati esami
• Elenco dei docenti che non hanno registrato esami nel corso del 2003
• Elenco degli studenti che hanno sostenuto più di 3 esami nel corso del 2005
• Elenco dei laureandi (studenti con almeno 28 esami superati)
• Numero dei corsi insegnati dal docente Enrico Cavalli
• Docenti che sono titolari di almeno 2 corsi
Studenti ( Matricola , Nome, Cognome, Indirizzo )
Corsi ( CodiceCorso , NomeCorso, CodiceDocente )
Docenti ( CodiceDocente , Nome, Cognome )
Esami ( CodiceCorso, Matricola, Data , Voto )
Interrogazioni Nidificate
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 56
Interrogazioni Nidificate (1)
-- ------------------------------- Il nome del capo di M.Celli-- -----------------------------
SELECT Nome FROM ImpiegatiWHERE Matricola =
( SELECT CapoFROM SupervisioneWHERE Impiegato =
( SELECT Matricola FROM ImpiegatiWHERE Nome = ‘M.Celli’ )
);
Si può usare un comando SELECT al posto
di una costante in una clausola WHERE
Impiegati( Matricola , Nome, Età, Stipendio )
Supervisione( Capo, Impiegato )
Matricola
210
Matricola
210
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 57
-- ------------------------------- Il nome del capo di M.Celli-- -----------------------------SELECT Nome FROM ImpiegatiWHERE Matricola =
( SELECT CapoFROM SupervisioneWHERE Impiegato = 210 );
SELECT Nome FROM ImpiegatiWHERE Matricola = 310;
Capo
310
Nome
S.Rossi
Interrogazioni Nidificate (2)Impiegati( Matricola , Nome, Età, Stipendio )
Supervisione( Capo, Impiegato )
La matricola di Celli, estratta da Impiegati, è stat a usata in Supervisione per trovare la matricola del capo di Celli. Noto qu esto valore è possibile recuperare il nome del capo di Celli dalla tabella I mpiegati
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 58
• Le interrogazioni nidificate sono un modo concettualmente diverso di costruirele interrogazioni
• Forniscono un metodo alternativo a quello dell’algebra relazionale
• Possono essere utilizzate per semplificare dal punto di vista concettuale la progettazione di interrogazioni complesse
• In molti casi sono insostituibili ...
Interrogazioni Nidificate (3)
-- ------------------------------------------------- ------ Il nome del capo di M.Celli: approccio tradiziona le-- ------------------------------------------------- ----SELECT C.NomeFROM Impiegati AS C, Supervisione AS S, Impiegati A S IWHERE C.Matricola = S.Capo AND S.Impiegato = I.Matrico la
AND I.Nome = ‘M.Celli’;
Impiegati( Matricola , Nome, Età, Stipendio )
Supervisione( Capo, Impiegato )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 59
• Chi è l’impiegato con lo stipendio più elevato?
Interrogazioni Nidificate (4)
SELECT Nome, Cognome FROM Dipendenti WHERE Stipendio = 80;
Nome Cognome Dipart Ufficio Stipendio Città
Carlo Bianchi Produzione 20 36 TorinoCarlo Rossi Direzione 80 MilanoFranco Neri Distribuzione 45 NapoliGiuseppe Verdi Marketing 20 40 RomaLorenzo Lanzi Direzione 7 73 GenovaMarco Franco Produzione 20 46 RomaMario Rossi Amministrazione 10 45 MilanoPaola Borroni Amministrazione 75 40 Venezia
SELECT MAX(Stipendio) FROM Dipendenti;
Max(Stipendio)
80
Nome
Carlo
Cognome
Rossi
SELECT Nome, Cognome FROM Dipendenti WHERE Stipendio =
( SELECT MAX(Stipendio)FROM Dipendenti );
Nome
Carlo
Cognome
Rossi
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 60
• Chi sono gli impiegati con lo stipendio superiore alla media?
• Gli impiegati con lo stipendio superiore alla media e di quanto la superano
Interrogazioni Nidificate (5)
SELECT Nome, Cognome FROM Dipendenti WHERE Stipendio > ( SELECT AVG(Stipendio)
FROM Dipendenti );
SELECT Nome,Cognome,Stipendio - ( SELECT AVG(Stipendio)
FROM Dipendenti )FROM Dipendenti WHERE Stipendio > ( SELECT AVG(Stipendio)
FROM Dipendenti );
• Si osservi che le risposte alle precedenti richieste possono essere ottenute con una serie di interrogazioni o con una sola query nidificata.
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 61
• Elencare i capi con tutti i dati
Interrogazioni Nidificate (6)
SELECT *FROM ImpiegatiWHERE Matricola IN ( SELECT DISTINCT Capo
FROM Supervisione );
SELECT *FROM ImpiegatiWHERE Matricola IN (210,231,301,375);
SELECT DISTINCT Capo FROM Supervisione;
Capo
210231301375
Impiegati( Matricola , Nome, Età, Stipendio )
Supervisione( Capo, Impiegato )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 62
• Elencare i dipendenti che non sono capi
Impiegati( Matricola , Nome, Età, Stipendio )
Supervisione( Capo, Impiegato )
Interrogazioni Nidificate (7)
SELECT *FROM ImpiegatiWHERE Matricola NOT IN ( SELECT DISTINCT Capo
FROM Supervisione );
Un elenco di valori prodotto da un comando SELECT p uò essere inserito in una clausola WHERE per essere esaminato con oppo rtuni operatori:
IN, ALL, ANY, ..
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 63
Operatori con le sottointerrogazioni (1)
Operatori per esaminare un elenco prodotto da una SELECT:
• s IN Elenco ⇔⇔⇔⇔ ∃x ∈ Elenco ���� x = s
• s NOT IN Elenco ⇔⇔⇔⇔ ∀x ∈ Elenco ���� x ≠ s
• s > ALL Elenco ⇔⇔⇔⇔ ∀x ∈ Elenco ���� s > x (<, <=, <>, .. )
• NOT s > ALL Elenco ⇔⇔⇔⇔ ¬ ( ∀x ∈ Elenco ���� s > x )
• s > ANY Elenco ⇔⇔⇔⇔ ∃x ∈ Elenco ���� s > x (<, <=, <>, .. )
• NOT s > ANY R ⇔⇔⇔⇔ ¬ ( ∃x ∈ Elenco ���� s > x )
• EXIST R ⇔⇔⇔⇔ R ≠ ∅∅∅∅• NOT EXIST R ⇔⇔⇔⇔ R = ∅∅∅∅
• Nella maggior parte dei casi s indica uno scalare, in alcuni casi s può essere una tupla, mentre R rappresenta una tabella,
• ANY sinonimo di SOME
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 64
Operatori con le sottointerrogazioni (2)
• Gli operatori introdotti non sono indipendenti
• s IN Elenco � permette di costruire l’intersezione di tabelle• s NOT IN Elenco � permette di costruire la differenza di tabelle
-- ------------------------------------------------- ----------- I figli di Adamo ed Eva-- ------------------------------------------------- ---------SELECT Figlio FROM MaternitàWHERE Madre = ‘Eva’ AND
Figlio IN ( SELECT Figlio FROM PaternitàWHERE Padre = ‘Adamo’ );
-- ------------------------------------------------- ----------- I figli di Adamo ma non di Eva-- ------------------------------------------------- ---------SELECT Figlio FROM PaternitàWHERE Padre = ‘Adamo’ AND
Figlio NOT IN ( SELECT Figlio FROM MaternitàWHERE Madre = ‘Eva’ );
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 65
Operatori con le sottointerrogazioni (3)
-- ----------------------------------------------- Elenco dei dipartimenti che hanno impiegati-- ---------------------------------------------SELECT Dipart, Indirizzo, CittàFROM Dipartimenti DWHERE EXIST ( SELECT *
FROM Anagrafica AWHERE A.Dipart = D.Dipart );
-- -------------------------------------------------- Dipendenti della Ricerca con stipendio maggiore -- di quello di tutti i dipendenti del Marketing-- ------------------------------------------------SELECT Nome, Cognome FROM AnagraficaWHERE Dipart = ‘Ricerca’ AND Stipendio > ALL
( SELECT Stipendio FROM AnagraficaWHERE Dipart = ‘Marketing’ );
Anagrafica( Nome , Cognome , Dipart, Ufficio, Stipendio, Città )
Dipartimenti( Dipart , Indirizzo,Città )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 66
Esempi (1)
• Database sulle navi. Le navi sono costruite in serie: le navi della stessa serie sono tutte uguali e costituiscono una classe. Il campo Tipo di una certa classe è un carattere ( I, C, P, S, ecc ), che indica il tipo di nave ( Incrociatore, Corazzata, Portaerei, Sommergibile, .. )
– Classi (Classe, Tipo, Paese, Stazza)
– Navi (Nome, Classe, DataVaro)
1. Elencare le nazioni che posseggono sia sommergibili che portaerei• Risolto come intersezione • Approccio tradizionale: congiungendo tabelle
2. Elencare le classi con una sola nave come membro della classe• Senza usare GROUP BY
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 67
-- ------------------------------------------------- ----- Nazioni che hanno sia sommergibili che portaerei-- Intersezione realizzata con IN-- ------------------------------------------------- ---SELECT DISTINCT PaeseFROM Classi JOIN Navi USING (Classe)WHERE Tipo = ‘S’ AND
Paese IN ( SELECT DISTINCT PaeseFROM Classi JOIN Navi USING (Classe)WHERE Tipo = ‘P’ );
-- ------------------------------------------------- ----- Ipotesi: se c’è una classe c’è almeno una nave-- ------------------------------------------------- ---SELECT DISTINCT C1.PaeseFROM Classi C1 JOIN Classi C2 USING (Paese)WHERE C1.Tipo = ‘S’ AND C2.Tipo = ‘P’;
Classi( Classe , Tipo, Paese, Stazza )
Navi( Nome , Classe, DataVaro )
Esempi (2)
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 68
Esempi (3)
-- ------------------------------------------------- ------ Le classi con almeno una nave-- ------------------------------------------------- ----SELECT DISTINCT N1.ClasseFROM Navi N1 JOIN Navi N2 USING (Classe)WHERE N1.Nome = N2.Nome; -- ------------------------------------------------- ------- Le classi con più di una nave-- ------------------------------------------------- -----SELECT DISTINCT N1.ClasseFROM Navi N1 JOIN Navi N2 USING (Classe)WHERE N1.Nome <> N2.Nome;-- ------------------------------------------------- ------- Le classi con una sola nave: differenza delle-- precedenti tabelle usando NOT IN -- ------------------------------------------------- -----
Eserciziconcettualmente
difficili
Classi( Classe , Tipo, Paese, Stazza )
Navi( Nome , Classe, DataVaro )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 69
Sottointerrogazioni Complesse (1)
-- ------------------------------------------------- ------- Dipendenti con lo stesso nome di addetti alla Produ zione-- ------------------------------------------------- -----SELECT * FROM Dipendenti WHERE Nome = ANY
( SELECT DISTINCT Nome FROM Dipendenti WHERE Dipart = 'Produzione');
Nome Cognome Dipart Ufficio Stipendio Città
Carlo Bianchi Produzione 20 36 Torino
Carlo Rossi Direzione 80 Milano
Marco Franco Produzione 20 46 Roma
Nome
Carlo
Marco
Così non va bene !
Nome Cognome Dipart Ufficio Stipendio Città
Carlo Bianchi Produzione 20 36 TorinoCarlo Rossi Direzione 80 MilanoFranco Neri Distribuzione 45 NapoliGiuseppe Verdi Marketing 20 40 RomaLorenzo Lanzi Direzione 7 73 GenovaMarco Franco Produzione 20 46 RomaMario Rossi Amministrazione 10 45 MilanoPaola Borroni Amministrazione 75 40 Venezia
Nome Cognome Dipart Ufficio Stipendio Città
Carlo Bianchi Produzione 20 36 TorinoCarlo Rossi Direzione 80 MilanoFranco Neri Distribuzione 45 NapoliGiuseppe Verdi Marketing 20 40 RomaLorenzo Lanzi Direzione 7 73 GenovaMarco Franco Produzione 20 46 RomaMario Rossi Amministrazione 10 45 MilanoPaola Borroni Amministrazione 75 40 Venezia
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 70
Sottointerrogazioni Complesse (2)
• Soluzione : i nomi prodotti dalla query interna non devono comprendere quelli(uguali) ma che provengono dalla medesima riga della query esterna
-- ------------------------------------------------- ---- Query Esterna-- ------------------------------------------------- --SELECT *FROM Dipendenti AS AWHERE Nome = ANY (
-- ------------------------------------------- Query interna-- -----------------------------------------SELECT Nome FROM Dipendenti AS B WHERE Dipart = 'Produzione’ AND
A.Cognome <> B.Cognome );
Nome Cognome Dipart Ufficio Stipendio Città
Carlo Rossi Direzione 80 Milano
Nome Cognome Dipart Ufficio Stipendio Città
Carlo Rossi Direzione 80 Milano
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 71
Sottointerrogazioni Complesse (3)
In generale:
• Per ogni riga della query esterna viene valutata la query interna e,successivamente, il predicato della query esterna.
• L’operazione è ripetuta per tutte le righe della query esterna.
Si osservi che si ottiene lo stesso risultato con l’interrogazione:
SELECT A.*FROM Dipendenti A, Dipendenti BWHERE A.Nome = B.Nome AND
A.Cognome <> B.Cognome AND B.Dipart = 'Produzione’;
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 72
Esercizi (1)
1. Il trattato di Washington del 1921 proibì di costruire navi di stazza superiore alle 35000 tonnellate. Si elenchino le navi che violarono il trattato
2. Elencare gli incrociatori italiani varati dopo il 1945
3. Elencare le corazzate di stazza superiore a quella di almeno una portaerei
4. Elencare le portaerei di stazza superiore a quella di qualsiasi corazzata
5. Elencare le nazioni che posseggono sommergibili ma non hanno né portaerei nècorazzate
6. Elencare le classi con almeno due navi come membro della classe
7. Elencare le navi con il medesimo nome
8. Elencare la nave (o le navi) italiane di stazza massima
9. Elencare le navi di stazza maggiore della nave italiana più grande
Classi( Classe , Tipo, Paese, Stazza )Navi( Nome , Classe, DataVaro )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 73
Esercizi (2)
10. Chi si è beccato, anche immeritatamente, il voto più alto nel corso di codice X
11. Elencare gli studenti che hanno sostenuto due volte l’esame di ‘Y’
12. Elencare gli studenti che hanno superato esami con Moriggia o Cavalli
13. Elencare gli esami che non hanno voti superiori a 26
14. Elencare gli studenti che hanno il voto minimo nel corso ‘Z’
15. Elencare i corsi per i quali nessuno studente ha sostenuto esami
16. Elencare i corsi (con Docente e Descrizione) nei quali ci sono studenti che hanno superato il relativo esame con votazione pari a 30
17. Chi sono gli studenti che hanno sostento esami nell’ultimo giorno fra quelli registrati
18. Il corso che ha il numero massimo di esami registrati (Suggerimento: creare una tabella di servizio con corso e numero esami registrati e interrogare quella)
Studenti( Matricola , Nome, Cognome, Indirizzo )
Corsi( Corso , Docente, Descrizione )
Esami( Matricola, Corso, Data , Voto )
Viste Logiche
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 75
-- --------------------------------------------------- Ammontare degli stipendi per ogni dipartimento -- -------------------------------------------------CREATE VIEW TotStipendi(Dipartimento,Stipendi) ASSELECT Dipart, SUM(Stipendio)FROM ImpiegatiGROUP BY Dipart;
Viste Logiche (1)
Le VISTE LOGICHE sono tabelle virtuali create dinamicamente con interrogazioni su tabelle reali o altre viste logiche. Le viste logiche sono interrogabili e, sotto opportune condizioni, modificabili: le modifiche apportatealle viste logiche si riflettono sui dati delle tabelle da cui le viste sono derivate
Impiegati( Nome , Cognome , Dipart, Ufficio, Stipendio, Città )
Dipartimenti( Dipart , Indirizzo, Città )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 76
-- ------------------------------------------------- ----- Altri Formati: nome colonne per ridenominazione-- ------------------------------------------------- ---CREATE VIEW TotStipendi ASSELECT Dipart AS Dipartimento, SUM(Stipendio) AS Sti pendiFROM ImpiegatiGROUP BY Dipart;-- ------------------------------------------------- ----- Le colonne prendono il nome da quelle selezionate-- ------------------------------------------------- ---CREATE VIEW TotStipendi ASSELECT Dipart, SUM(Stipendio) FROM Impiegati GROUP BY Dipart;
Viste Logiche (2)
Impiegati( Nome , Cognome , Dipart, Ufficio, Stipendio, Città )
Dipartimenti( Dipart , Indirizzo, Città )
Preferito
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 77
Viste Logiche (3)
• Le viste logiche sono tabelle virtuali
• Le viste logiche sono tabelle virtuali generate da una query
• Le viste logiche sono filtri sui dati delle tabelle reali
• Una vista logica esiste nel DB solo come definizione
• Le viste logiche materializzate sono viste logiche sulle quali è statocostruito un indice unico clusterizzato, dette anche viste indicizzate(SQL Server)
• Le viste logiche possono essere interrogate come ogni tabella reale
• Le viste logiche permettono di inserire , modificare e cancellare dati,a condizione che non ci siano aggregazioni, calcoli, ecc.
• Le viste logiche possono essere alla base di altre viste logiche
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 78
Viste Logiche (4)
• Le viste logiche sono utilizzate per:
• Mostrare all’utente i soli dati di cui ha bisogno
• Impedire la visione di dati riservati
• Personalizzare i dati secondo le esigenze dell’utente
• Controllare l’immissione dei dati ( vedi: WITH CHECK OPTION )
• Semplificare concettualmente la progettazione delle interrogazioni
• Realizzare interrogazioni impossibili da costruire diversamente
• Mantenere la compatibilità con le vecchie tabelle dopo che ne èstato modificato lo schema
• Per importare ed esportare dati verso altre applicazioni
• Per combinare dati distribuiti su diversi server
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 79
Viste Logiche (5)
-- ------------------------------------------------- ------- Il dipartimento che spende di più in stipendi-- ------------------------------------------------- -----
SELECT Dipartimento FROM TotStipendiWHERE Stipendi = (
SELECT Max(Stipendi)FROM TotStipendi
);
Le VISTE LOGICHE sono utili per:
• Risolvere problemi impossibili da risolvere diversamente
• Semplificare concettualmente la progettazione delle interrogazioni
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 80
Viste Logiche (6)
-- ------------------------------------------------- ------------------ Numero medio di uffici per dipartimento -- ------------------------------------------------- ----------------CREATE VIEW Uffici ASSELECT Dipart AS Dipartimento, COUNT(DISTINCT Uffici o) AS NumUfficiFROM ImpiegatiGROUP BY Dipart;-- Interrogazione della vista logica
SELECT AVG(NumUffici)FROM Uffici;
-- ------------------------------------------------- -------------- Elenco dei dipartimenti con il nome dell’impiegat o-- che ha lo stipendio più elevato nel dipartimento-- ------------------------------------------------- ------------CREATE VIEW MaxStipendi ASSELECT Dipart AS Dipartimento, MAX(Stipendio) AS Sti pendioMaxFROM ImpiegatiGROUP BY Dipart;
Impiegati( Nome , Cognome , Dipart, Ufficio, Stipendio, Città )
Dipartimenti( Dipart , Indirizzo, Città )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 81
Viste Logiche (7)
-- ------------------------------------------------- ------- Interrogazione della vista logica-- ------------------------------------------------- -----SELECT Nome, Cognome, DipartFROM Impiegati WHERE Stipendio = ( SELECT StipendioMax
FROM MaxStipendiWHERE Dipartimento = Dipart );
-- ------------------------------------------------- ------- Altro modo di interrogare la vista logica -- ------------------------------------------------- -----SELECT Nome, Cognome, DipartFROM Impiegati JOIN MaxStipendi ON Dipart = Dipartime nto WHERE Stipendio = StipendioMax;
Impiegati( Nome, Cognome, Dipart, Ufficio, Stipendi o, Città )
Dipartimenti( Dipart, Indirizzo, Città )
Se ci fosse una tabella fatta così e così sarebbe
semplice ottenereil risultato richiesto . . .
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 82
Esercizi (1)
• Definite la vista logica: FilmParamount che comprende gli attributi: Titolo ed Anno dei film girati negli studi “Paramount”
• Estrarre i titoli dei film della Paramount girati negli anni 80
• Estrarre i nomi di tutti gli attori che hano girato film per la Paramount
• Contare i film prodotti dalla Paramount nel 1999
• Elencare il numero di film prodotti ogni anno dalla Paramount negli anni 90
• Identificare i film della Paramount di lunghezza massima
• In che anno la Paramount ha prodotto il maggior numero di film ?
• Qual è lo studio che ha prodotto il maggior numero di film ?
• Quali sono i film con il cast più numeroso?
Film ( Titolo , Anno , Lunghezza, aColori, NomeStudio )
Attori ( Titolo, Anno, NomeAttore )
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 83
Esercizi (2)
• Determinare numero di movimenti per cliente; preparare l’elenco dei clienti con le spese di tenuta conto, ipotizzando una spesa di 0,04 euro per movimento e che i primi 100 movimenti siano gratuiti.
• Chi è il cliente che ha effettuato il maggior numero di versamenti nel 2006?
• Chi è il cliente che ha prelevato di più a partire dall’inizio del 2007?
• Chi ha effettuato il versamento di maggior importo?
• Chi ha effettuato il maggior numero di operazioni?
• Chi ha effettuato il primo versamento e il primo prelievo?
• Per ogni cliente calcolare la somma dei versamenti e la somma dei prelievi
• Calcolare il saldo del cliente: Maria Bianchi
• Produrre un elenco dei clienti con il relativo saldo
• Chi è il cliente con il saldo massimo?
Anag ( Codice , Cognome, Nome, Indirizzo, Provincia )Movimenti ( Numero , Causale, Data, Importo, Codice )
Causale : ammette i soli valori ‘Pre’,‘Ver’ per indicare prelievi e versamenti
Elaborazione automatica dei dati - Enrico Cavalli -Università di Bergamo 84
Esempio
• Il DB Anagrafica, Dipartimenti
Nome Cognome Dipart Ufficio Stipendio Città
Carlo Bianchi Produzione 20 36 TorinoCarlo Rossi Direzione 80 MilanoFranco Neri Distribuzione 45 NapoliGiuseppe Verdi Marketing 20 40 RomaLorenzo Lanzi Direzione 7 73 GenovaMarco Franco Produzione 20 46 RomaMario Rossi Amministrazione 10 45 MilanoPaola Borroni Amministrazione 75 40 Venezia
Nome Cognome Dipart Ufficio Stipendio Città
Carlo Bianchi Produzione 20 36 TorinoCarlo Rossi Direzione 80 MilanoFranco Neri Distribuzione 45 NapoliGiuseppe Verdi Marketing 20 40 RomaLorenzo Lanzi Direzione 7 73 GenovaMarco Franco Produzione 20 46 RomaMario Rossi Amministrazione 10 45 MilanoPaola Borroni Amministrazione 75 40 Venezia
Anagrafica ( Nome, Cognome, Dipart, Ufficio, Stipendio, Città ) Dipartimenti ( Dipart, Indirizzo, Città )
Dipart Indirizzo Città
Amministrazione Via Tito Livio, 27 MilanoDirezione Via Tito Livio, 27 MilanoDistribuzione Via Segre, 9 RomaProduzione Piazza Lavater, 3 TorinoRicerca Via Morone, 6 Milano
Dipart Indirizzo Città
Amministrazione Via Tito Livio, 27 MilanoDirezione Via Tito Livio, 27 MilanoDistribuzione Via Segre, 9 RomaProduzione Piazza Lavater, 3 TorinoRicerca Via Morone, 6 Milano