La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Basi di dati I Prof.ssa Rosalba Giugno Prof. Alfredo Pulvirenti SQL :Structured Query Language: SELECT (II)

Presentazioni simili


Presentazione sul tema: "Basi di dati I Prof.ssa Rosalba Giugno Prof. Alfredo Pulvirenti SQL :Structured Query Language: SELECT (II)"— Transcript della presentazione:

1 Basi di dati I Prof.ssa Rosalba Giugno Prof. Alfredo Pulvirenti SQL :Structured Query Language: SELECT (II)

2 Giugno-Pulvirenti AA Tabelle Tabelle ::= Tabella [Ide] {, Tabella [Ide]} Tabella::= Ide | Tabella OpInsiem Tabella | Tabella Giunzione Tabella [USING (Attributo{,Attributo})|ON Condizione]

3 Giugno-Pulvirenti AA Giunzioni ed Operatori Insiemistici Giunzione ::= [CROSS|UNION|NATURAL] [LEFT| RIGHT | FULL] JOIN OpInsiem ::= (UNION | INTERSECT | EXCEPT) [CORRESPONDING [BY ( Attributo {,Attributo}) ] ] USING e ON solo con JOIN; LEFT, RIGHT,FULL solo con NATURAL JOIN e JOIN

4 Giugno-Pulvirenti AA Ancora su Join ed Operatori Insiemistici Union,Intersect,Except sono,,-. CORRESPONDING fa proiettare sugli attributi comuni e poi si applica loperatore insiemistico. Se ce anche BY si specificano su quali comuni attributi proiettare Cross Join e il prodotto cartesiano Union Join e lunione esterna cioe si estendono le due tabelle con le colonne dellaltro con valori nulli e si fa lunione.

5 Giugno-Pulvirenti AA Ancora sulle Join Natural Join e quella classica Join... Using e la natural join sui dati attributi Join…On su quelli che soddisfano una data condizione [LEFT|RIGHT|FULL] usato con Natural Join o Join e la giunzione esterna nelle tre modalita sinistra,destra o completa.

6 Giugno-Pulvirenti AA Esempi Natural Join SELECT Studenti.Nome,Esami.Corso,Esami.Voto FROM Esami NATURAL JOIN Studenti Nome,Corso e Voto degli esami

7 Giugno-Pulvirenti AA Altro Esempio Agenti(CodiceAgente,Nome,Zona Supervisore,Commissione) Clienti(CodiceCliente,Nome,Citta,Sconto ) Ordini(CodiceOrdine,CodiceCliente,Codi ceAgente,Articolo,Data,Ammontare)

8 Giugno-Pulvirenti AA Esempio di Join On SELECT Agenti.CodiceAgente,Ordini.Ammontare FROM Agenti JOIN Ordini ON Agenti.Supervisore = Ordini.CodiceAgente Codice agente ed ammontare degli ordini dei supervisori

9 Giugno-Pulvirenti AA Giunzione Esterna SELECT Agenti.CodiceAgente,Ordini.Ammontare FROM Agenti NATURAL LEFT JOIN Ordini Codice agente ed ammontare degli agenti incluso quelli che non hanno effettuato ordini (avranno ammontare NULL)

10 Giugno-Pulvirenti AA EMPNO DEPTNO LOC NEW YORK CHICAGO NEW YORK DALLAS CHICAGO CHICAGO rows selected. EMPNO DEPTNO LOC NEW YORK CHICAGO NEW YORK DALLAS CHICAGO CHICAGO rows selected. Ottenere dati da più Tabelle IMPIEGATI DIPARTIMENTI EMPNOENAME...DEPTNO KING BLAKE MILLER DEPTNO DNAME LOC ACCOUNTINGNEW YORK 20RESEARCHDALLAS 30SALESCHICAGO 40OPERATIONSBOSTON

11 Giugno-Pulvirenti AA Cosa è una Join? SELECTtabella1.colonna, tabella2.colonna FROMtabella, tabella2 WHEREtabella1.colonna1 = tabella2.colonna2; SELECTtabella1.colonna, tabella2.colonna FROMtabella, tabella2 WHEREtabella1.colonna1 = tabella2.colonna2; La join viene usata per effettuare query su più tabelle. –La condizione di join va scritta nella clausola WHERE. –Mettere come prefisso della colonna il nome della tabella se questa stessa colonna appare in più di una tabella.

