La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

SQL :Structured Query Language: SELECT (II)

Presentazioni simili


Presentazione sul tema: "SQL :Structured Query Language: SELECT (II)"— Transcript della presentazione:

1 SQL :Structured Query Language: SELECT (II)

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

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

4 Ancora su Join ed Operatori Insiemistici
Union,Intersect,Except sono ,,-. CORRESPONDING fa proiettare sugli attributi comuni e poi si applica l’operatore insiemistico. Se c’e’ anche BY si specificano su quali comuni attributi proiettare Cross Join e’ il prodotto cartesiano Union Join e’ l’unione esterna cioe’ si estendono le due tabelle con le colonne dell’altro con valori nulli e si fa l’unione. Giugno-Pulvirenti AA

5 Giugno-Pulvirenti AA 2005-2006
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. Giugno-Pulvirenti AA

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

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

8 Giugno-Pulvirenti AA 2005-2006
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 Giugno-Pulvirenti AA

9 Giugno-Pulvirenti AA 2005-2006
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) Giugno-Pulvirenti AA

10 Ottenere dati da più Tabelle
EMPNO ENAME ... DEPTNO KING 7698 BLAKE ... 7934 MILLER DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON IMPIEGATI DIPARTIMENTI EMPNO DEPTNO LOC NEW YORK CHICAGO NEW YORK DALLAS CHICAGO CHICAGO ... 14 rows selected. Giugno-Pulvirenti AA

11 Giugno-Pulvirenti AA 2005-2006
Cosa è una Join? 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. SELECT tabella1.colonna, tabella2.colonna FROM tabella, tabella2 WHERE tabella1.colonna1 = tabella2.colonna2; Giugno-Pulvirenti AA

12 Giugno-Pulvirenti AA 2005-2006
Nome Età Persone Reddito Madre Maternità Figlio Luisa Anna Maria Olga Filippo Andrea Aldo Luigi Andrea 27 Maria 55 Anna 50 Filippo 26 Luigi Franco 60 Olga 30 Sergio 85 Luisa 75 Aldo 25 21 42 35 40 20 41 87 15 Padre Paternità Figlio Luigi Franco Sergio Olga Filippo Andrea Aldo Giugno-Pulvirenti AA

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

14 Giugno-Pulvirenti AA 2005-2006
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 . Giugno-Pulvirenti AA

15 Generare un Prodotto Cartesiano
IMPIEGATI (14 righe) DIPARTIMENTI (4 righe) EMPNO ENAME ... DEPTNO KING 7698 BLAKE ... 7934 MILLER DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON ENAME DNAME KING ACCOUNTING BLAKE ACCOUNTING ... KING RESEARCH BLAKE RESEARCH 56 rows selected. “Prodotto Cartesiano: 14*4=56 rows” Giugno-Pulvirenti AA

16 Giugno-Pulvirenti AA 2005-2006
Cosa è una Natural join? IMPIEGATI DIPARTIMENTI EMPNO ENAME DEPTNO 7839 KING 7698 BLAKE 7782 CLARK 7566 JONES 7654 MARTIN 7499 ALLEN 7844 TURNER 7900 JAMES 7521 WARD 7902 FORD 7369 SMITH ... 14 rows selected. DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 30 SALES CHICAGO 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO ... 14 rows selected. Chiave esterna Chiave Primaria Giugno-Pulvirenti AA

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

18 Condizioni di Ricerca addizionali Uso dell’operatore AND
EMP DEPT EMPNO ENAME DEPTNO 7839 KING 7698 BLAKE 7782 CLARK 7566 JONES 7654 MARTIN 7499 ALLEN 7844 TURNER 7900 JAMES 7521 WARD 7902 FORD 7369 SMITH ... 14 rows selected. DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 30 SALES CHICAGO 20 RESEARCH DALLAS 30 SALES CHICAGO ... 14 rows selected. Giugno-Pulvirenti AA

19 Giugno-Pulvirenti AA 2005-2006
Join di piu’ Tabelle CLIENTI CUSTID ORDID ... 21 rows selected. ORDINI NAME CUSTID JOCKSPORTS TKB SPORT SHOP VOLLYRITE JUST TENNIS K+T SPORTS SHAPE UP WOMENS SPORTS 9 rows selected. ORDID ITEMID ... 64 rows selected. PROD. Giugno-Pulvirenti AA

20 Giugno-Pulvirenti AA 2005-2006
Nome Età Persone Reddito Madre Maternità Figlio Luisa Anna Maria Olga Filippo Andrea Aldo Luigi Andrea 27 Maria 55 Anna 50 Filippo 26 Luigi Franco 60 Olga 30 Sergio 85 Luisa 75 Aldo 25 21 42 35 40 20 41 87 15 Padre Paternità Figlio Luigi Franco Sergio Olga Filippo Andrea Aldo Giugno-Pulvirenti AA

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

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

23 Necessita’ di ridenominazione
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 JOINFiglio =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 Giugno-Pulvirenti AA

24 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 O meglio 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 Giugno-Pulvirenti AA

25 Giugno-Pulvirenti AA 2005-2006
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 Giugno-Pulvirenti AA

26 Giugno-Pulvirenti AA 2005-2006
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 Giugno-Pulvirenti AA

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

