Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoAntonella Carboni Modificato 9 anni fa
1
Basi di dati I Prof.ssa Rosalba Giugno Prof. Alfredo Pulvirenti SQL :Structured Query Language: SELECT (III) SQL (Slide tratte in parte da da Atzeni, Ceri, Paraboschi, Torlonee, Basi di dati McGraw-Hill, 2002)
2
Giugno-Pulvirenti AA 2005-2006 NomeEtà Persone Reddito Andrea27 Maria55 Anna50 Filippo26 Luigi50 Franco60 Olga30 Sergio85 Luisa75 Aldo25 21 42 35 30 40 20 41 35 87 15 Madre Maternità Figlio Luisa Anna Maria Luisa Maria Olga Filippo Andrea Aldo Luigi Padre Paternità Figlio Luigi Franco Sergio Olga Filippo Andrea Aldo Franco
3
Giugno-Pulvirenti AA 2005-2006 Attributi: sintassi estesa Attributi ::= * | Espr [[AS] NuovoNome] {, Espr [[AS] NuovoNome] } Espr ::= [Ide.]Attributo | Costante | “(“ Espr “)” | [-] Espr [ Espr] | (SUM | COUNT |AVG | MAX | MIN) “(“ [DISTINCT] [Ide.] Attributo “)” | COUNT “(“ * “)” ::= ( + | - | * | / )
4
Giugno-Pulvirenti AA 2005-2006 Esempio SELECT AVG(Voto) AS Media Rossi FROM Esami, Studenti WHERE Nome = ‘Paolo Rossi’ AND Esami.Matricola = Studenti.Matricola Media dei voti di Paolo Rossi
5
Giugno-Pulvirenti AA 2005-2006 Operatori aggregati Nelle espressioni della target list possiamo avere anche espressioni che calcolano valori a partire da insiemi di ennuple SQL-2 prevede 5 possibili operatori di aggregamento: –conteggio, minimo, massimo, media, somma Gli operatori di aggregamento NON sono rappresentabili in Algebra Relazionale
6
Giugno-Pulvirenti AA 2005-2006 Cosa sono? Operano su insiemi di righe per dare un risultato per gruppo. IMPIEGATI “SalarioMassimo” DEPTNO SAL --------- 10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 30 1500 30 1250 MAX(SAL) --------- 5000
7
Giugno-Pulvirenti AA 2005-2006 Uso SELECT[column,] group_function(column) FROMtable [WHEREcondition] [GROUP BYcolumn] [ORDER BYcolumn];
8
Giugno-Pulvirenti AA 2005-2006 Operatori aggregati: COUNT COUNT restituisce il numero di righe o il numero di valori distinti di un particolare attributo Esempio: Il numero di figli di Franco: SELECT count(*) as NumFigliDiFranco FROM Paternita WHERE Padre = 'Franco' –l’operatore aggregato (count) viene applicato al risultato dell’interrogazione: SELECT * FROM Paternita WHERE Padre = 'Franco'
9
Giugno-Pulvirenti AA 2005-2006 Padre Paternità Figlio Luigi Sergio Olga Filippo Franco Andrea Aldo Franco Andrea Aldo NumFigliDiFranco 2 Esempio
10
Giugno-Pulvirenti AA 2005-2006 COUNT e valori nulli Numero di tuple SELECT count(*) FROM persone Numero di volte il campo ‘reddito’ non e’ NULL SELECT count(reddito) FROM persone Numero di valori distinti del campo ‘reddito’ (senza i NULL) SELECT count(distinct reddito) FROM persone NomeEtàPersoneReddito Andrea27 Maria55 Anna50 Aldo25 21 35 NULL
11
Giugno-Pulvirenti AA 2005-2006 Altri operatori aggregati SUM, AVG, MAX, MIN Media dei redditi di coloro che hanno meno di 30 anni: SELECT avg(reddito) FROM persone WHERE eta < 30 Uso del JOIN: media dei redditi dei figli di Franco: SELECT avg(reddito) FROM persone JOIN paternita ON nome=figlio WHERE padre='Franco‘ Uso di piu’ operatori di aggregamento nella target list: SELECT avg(reddito), min(reddito), max(reddito) FROM persone WHERE eta < 30
12
Giugno-Pulvirenti AA 2005-2006 Uso di AVG e SUM AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL) -------- --------- --------- --------- 1400 1600 1250 5600 Possono essere usati su dati numerici. SQL> SELECTAVG(sal), MAX(sal), 2MIN(sal), SUM(sal) 3FROMemp 4WHEREjob LIKE 'SALES%';
13
Giugno-Pulvirenti AA 2005-2006 Uso di MIN e MAX Possono essere usati su qualsiasi tipo. SQL> SELECTMIN(hiredate), MAX(hiredate) 2 FROMemp; MIN(HIRED MAX(HIRED --------- 17-DEC-80 12-JAN-83
14
Giugno-Pulvirenti AA 2005-2006 Operatori aggregati e valori nulli SELECT avg(reddito) AS redditomedio FROM persone NomeEtàPersoneReddito Andrea27 Maria55 Anna50 Aldo25 30 36 NULL
15
Giugno-Pulvirenti AA 2005-2006 Operatori aggregati e target list un’interrogazione scorretta: SELECT nome, max(reddito) FROM persone di chi sarebbe il nome? La target list deve essere omogenea SELECT min(eta), avg(reddito) FROM persone
16
Giugno-Pulvirenti AA 2005-2006 Operatori aggregati e raggruppamenti Le funzioni possono essere applicate a partizioni delle relazioni Clausola GROUP BY –Syntax: GROUP BY listaAttributi Il numero di figli di ciascun padre SELECT padre, count(*) AS NumFigli FROM paternita GROUP BY Padre Padre paternita Figlio Luigi Sergio Olga Filippo Franco Andrea Aldo Franco PadreNumFigli Luigi Sergio 2 Franco2 1
17
Giugno-Pulvirenti AA 2005-2006 Raggruppare piu’ di una colonna IMPIEGATI “sommare I salari in IMPIEGATI per ongi lavoro, Ragruppati per dipartimeno” DEPTNO JOB SAL --------- --------- --------- 10 MANAGER 2450 10 PRESIDENT 5000 10 CLERK 1300 20 CLERK 800 20 CLERK 1100 20 ANALYST 3000 20 MANAGER 2975 30 SALESMAN 1600 30 MANAGER 2850 30 SALESMAN 1250 30 CLERK 950 30 SALESMAN 1500 30 SALESMAN 1250 JOB SUM(SAL) --------- CLERK 1300 MANAGER 2450 PRESIDENT 5000 ANALYST 6000 CLERK 1900 MANAGER 2975 CLERK 950 MANAGER 2850 SALESMAN 5600 DEPTNO -------- 10 20 30
18
Giugno-Pulvirenti AA 2005-2006 Uso di GROUP BY Tutte le colonne della SELECT che non sono in funzioni di gruppo devono essere nella GROUP BY. SQL> SELECT deptno, AVG(sal) 2 FROM emp 3 GROUP BY deptno; DEPTNO AVG(SAL) --------- 10 2916.6667 20 2175 30 1566.6667
19
Giugno-Pulvirenti AA 2005-2006 Esempio GROUP BY Per ogni dipartimento, restituire la somma degli stipendi di tutti gli impiegati (di quel dipartimento) Relazione: Employee(Name,Dept,Office,Salary,City)
20
Giugno-Pulvirenti AA 2005-2006 Semantica degli operatori di raggruppamento (1) La query e’ innanzitutto eseguita senza operatori aggregati e senza GROUP BY:
21
Giugno-Pulvirenti AA 2005-2006 Semantica degli operatori di raggruppamento (2) Quindi il risultato e’ diviso in sottoinsiemi aventi gli stessi valori per gli attributi indicati nel GROUP BY (Dept nel nostro caso) Quindi l’operatore di aggregamento e’ calcolato su ogni sottoinsieme:
22
Giugno-Pulvirenti AA 2005-2006 Raggruppamenti e target list scorretta SELECT padre, avg(f.reddito), p.reddito FROM persone f JOIN paternita ON figlio = nome JOIN persone p ON padre =p.nome GROUP BY padre corretta SELECT padre, avg(f.reddito) FROM persone f JOIN paternita ON figlio = nome JOIN persone p ON padre =p.nome GROUP BY padre
23
Giugno-Pulvirenti AA 2005-2006 Condizioni sui gruppi, clausola HAVING Si possono applicare condizioni sul valore aggregato per ogni gruppo Esempio: I dipartimenti la cui somma dei salari e’ maggiore di 100
24
Giugno-Pulvirenti AA 2005-2006 WHERE o HAVING? I padri i cui figli sotto i 30 anni hanno un reddito medio maggiore di 25: SELECT padre, avg(f.reddito) FROM persone f JOIN paternita ON figlio = nome WHERE eta < 30 GROUP BY padre HAVING avg(f.reddito) > 25
25
Giugno-Pulvirenti AA 2005-2006 Sintassi, riassumiamo SelectSQL ::= select ListaAttributiOEspressioni from ListaTabelle [ where CondizioniSemplici ] [ group by ListaAttributiDiRaggruppamento ] [ having CondizioniAggregate ] [ order by ListaAttributiDiOrdinamento ]
26
Giugno-Pulvirenti AA 2005-2006 Esercitazione Considera il seguente schema relazionale: –Quadri( Pittore, Titolo, DataCreazione, NomeMuseo) –Musei( NomeMuseo, Citta, Curatore) –Costo( Titolo, Prezzo) Scrivere le seguenti query in SQL: –Elenco dei musei e del valore medio dei quadri posseduti. –Il numero di quadri per ogni pittore fra tutti i musei parigini. –Il museo con il maggior numero di quadri esposti.
27
Giugno-Pulvirenti AA 2005-2006 Elenco dei musei e del valore medio dei quadri posseduti. –Quadri( Pittore, Titolo, DataCreazione, NomeMuseo) –Musei( NomeMuseo, Citta, Curatore) –Costo( Titolo, Prezzo) SELECT avg(c.prezzo) ‘prezzo medio’, m.nomeMuseo FROM quadri q, musei m, costo c WHERE q.nomeMuseo = m.nomeMuseo AND q.Titolo = c.Titolo GROUP BY m.nomeMuseo
28
Giugno-Pulvirenti AA 2005-2006 Elenco dei musei e del valore medio dei quadri posseduti. –Quadri( Pittore, Titolo, DataCreazione, NomeMuseo) –Musei( NomeMuseo, Citta, Curatore) –Costo( Titolo, Prezzo) SELECT avg(c.prezzo) ‘prezzo medio’, m.nomeMuseo FROM (musei JOIN quadri ON musei.nomeMuseo = quadri.nomeMuseo) JOIN costo ON quadri.Titolo = costo.Titolo GROUP BY m.nomeMuseo
29
Giugno-Pulvirenti AA 2005-2006 Il numero di quadri per ogni pittore fra tutti i musei parigini. –Quadri( Pittore, Titolo, DataCreazione, NomeMuseo) –Musei( NomeMuseo, Citta, Curatore) –Costo( Titolo, Prezzo) SELECT count(*) ‘numero quadri’, pittore FROM musei m, quadri q, costo c WHERE m.Citta = ‘Parigi’ AND m.nomeMuseo = q.nomeMuseo AND q.titolo = c.Titolo GROUP BY pittore
30
Giugno-Pulvirenti AA 2005-2006 Il museo con il maggior numero di quadri esposti. –Quadri( Pittore, Titolo, DataCreazione, NomeMuseo) –Musei( NomeMuseo, Citta, Curatore) –Costo( Titolo, Prezzo)
31
Giugno-Pulvirenti AA 2005-2006 Unione, intersezione e differenza La SELECT da sola non permette di fare unioni; serve un costrutto esplicito: SELECT … UNION [all] SELECT... i duplicati vengono eliminati (a meno che si usi all) –anche dalle proiezioni!
32
Giugno-Pulvirenti AA 2005-2006 Notazione posizionale! SELECT padre FROM paternita UNION SELECT madre FROM maternita quali nomi per gli attributi del risultato? –nessuno –quelli del primo operando –…
33
Giugno-Pulvirenti AA 2005-2006 Luisa Anna Maria Luisa Maria Olga Filippo Andrea Aldo Luigi Figlio Luigi Franco Sergio Olga Filippo Andrea Aldo Franco Luisa Anna Maria Luisa Maria Olga Filippo Andrea Aldo Luigi PadreFiglio Luigi Franco Sergio Olga Filippo Andrea Aldo Franco
34
Giugno-Pulvirenti AA 2005-2006 Notazione posizionale, 2 SELECT padre, figlio FROM paternita UNION SELECT figlio, madre FROM maternita SELECT padre, figlio FROM paternita UNION SELECT madre, figlio FROM maternita
35
Giugno-Pulvirenti AA 2005-2006 Notazione posizionale, 3 Anche con le ridenominazioni non cambia niente: SELECT padre as genitore, figlio FROM paternita UNION SELECT figlio, madre as genitore FROM maternita Corretta: SELECT padre as genitore, figlio FROM paternita UNION SELECT madre as genitore, figlio FROM maternita
36
Giugno-Pulvirenti AA 2005-2006 Differenza SELECT Nome FROM Impiegato EXCEPT SELECT Cognome as Nome FROM Impiegato vedremo che si può esprimere con SELECT nidificate
37
Giugno-Pulvirenti AA 2005-2006 Intersezione SELECT Nome FROM Impiegato INTERSECT SELECT Cognome as Nome FROM Impiegato –equivale a SELECT I.Nome FROM Impiegato I, Impiegato J WHERE I.Nome = J.Cognome
38
Giugno-Pulvirenti AA 2005-2006 Limitare le righe selezionate –Limitare le righe tramite l’uso della clausola WHERE. –La clausola WHERE segue la clausola FROM. SELECT[DISTINCT] {*| colonna [alias],...} FROM tabella [WHEREcondizione(i)];
39
Giugno-Pulvirenti AA 2005-2006 Interrogazioni nidificate Condizione : := Predicato | “(“Condizione”)” | NOT Condizione | Condizione (AND | OR) Condizione Predicato –Espr op (Espr | “(“ Sottoselect “)” ) –op {=, <>, >, >=, <, <=} –SottoSelect deve dare come risultato una tabella con un solo elemento o vuota (vedremo alcuni esempi) SELECT[DISTINCT] {*| colonna [alias],...} FROM tabella [WHEREcondizione(i)];
40
Giugno-Pulvirenti AA 2005-2006 Interrogazioni nidificate le condizioni in SQL permettono anche il confronto fra un attributo e il risultato di una sottoquery –Syntax: Scalare Operatore (ANY | ALL) SelectQuery ANY : il predicato e’ vero se almeno uno dei valori restituiti da Query soddisfano la condizione ALL : il predicato e’ vero se tutti i valori restituiti dalla Query soddisfano la condizione –quantificatore esistenziale EXISTS SelectQuery Il predicato e’ vero se la SelectQuery restituisce almeno una tupla
41
Giugno-Pulvirenti AA 2005-2006 Esempio di SELECT nidificate nome e reddito del padre di Franco SELECT Nome, Reddito FROM Persone, Paternita WHERE Nome = Padre AND Figlio = 'Franco' SELECT Nome, Reddito FROM Persone WHERE Nome = (SELECT Padre FROM Paternita WHERE Figlio = 'Franco') La query nella clausola WHERE e’ la query nidificata
42
Giugno-Pulvirenti AA 2005-2006 Interrogazioni nidificate, commenti La forma nidificata è “meno dichiarativa”, ma talvolta più leggibile (richiede meno variabili) La forma piana e quella nidificata possono essere combinate Le sottointerrogazioni non possono contenere operatori insiemistici (“l’unione si fa solo al livello esterno”); la limitazione non è significativa
43
Giugno-Pulvirenti AA 2005-2006 Nome e reddito dei padri di persone che guadagnano più di 20 milioni SELECT distinct P.Nome, P.Reddito FROM Persone P, Paternita, Persone F WHERE P.Nome = Padre AND Figlio = F.Nome AND F.Reddito > 20 SELECT Nome, Reddito FROM Persone WHERE Nome in (SELECT Padre FROM Paternita WHERE Figlio = any (SELECT Nome FROM Persone WHERE Reddito > 20))
44
Giugno-Pulvirenti AA 2005-2006 Nome e reddito dei padri di persone che guadagnano più di 20 milioni SELECT distinct P.Nome, P.Reddito FROM Persone P, Paternita, Persone F WHERE P.Nome = Padre AND Figlio = F.Nome AND F.Reddito > 20 SELECT Nome, Reddito FROM Persone WHERE Nome in (SELECT Padre FROM Paternita, Persone WHERE Figlio = Nome AND Reddito > 20)
45
Giugno-Pulvirenti AA 2005-2006 Negazione con le query nidificate Trovare quei dipartimenti dove non c’e’ nessuno che si chiama ‘Brown’: Oppure:
46
Giugno-Pulvirenti AA 2005-2006 Operatori IN e NOT IN IN e’ sinonimo di: =ANY NOT IN e’ sinonimo di: <>ALL
47
Giugno-Pulvirenti AA 2005-2006 MAX e MIN con le query nidificate Esempio: Il dipartimento(i) dove lavora colui con lo stipendio piu’ alto di tutta l’azienda: Oppure:
48
Giugno-Pulvirenti AA 2005-2006 Interrogazioni nidificate, commenti, 2 La prima versione di SQL prevedeva solo la forma nidificata (o strutturata), con una sola relazione in ogni clausola FROM. Il che è insoddisfacente: –la dichiaratività è limitata –non si possono includere nella target list attributi di relazioni nei blocchi interni
49
Giugno-Pulvirenti AA 2005-2006 Nome e reddito dei padri di persone che guadagnano più di 20 milioni, con indicazione del reddito del figlio SELECT distinct P.Nome, P.Reddito, F.Reddito FROM Persone P, Paternita, Persone F WHERE P.Nome = Padre AND Figlio = F.Nome AND F.Reddito > 20 SELECT Nome, Reddito, ???? FROM Persone WHERE Nome in (SELECT Padre FROM Paternita WHERE Figlio = any (SELECT Nome FROM Persone WHERE Reddito > 20))
50
Giugno-Pulvirenti AA 2005-2006 Interrogazioni nidificate, commenti, 3 regole di visibilità: –non è possibile fare riferimenti a variabili definite in blocchi più interni –se un nome di variabile è omesso, si assume riferimento alla variabile più “vicina” in un blocco si può fare riferimento a variabili definite in blocchi più esterni
51
Giugno-Pulvirenti AA 2005-2006 NomeEtà Persone Reddito Andrea27 Maria55 Anna50 Filippo26 Luigi50 Franco60 Olga30 Sergio85 Luisa75 Aldo25 21 42 35 30 40 20 41 35 87 15 Madre Maternità Figlio Luisa Anna Maria Luisa Maria Olga Filippo Andrea Aldo Luigi Padre Paternità Figlio Luigi Franco Sergio Olga Filippo Andrea Aldo Franco
52
Giugno-Pulvirenti AA 2005-2006 Quantificazione esistenziale Ulteriore tipo di condizione –EXISTS ( Sottoespressione ) Le persone che hanno almeno un figlio SELECT * FROM Persone WHERE EXISTS (SELECT * FROM Paternita WHERE Padre = Nome) OR EXISTS (SELECT * FROM Maternita WHERE Madre = Nome)
53
Giugno-Pulvirenti AA 2005-2006 I padri i cui figli guadagnano tutti più di venti milioni SELECT distinct Padre FROM Paternita Z WHERE NOT EXISTS ( SELECT * FROM Paternita W, Persone WHERE W.Padre = Z.Padre AND W.Figlio = Nome AND Reddito <= 20) Quantificazione esistenziale, 2
54
Giugno-Pulvirenti AA 2005-2006 Semantica delle espressioni “correlate” La query piu’ interna puo’ usare variabili della query esterna L’interrogazione interna viene eseguita una volta per ciascuna ennupla dell’interrogazione esterna Esempio, trovare tutti gli studenti che hanno un omonimo: –SELECT * FROM Student S WHERE EXISTS (SELECT * FROM Student S2 WHERE S2.Nome = S.Nome AND S2.Cognome = S.Cognome AND S2.Matricola <> S.Matricola)
55
Giugno-Pulvirenti AA 2005-2006 Semantica delle espressioni “correlate”, 2 Esempio, trovare tutti gli studenti che NON hanno un omonimo: –SELECT * FROM Student S WHERE NOT EXISTS (SELECT * FROM Student S2 WHERE S2.Nome = S.Nome AND S2.Cognome = S.Cognome AND S2.Matricola <> S.Matricola)
56
Giugno-Pulvirenti AA 2005-2006 Confronto su piu’ attributi Il confronto con il risultato di una query nidificata puo’ essere basato su piu’ attributi Stessa query di prima, trovare tutti gli studenti che hanno un omonimo: –SELECT * FROM Student S WHERE (Nome, Cognome) IN (SELECT Nome, Cognome FROM Student S2 WHERE S2.Matricola <> S.Matricola)
57
Giugno-Pulvirenti AA 2005-2006 Visibilità scorretta: SELECT * FROM Impiegato WHERE Dipart in (SELECT Nome FROM Dipartimento D1 WHERE Nome = 'Produzione') OR Dipart in (SELECT Nome FROM Dipartimento D2 WHERE D2.Citta = D1.Citta) –D1 non e’ visibile nella seconda query nidificata in quanto le due sottoquery sono allo stesso livello
58
Giugno-Pulvirenti AA 2005-2006 Commenti finali sulle query nidificate Query nidificate possono essere “meno dichiarative” in un certo senso ma spesso sono piu’ facilmente interpretabili –Suddivisibili in blocchi piu’ semplici da interpretare L’utilizzo di variabili deve rispettare le regole di visibilita’ –Cioe’, una variabile puo’ essere usata solo all’interno dello stesso blocco e in un blocco piu’ interno Comunque, query nidificate complesse possono essere di difficile comprensione –Soprattutto quando si usano molte variabili comuni tra blocchi diversi
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.