12 Giugno-Pulvirenti AA NomeEtà Persone Reddito Andrea27 Maria55 Anna50 Filippo26 Luigi50 Franco60 Olga30 Sergio85 Luisa75 Aldo Madre Maternità Figlio Luisa Anna Maria Luisa Maria Olga Filippo Andrea Aldo Luigi Padre Paternità Figlio Luigi Franco Sergio Olga Filippo Andrea Aldo Franco

13 Giugno-Pulvirenti AA Join naturale Padre e madre di ogni persona paternita JOIN maternita SELECT paternita.figlio,padre, madre FROM maternita, paternita WHERE paternita.figlio = maternita.figlio

14 Giugno-Pulvirenti AA Prodotto Cartesiano –Il prodotto cartesiano e ottenuto quando: Una condizione join e omessa Una condizione join e non valida Tutte le righe della prima tabella ammettono join con tutte le righe della seconda Per evitare il prodotto cartesiano, includere sempre condizioni join valida nella clausola WHERE.

15 Giugno-Pulvirenti AA Generare un Prodotto Cartesiano ENAME DNAME KINGACCOUNTING BLAKE ACCOUNTING... KINGRESEARCH BLAKE RESEARCH rows selected. ENAME DNAME KINGACCOUNTING BLAKE ACCOUNTING... KINGRESEARCH BLAKE RESEARCH rows selected. IMPIEGATI (14 righe) DIPARTIMENTI (4 righe) EMPNOENAME...DEPTNO KING BLAKE MILLER EMPNOENAME...DEPTNO KING BLAKE MILLER DEPTNO DNAME LOC ACCOUNTINGNEW YORK 20RESEARCHDALLAS 30SALESCHICAGO 40OPERATIONSBOSTON DEPTNO DNAME LOC ACCOUNTINGNEW YORK 20RESEARCHDALLAS 30SALESCHICAGO 40OPERATIONSBOSTONProdotto Cartesiano: 14*4=56 rows

16 Giugno-Pulvirenti AA Cosa è una Natural join? IMPIEGATI DIPARTIMENTI EMPNO ENAME DEPTNO KING BLAKE CLARK JONES MARTIN ALLEN TURNER JAMES WARD FORD SMITH rows selected. DEPTNO DNAME LOC ACCOUNTING NEW YORK 30 SALES CHICAGO 10 ACCOUNTINGNEW YORK 20 RESEARCHDALLAS 30 SALES CHICAGO 20 RESEARCHDALLAS rows selected. Chiave esterna Chiave Primaria Chiave Primaria

17 Giugno-Pulvirenti AA Estrarre Record con Natural join SQL> SELECT emp.empno, emp.ename, emp.deptno, 2dept.deptno, dept.loc 3 FROM emp, dept 4 WHERE emp.deptno=dept.deptno; EMPNO ENAME DEPTNO DEPTNO LOC KING NEW YORK 7698 BLAKE CHICAGO 7782 CLARK NEW YORK 7566 JONES DALLAS rows selected.

18 Giugno-Pulvirenti AA Condizioni di Ricerca addizionali Uso delloperatore AND EMPDEPT EMPNO ENAME DEPTNO KING BLAKE CLARK JONES MARTIN ALLEN TURNER JAMES WARD FORD SMITH rows selected. DEPTNO DNAME LOC ACCOUNTINGNEW YORK 30SALES CHICAGO 10 ACCOUNTINGNEW YORK 20 RESEARCHDALLAS 30 SALES CHICAGO 20 RESEARCHDALLAS rows selected.

19 Giugno-Pulvirenti AA Join di piu Tabelle NAMECUSTID JOCKSPORTS 100 TKB SPORT SHOP 101 VOLLYRITE 102 JUST TENNIS 103 K+T SPORTS 105 SHAPE UP 106 WOMENS SPORTS rows selected. NAMECUSTID JOCKSPORTS 100 TKB SPORT SHOP 101 VOLLYRITE 102 JUST TENNIS 103 K+T SPORTS 105 SHAPE UP 106 WOMENS SPORTS rows selected. CLIENTI CUSTID ORDID rows selected. CUSTID ORDID rows selected.ORDINI ORDID ITEMID rows selected. ORDID ITEMID rows selected.PROD.