28 Aggregazione dati

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

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

31 Giugno-Pulvirenti AA 2005-2006
Cosa sono? Operano su insiemi di righe per dare un risultato per gruppo. IMPIEGATI DEPTNO SAL “Salario Massimo” MAX(SAL) 5000 Giugno-Pulvirenti AA

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

33 Giugno-Pulvirenti AA 2005-2006
Uso SELECT [column,] group_function(column) FROM table [WHERE condition] [GROUP BY column] [ORDER BY column]; Giugno-Pulvirenti AA

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

35 Giugno-Pulvirenti AA 2005-2006
Uso di MIN e MAX Possono essere usati su qualsiasi tipo. SQL> SELECT MIN(hiredate), MAX(hiredate) 2 FROM emp; MIN(HIRED MAX(HIRED 17-DEC JAN-83 Giugno-Pulvirenti AA

36 Giugno-Pulvirenti AA 2005-2006
Uso di COUNT COUNT(*) ritorna il numero di righe di una tabella. SQL> SELECT COUNT(*) 2 FROM emp 3 WHERE deptno = 30; COUNT(*) 6 Giugno-Pulvirenti AA

37 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' l’operatore aggregato (count) viene applicato al risultato dell’interrogazione: SELECT * Giugno-Pulvirenti AA

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

39 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 Nome Età Persone Reddito Andrea 27 Maria 55 Anna 50 Aldo 25 21 35 NULL Giugno-Pulvirenti AA

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

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

42 Operatori aggregati e valori nulli
SELECT avg(reddito) AS redditomedio FROM persone Nome Età Persone Reddito Andrea 27 Maria 55 Anna 50 Aldo 25 30 36 NULL Giugno-Pulvirenti AA

43 Giugno-Pulvirenti AA 2005-2006
Uso di COUNT COUNT(espr) ritorna il numero di righe non nulle. SQL> SELECT COUNT(comm) 2 FROM emp 3 WHERE deptno = 30; COUNT(COMM) 4 Giugno-Pulvirenti AA

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

45 Giugno-Pulvirenti AA 2005-2006
Creare gruppi di dati IMPIEGATI DEPTNO SAL “salario medio in IMPIEGATI per ogni dipartimento” DEPTNO AVG(SAL) 2175 Giugno-Pulvirenti AA

46 Creare gruppi tramite: GROUP BY
SELECT column, group_function(column) FROM table [WHERE condition] [GROUP BY group_by_expression] [ORDER BY column]; Divide le righe di una tabella in gruppi piu’ piccoli. Giugno-Pulvirenti AA

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

48 Giugno-Pulvirenti AA 2005-2006
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) 2175 Giugno-Pulvirenti AA

49 Raggruppare piu’ di una colonna
IMPIEGATI DEPTNO JOB SAL 10 MANAGER 10 PRESIDENT 10 CLERK 20 CLERK 20 CLERK 20 ANALYST 20 MANAGER 30 SALESMAN 30 MANAGER 30 SALESMAN 30 CLERK 30 SALESMAN DEPTNO 10 20 30 JOB SUM(SAL) CLERK MANAGER PRESIDENT ANALYST CLERK MANAGER CLERK MANAGER SALESMAN “sommare I salari in IMPIEGATI per ongi lavoro, Ragruppati per dipartimeno” Giugno-Pulvirenti AA

50 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) 10 CLERK 10 MANAGER 10 PRESIDENT 20 ANALYST 20 CLERK ... 9 rows selected. Giugno-Pulvirenti AA

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

52 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 Padre NumFigli Luigi Sergio 2 Franco 1 Giugno-Pulvirenti AA

53 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> SELECT deptno, COUNT(ename) 2 FROM emp; SELECT deptno, COUNT(ename) * ERROR at line 1: ORA-00937: not a single-group group function Giugno-Pulvirenti AA

54 Query illegali con funzioni di raggrup.
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) > 2000 4 GROUP BY deptno; WHERE AVG(sal) > 2000 * ERROR at line 3: ORA-00934: group function is not allowed here Giugno-Pulvirenti AA

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

56 Giugno-Pulvirenti AA 2005-2006
Clausola HAVING Uso di HAVING per restringere gruppi Le righe sono raggruppate. La funzione di raggruppamento e’ applicata. SELECT column, group_function FROM table [WHERE condition] [GROUP BY group_by_expression] [HAVING group_condition] [ORDER BY column]; Giugno-Pulvirenti AA

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

58 Giugno-Pulvirenti AA 2005-2006
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); 5 HAVING SUM(sal)>5000 JOB PAYROLL ANALYST MANAGER Giugno-Pulvirenti AA

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

60 Giugno-Pulvirenti AA 2005-2006
Sommario SELECT column, group_function(column) FROM table [WHERE condition] [GROUP BY group_by_expression] [HAVING group_condition] [ORDER BY column]; Ordine di valutazione delle clausole: WHERE GROUP BY HAVING Giugno-Pulvirenti AA

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

62 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 l’operatore insiemistico. Se c’e’ anche BY si specificano su quali comuni attributi proiettare Giugno-Pulvirenti AA

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

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

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

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

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

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


Scaricare ppt "SQL :Structured Query Language: SELECT (II)"

Presentazioni simili


Annunci Google