20 Giugno-Pulvirenti AA NomeEtà Persone Reddito Andrea27 Maria55 Anna50 Filippo26 Luigi50 Franco60 Olga30 Sergio85 Luisa75 Aldo Madre Maternità Figlio Luisa Anna Maria Luisa Maria Olga Filippo Andrea Aldo Luigi Padre Paternità Figlio Luigi Franco Sergio Olga Filippo Andrea Aldo Franco

21 Giugno-Pulvirenti AA Join esplicito (JOIN-ON) Sintassi: –SELECT … FROM Tabella { … JOIN Tabella ON CondDiJoin }, … [ WHERE AltraCondizione ] Esempio: padre e madre di ogni persona (le due versioni): SELECT paternita.figlio,padre, madre FROM maternita, paternita WHERE paternita.figlio = maternita.figlio SELECT madre, paternita.figlio, padre FROM maternita JOIN paternita ON paternita.figlio = maternita.figlio

22 Giugno-Pulvirenti AA Selezione, proiezione e join I padri di persone che guadagnano più di 20 π Padre (paternita JOIN Figlio=Nome (σ Reddito>20 (persone))) SELECT distinct padre FROM persone, paternita WHERE figlio = nome AND reddito > 20

23 Giugno-Pulvirenti AA Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre π Nome, Reddito, RP (σ Reddito>RP (δ NP,EP,RP Nome,Eta,Reddito (persone) JOIN NP=Padre (paternita JOIN Figlio =Nome persone))) SELECT f.nome, f.reddito, p.reddito FROM persone p, paternita, persone f WHERE p.nome = padre AND figlio = f.nome AND f.reddito > p.reddito Necessita di ridenominazione

24 Giugno-Pulvirenti AA SELECT, con ridenominazione del risultato SELECT figlio, f.reddito AS reddito, p.reddito AS redditoPadre FROM persone p, paternita, persone f WHERE p.nome = padre AND figlio = f.nome AND f.reddito > p.reddito SELECT x.figlio, f.reddito AS reddito, p.reddito AS redditoPadre FROM persone p, paternita x, persone f WHERE p.nome = x.padre AND x.figlio = f.nome AND f.reddito > p.reddito O meglio

25 Giugno-Pulvirenti AA –Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre SELECT f.nome, f.reddito, p.reddito FROM persone p, paternita, persone f WHERE p.nome = padre AND figlio = f.nome AND f.reddito > p.reddito SELECT f.nome, f.reddito, p.reddito FROM persone p JOIN paternita ON p.nome = padre JOIN persone f ON figlio = f.nome WHERE f.reddito > p.reddito

26 Giugno-Pulvirenti AA Join esterno Padre e, se nota, madre di ogni persona SELECT paternita.figlio, padre, madre FROM paternita LEFT JOIN maternita ON paternita.figlio = maternita.figlio

27 Giugno-Pulvirenti AA join esterno SELECT paternita.figlio, padre, madre FROM maternita JOIN paternita ON maternita.figlio = paternita.figlio SELECT paternita.figlio, padre, madre FROM maternita LEFT JOIN paternita ON maternita.figlio = paternita.figlio SELECT paternita.figlio, padre, madre FROM maternita FULL JOIN paternita ON maternita.figlio = paternita.figlio

28 Basi di dati I Prof.ssa Rosalba Giugno Prof. Alfredo Pulvirenti Aggregazione dati

29 Giugno-Pulvirenti AA 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

30 Giugno-Pulvirenti AA Obiettivi Al completamento di questa parte, dovreste essere in grado di: –Identificare le funzioni di raggruppamento –Descriverne luso –Raggruppare dati usando GROUP BY –Includere ed escludere righe tramite luso di HAVING

31 Giugno-Pulvirenti AA Cosa sono? Operano su insiemi di righe per dare un risultato per gruppo. IMPIEGATI SalarioMassimo DEPTNO SAL MAX(SAL)

32 Giugno-Pulvirenti AA Quali sono –AVG –COUNT –MAX –MIN –SUM

33 Giugno-Pulvirenti AA Uso SELECT[column,] group_function(column) FROMtable [WHEREcondition] [GROUP BYcolumn] [ORDER BYcolumn];

34 Giugno-Pulvirenti AA Uso di AVG e SUM AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL) Possono essere usati su dati numerici. SQL> SELECTAVG(sal), MAX(sal), 2MIN(sal), SUM(sal) 3FROMemp 4WHEREjob LIKE 'SALES%';

35 Giugno-Pulvirenti AA Uso di MIN e MAX Possono essere usati su qualsiasi tipo. SQL> SELECTMIN(hiredate), MAX(hiredate) 2 FROMemp; MIN(HIRED MAX(HIRED DEC JAN-83

36 Giugno-Pulvirenti AA Uso di COUNT COUNT(*) SQL> SELECTCOUNT(*) 2 FROMemp 3 WHEREdeptno = 30; COUNT(*) ritorna il numero di righe di una tabella.

37 Giugno-Pulvirenti AA Operatori aggregati: COUNT COUNT come detto 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' –loperatore aggregato (count) viene applicato al risultato dellinterrogazione: SELECT * FROM Paternita WHERE Padre = 'Franco'

38 Giugno-Pulvirenti AA Padre Paternità Figlio Luigi Sergio Olga Filippo Franco Andrea Aldo Franco Andrea Aldo NumFigliDiFranco 2

39 Giugno-Pulvirenti AA 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 Aldo NULL

40 Giugno-Pulvirenti AA Se una colonna A contiene solo valori nulli, MAX, MIN, AVG, SUM restituiscono NULL, mentre Count vale zero.

41 Giugno-Pulvirenti AA 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

42 Giugno-Pulvirenti AA Operatori aggregati e valori nulli SELECT avg(reddito) AS redditomedio FROM persone NomeEtàPersoneReddito Andrea27 Maria55 Anna50 Aldo NULL

43 Giugno-Pulvirenti AA Uso di COUNT COUNT(espr) ritorna il numero di righe non nulle. SQL> SELECTCOUNT(comm) 2 FROMemp 3 WHEREdeptno = 30; COUNT(COMM)

44 Giugno-Pulvirenti AA Valori Null Ignorano I valori nulli nelle colonne. SQL> SELECT AVG(comm) 2 FROM emp; AVG(COMM)

45 Giugno-Pulvirenti AA Creare gruppi di dati IMPIEGATI salariomedio in IMPIEGATI per ogni dipartimento DEPTNO SAL DEPTNO AVG(SAL)

46 Giugno-Pulvirenti AA Creare gruppi tramite: GROUP BY SELECTcolumn, group_function(column) FROMtable [WHEREcondition] [GROUP BYgroup_by_expression] [ORDER BYcolumn]; Divide le righe di una tabella in gruppi piu piccoli.

47 Giugno-Pulvirenti AA 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)

48 Giugno-Pulvirenti AA Uso GROUP BY La colonna di GROUP BY non deve essere necessariamente nella SELECT. SQL> SELECT AVG(sal) 2 FROM emp 3 GROUP BY deptno; AVG(SAL)

49 Giugno-Pulvirenti AA Raggruppare piu di una colonna IMPIEGATI sommare I salari in IMPIEGATI per ongi lavoro, Ragruppati per dipartimeno DEPTNO JOB SAL MANAGER PRESIDENT CLERK CLERK CLERK ANALYST MANAGER SALESMAN MANAGER SALESMAN CLERK SALESMAN SALESMAN 1250 JOB SUM(SAL) CLERK 1300 MANAGER 2450 PRESIDENT 5000 ANALYST 6000 CLERK 1900 MANAGER 2975 CLERK 950 MANAGER 2850 SALESMAN 5600 DEPTNO

50 Giugno-Pulvirenti AA Uso di GROUP BY su colonne multiple SQL> SELECT deptno, job, sum(sal) 2 FROM emp 3 GROUP BY deptno, job; DEPTNO JOB SUM(SAL) CLERK MANAGER PRESIDENT ANALYST CLERK rows selected.

51 Giugno-Pulvirenti AA Operatori aggregati e target list uninterrogazione 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

52 Giugno-Pulvirenti AA 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 Operatori aggregati e raggruppamenti Padre paternita Figlio Luigi Sergio Olga Filippo Franco Andrea Aldo Franco PadreNumFigli Luigi Sergio 2 Franco2 1

53 Giugno-Pulvirenti AA Query illegali con funzioni di raggruppamento Ogni colonna o espressione della SELECT che non e argomento di funzioni di gruppo deve essere nella GROUP BY. SQL> SELECTdeptno, COUNT(ename) 2 FROMemp; SQL> SELECTdeptno, COUNT(ename) 2 FROMemp; SELECT deptno, COUNT(ename) * ERROR at line 1: ORA-00937: not a single-group group function SELECT deptno, COUNT(ename) * ERROR at line 1: ORA-00937: not a single-group group function

54 Giugno-Pulvirenti AA –Non puo essere usata la WHERE per restringere I gruppi. –Deve essere usata la HAVING. SQL> SELECT deptno, AVG(sal) 2 FROM emp 3 WHERE AVG(sal) > GROUP BY deptno; SQL> SELECT deptno, AVG(sal) 2 FROM emp 3 WHERE AVG(sal) > GROUP BY deptno; WHERE AVG(sal) > 2000 * ERROR at line 3: ORA-00934: group function is not allowed here WHERE AVG(sal) > 2000 * ERROR at line 3: ORA-00934: group function is not allowed here Query illegali con funzioni di raggrup.

55 Giugno-Pulvirenti AA Escludere gruppi di ris. salario massimo per dipartmento maggiore di $2900 IMPIEGATI DEPTNO SAL DEPTNO MAX(SAL)

56 Giugno-Pulvirenti AA Clausola HAVING Uso di HAVING per restringere gruppi –Le righe sono raggruppate. –La funzione di raggruppamento e applicata. SELECTcolumn, group_function FROMtable [WHEREcondition] [GROUP BYgroup_by_expression] [HAVINGgroup_condition] [ORDER BYcolumn];

57 Giugno-Pulvirenti AA Uso di HAVING SQL> SELECT deptno, max(sal) 2 FROM emp 3 GROUP BY deptno 4 HAVING max(sal)>2900; DEPTNO MAX(SAL)

58 Giugno-Pulvirenti AA Uso di HAVING SQL> SELECT job, SUM(sal) PAYROLL 2 FROM emp 3 WHERE job NOT LIKE 'SALES%' 4 GROUP BY job 6 ORDER BY SUM(sal); JOB PAYROLL ANALYST 6000 MANAGER HAVING SUM(sal)>5000

59 Giugno-Pulvirenti AA Funzioni di raggruppamento annidate SQL> SELECT max(avg(sal)) 2 FROM emp 3 GROUP BY deptno; MAX(AVG(SAL))

60 Giugno-Pulvirenti AA Sommario SELECTcolumn, group_function(column) FROMtable [WHEREcondition] [GROUP BYgroup_by_expression] [HAVINGgroup_condition] [ORDER BYcolumn]; Ordine di valutazione delle clausole: –WHERE –GROUP BY –HAVING

61 Giugno-Pulvirenti AA Tabelle Tabelle ::= Tabella [Ide] {, Tabella [Ide]} Tabella::= Ide | Tabella OpInsiem Tabella | Tabella Giunzione Tabella [USING (Attributo{,Attributo})|ON Condizione]

62 Giugno-Pulvirenti AA Giunzioni ed Operatori Insiemistici OpInsiem ::= (UNION | INTERSECT | EXCEPT) [CORRESPONDING [BY ( Attributo {,Attributo}) ] ] Union,Intersect,Except sono,,-. CORRESPONDING fa proiettare sugli attributi comuni e poi si applica loperatore insiemistico. Se ce anche BY si specificano su quali comuni attributi proiettare

63 Giugno-Pulvirenti AA Unione, intersezione e differenza La SELECT da sola non permette di fare unioni; serve un costrutto esplicito: SELECT … UNION SELECT... i duplicati vengono eliminati

64 Giugno-Pulvirenti AA Notazione posizionale! SELECT padre FROM paternita UNION SELECT madre FROM maternita quali nomi per gli attributi del risultato? –nessuno –quelli del primo operando –…

65 Giugno-Pulvirenti AA 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

66 Giugno-Pulvirenti AA 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

67 Giugno-Pulvirenti AA Differenza SELECT Nome FROM Impiegato EXCEPT SELECT Cognome as Nome FROM Impiegato vedremo che si può esprimere con SELECT nidificate

68 Giugno-Pulvirenti AA 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


Scaricare ppt "Basi di dati I Prof.ssa Rosalba Giugno Prof. Alfredo Pulvirenti SQL :Structured Query Language: SELECT (II)"

Presentazioni simili


Annunci Google