SQL Structured Query Language Comandi base di DML Rosalba Giugno Rosalba Giugno
2 Generalita SQL sviluppato alla IBM nel 1973 e lo standard per tutti i sistemi commerciali (Oracle, Informix,Postgres,Sybase,DB2 etc..). Esistono sistemi commerciali che utilizzano interfacce tipo QBE :ACCESS. Tuttavia hanno sistemi per la traduzione automatica in SQL.
3 Standard SQL-92 E utilizzato,nel DML, dai principali DBMS relazionali. Mentre per il DDL ci sono variazioni significative. Prevede 3 livelli di linguaggio, di complessita crescente: Entry SQL, Intermediate SQL, Full SQL. 3 Modi di usare SQL: Direct, Embedded, Module
4 Direct ed Embedded SQL Direct SQL : per luso interattivo. Embedded SQL : per luso allinterno di linguaggi di programmazione (Ada, C, COBOL, FORTRAN, PASCAL, PL/1, etc..). I comandi SQL sono preceduti dalle parole chiave EXEC SQL Module SQL: Per scrivere procedure il cui contenuto e un singolo comando SQL,compilate separatamente, chiamate come procedure esterne da programmi.
5 Capacità del comando SQL SELECT Selezione Proiezione Tabella 1 Tabella 2 Tabella 1 Join
6 SELECT SELECT [DISTINCT] Attributi FROM Tabelle [WHERE Condizione]
7 Attributi e Tabelle Attributi ::= * | Attributo {, Attributo} Tabelle ::= Tabella {, Tabella} Dove Tabella sta per una determinata relazione ed Attributo e uno degli attributi delle tabelle citate nel FROM
8 QUERY SU UNA TABELLA
9 Esempi SELECT Indirizzo, Telefono FROM Studenti WHERE Nome=Teo Verdi
10 QUERY SU DUE TABELLE
11 Esempi SELECT Corso FROM Esami,Studenti WHERE Esami.Matricola = Studenti.Matricola AND Nome=Mario Rossi;
12 QUERY SU PIU TABELLE
13 Esempi SELECT Professore, Corsi.Corso FROM Corsi,Esami,Studenti WHERE Corsi.Corso = Esami.Corso AND Esami.Matricola = Studenti.Matricola AND Nome=Teo Verdi AND Voto > 24
14 Scrittura Comandi SQL I comandi SQL non sono case sensitive. Possono essere distribuiti in una o più righe. Clausole sono usualmente inserite in linee separate. I comandi SQL non sono case sensitive. Possono essere distribuiti in una o più righe. Clausole sono usualmente inserite in linee separate.
15 Selezionare tutte le colonne DEPTNO DNAME LOC ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON SQL> SELECT * 2 FROM dept;
16 Selezionare una particolare colonna DEPTNO LOC NEW YORK 20 DALLAS 30 CHICAGO 40 BOSTON SQL> SELECT deptno, loc 2 FROM dept; DEPTNO DNAME LOC ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON
17 Espressioni Aritmetiche Creare espressioni attraverso luso di operatori aritmetici. Operatore + - * / Descrizione Somma Sottrazione Moltiplicazione Divisione
18 Uso degli operatori Aritmetici SQL> SELECT ename, sal, sal FROMemp; ENAME SAL exp KING BLAKE CLARK JONES MARTIN ALLEN rows selected.
19 Precedenza Operatori SQL> SELECT ename, sal, 12*sal FROM emp; ENAME SAL exp KING BLAKE CLARK JONES MARTIN ALLEN rows selected.
20 Uso delle parentesi SQL> SELECT ename, sal, 12*(sal+100) 2 FROM emp; ENAME SAL exp KING BLAKE CLARK JONES MARTIN rows selected.
21 Alias delle colonne Rinominare il nome di una colonna Utile con dei calcoli Deve seguire immediatamente il nome di una colonna (SENZA VIRGOLA); può essere usata opzionalmente la parola chiave AS tra il nome della colonna e lalias. Richiede doppio apice se lalias ha degli spazi Rinominare il nome di una colonna Utile con dei calcoli Deve seguire immediatamente il nome di una colonna (SENZA VIRGOLA); può essere usata opzionalmente la parola chiave AS tra il nome della colonna e lalias. Richiede doppio apice se lalias ha degli spazi
22 Uso dellAlias SQL> SELECT ename AS name, sal salary 2 FROM emp; NAME SALARY SQL> SELECT ename "Name", 2 sal*12 "Annual Salary" 3 FROM emp; Name Annual Salary
23 Alias o Correlation Names SELECT Professore FROM CP p, CMV e WHERE p.Corso = e.Corso AND Matricola = Per evitare ambiguita, quando si usano piu tabelle con lo stesso nome-attributo, si mette il punto.
24 Alias o Correlation Names SELECT c1.Matricola, c2.Matricola FROM CMV c1, CMV c2 WHERE c1.voto < c2.voto
25 Righe duplicate Le righe duplicate sono restituite per default SQL> SELECT deptno 2 FROM emp; SQL> SELECT deptno 2 FROM emp; DEPTNO rows selected.
26 Eliminazione delle righe duplicate E consentito dalluso della parola chiave DISTINCT nella clausola SELECT SQL> SELECT DISTINCT deptno 2 FROM emp; DEPTNO
Restrizioni ed ordinamento Dati
28 Obiettivi Al completamento della lezione, dovreste essere in grado di: Limitare il numero di righe ottenute da una query Riordinare le righe ottenute da una query Al completamento della lezione, dovreste essere in grado di: Limitare il numero di righe ottenute da una query Riordinare le righe ottenute da una query
29 Esempio "…selezionare tutti gli impiegati del dipartimeto 10" IMPIEGATI EMPNO ENAME JOB... DEPTNO 7839KINGPRESIDENT BLAKEMANAGER CLARKMANAGER JONESMANAGER IMPIEGATI EMPNO ENAME JOB... DEPTNO 7839KINGPRESIDENT CLARKMANAGER MILLERCLERK 10
30 Limitare le righe selezionate Limitare le righe tramite luso della clausola WHERE. La clausola WHERE segue la clausola FROM. Limitare le righe tramite luso della clausola WHERE. La clausola WHERE segue la clausola FROM. SELECT[DISTINCT] {*| colonna [alias],...} FROM tabella [WHEREcondizione(i)];
31 Uso della clausola WHERE SQL> SELECT ename, job, deptno 2 FROM emp 3 WHERE job='CLERK'; ENAME JOB DEPTNO JAMES CLERK 30 SMITH CLERK 20 ADAMS CLERK 20 MILLER CLERK 10
32 Stringhe di caratteri e Date Stringhe di caratteri e le date vanno incluse tra apici. I caratteri sono case sensitive e le date sono format sensitive. Stringhe di caratteri e le date vanno incluse tra apici. I caratteri sono case sensitive e le date sono format sensitive. SQL> SELECTename, job, deptno 2 FROM emp 3 WHEREename = 'JAMES'; SQL> SELECTename, job, deptno 2 FROM emp 3 WHEREename = 'JAMES';
33 CONDIZIONE Condizione : := Predicato | (Condizione) | NOT Condizione | Condizione (AND | OR) Condizione Il risultato puo essere TRUE(T),FALSE(F) o UNKOWN(U).
34 Predicati di confronto Espr op (Espr | ( Sottoselect ) ) op {=,, >,, <, } SottoSelect deve dare come risultato una tabella con un solo elemento o vuota (nel qual caso produce il valore U). Il valore U viene prodotto anche nel caso che uno degli operandi ha il valore NULL.
35 Operatori di confronto Operatore = > >= < <= <> Significato Uguale a più grande di maggiore o uguale di minore di minore o uguale a diverso
36 Uso degli Operatori di Confronto SQL> SELECT ename, sal, comm 2 FROM emp 3 WHERE sal<=comm; ENAME SAL COMM MARTIN
37 Altri Operatori di Confronto Operatore BETWEEN...AND... IN(list) LIKE IS NULL Significato compreso tra due valori Corrisp. ad uno dei valori nella lista Operatore di pattern matching Valore nullo
38 Uso delloperatore BETWEEN ENAME SAL MARTIN 1250 TURNER 1500 WARD 1250 ADAMS 1100 MILLER 1300 SQL> SELECTename, sal 2 FROM emp 3 WHEREsal BETWEEN 1000 AND 1500; Limite inferiore Limite superiore BETWEEN consente la selezione di righe con attributi in un particolare range.
39 Predicato Between AND Espr1 [NOT] BETWEEN Espr2 AND Espr3. Equivale a [NOT] Espr2 Espr1 AND Espr1 Espr3
40 Uso delloperatore IN E usato per selezionare righe che hanno un attributo che assume valori contenuti in una lista. SQL> SELECTempno, ename, sal, mgr 2 FROM emp 3 WHEREmgr IN (7902, 7566, 7788); EMPNO ENAME SAL MGR FORD SMITH SCOTT ADAMS
41 Uso delloperatore LIKE LIKE è usato per effettuare ricerche wildcard di una stringa di valori. Le condizioni di ricerca possono contenere sia letterali, caratteri o numeri. – % denota zero o più caratteri. – _ denota un carattere. LIKE è usato per effettuare ricerche wildcard di una stringa di valori. Le condizioni di ricerca possono contenere sia letterali, caratteri o numeri. – % denota zero o più caratteri. – _ denota un carattere. SQL> SELECTename 2 FROM emp 3 WHEREename LIKE 'S%';
42 Uso delloperatore LIKE Il pattern-matching di caratteri può essere combinato. Iidentificatore ESCAPE (\) deve essere usato per cercare "%" o "_". Il pattern-matching di caratteri può essere combinato. Iidentificatore ESCAPE (\) deve essere usato per cercare "%" o "_". SQL> SELECTename 2 FROMemp 3 WHEREename LIKE '_A%'; ENAME MARTIN JAMES WARD
43 Operatori di Match Attributo [NOT] LIKE Stringa Dove Stringa puo contenere anche: _ che fa match con qualunque carattere % che fa match con qualunque sequenza di caratteri vale U se lattributo e NULL
44 Esempio SELECT Nome FROM Studenti WHERE Indirizzo LIKE Via Etnea % Fornisce tutti gli studenti che abitano in Via Etnea
45 Predicati Espr IS [NOT] NULL esempio: SELECT Nome FROM Studenti WHERE Telefono IS NOT NULL
46 Operatori Logici Operatore AND OR NOT Significato Restituisce TRUE if entrambe le condizioni sono TRUE Restituisce TRUE se almeno una delle condizioni è TRUE Restituisce TRUE se la condizione è FALSE
47 LOGICA A 3 VALORI U=Unknown;
48 Uso delloperatore AND AND richiede entrambe le condizioni TRUE. SQL> SELECT empno, ename, job, sal 2 FROM emp 3 WHERE sal>= AND job='CLERK'; EMPNO ENAME JOB SAL ADAMS CLERK MILLER CLERK 1300
49 Uso delloperatore OR OR richiede almeno una condizione TRUE. SQL> SELECT empno, ename, job, sal 2 FROM emp 3 WHERE sal>= OR job='CLERK'; EMPNO ENAME JOB SAL KING PRESIDENT BLAKE MANAGER CLARK MANAGER JONES MANAGER MARTIN SALESMAN JAMES CLERK rows selected.
50 Uso delloperatore NOT SQL> SELECT ename, job 2 FROM emp 3 WHERE job NOT IN ('CLERK','MANAGER','ANALYST'); ENAME JOB KING PRESIDENT MARTIN SALESMAN ALLEN SALESMAN TURNER SALESMAN WARD SALESMAN
51 Regole di precedenza Loverride delle regole di precedenza è ottenuto con luso delle parentesi. Ordine di val. Operatore 1Tutti gli operatori di confronto 2NOT 3AND 4OR
52 Regole di precedenza ENAME JOB SAL KING PRESIDENT 5000 MARTIN SALESMAN 1250 ALLEN SALESMAN 1600 TURNER SALESMAN 1500 WARD SALESMAN 1250 ENAME JOB SAL KING PRESIDENT 5000 MARTIN SALESMAN 1250 ALLEN SALESMAN 1600 TURNER SALESMAN 1500 WARD SALESMAN 1250 SQL> SELECT ename, job, sal 2 FROM emp 3 WHERE job='SALESMAN' 4 OR job='PRESIDENT' 5 AND sal>1500;
53 Regole di precedenza ENAME JOB SAL KING PRESIDENT 5000 ALLEN SALESMAN 1600 ENAME JOB SAL KING PRESIDENT 5000 ALLEN SALESMAN 1600 Luso delle parentesi forza la priorità SQL> SELECT ename, job, sal 2 FROM emp 3 WHERE (job='SALESMAN' 4 OR job='PRESIDENT') 5 AND sal>1500;
54 ORDINAMENTO ORDER BY Attributo [DESC] {, Attributo [DESC] } Va posto dopo il WHERE e fa si che il risultato sia ordinato secondo Attributo in senso crescente mentre se lo si vuole decrescente si deve aggiungere DESC
55 Esempio SELECT e.Corso, e.Voto FROM Esami e, Studenti s WHERE e.Matricola = s.Matricola AND s.Nome = Mario Rossi ORDER BY Voto DESC
Visualizzare Dati da più Tabelle
57 Obiettivi Al completamento della lezione, dovreste essere in grado di: Scrivere comandi SELECT per accedere a dati da più tabelle Vedere dati che generalmente non soddisfano una condizione di join con luso delle outer join Fare la Join di una tabella con se stessa Al completamento della lezione, dovreste essere in grado di: Scrivere comandi SELECT per accedere a dati da più tabelle Vedere dati che generalmente non soddisfano una condizione di join con luso delle outer join Fare la Join di una tabella con se stessa
58 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
59 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 il nome della tabella se la stessa colonna appare in più di una tabella. La join viene usata per effettuare query su più tabelle. La condizione di join va scritta nella clausola WHERE. Mettere come prefisso il nome della tabella se la stessa colonna appare in più di una tabella. SELECTtabella1.colonna, tabella2.colonna FROMtabella, tabella2 WHEREtabella1.colonna1 = tabella2.colonna2; SELECTtabella1.colonna, tabella2.colonna FROMtabella, tabella2 WHEREtabella1.colonna1 = tabella2.colonna2;
60 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. 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.
61 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
62 Cosa e una Equijoin? 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 Straniera Chiave Primaria Chiave Primaria
63 Estrarre Record con Equijoin 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.
64 Condizioni di Ricerca addizioli 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.
65 Condizioni di Ricerca Uso delloperatore AND SQL> SELECT emp.empno, emp.ename, emp.deptno, 2dept.deptno, dept.loc 3 FROM emp, dept 4 WHERE emp.deptno=dept.deptno AND ENAME=KING;
66 Join di piu di due 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.
67 Join di piu di due Tabelle SQL> SELECT * 2 FROM clienti, ordini, prod 3 WHERE clineti.custid=ordini.custid AND prod.ordid=prod.ordid;
68 Predicati Di Appartenenza e Quantificatori
69 CONDIZIONE Condizione : := Predicato | (Condizione) | NOT Condizione | Condizione (AND | OR) Condizione Il risultato puo essere TRUE(T),FALSE(F) o UNKOWN(U).
70 Predicati di Appartenenza Espr [NOT] IN ( (SottoSelect) | (Valore {, Valore} ) ). Vale U se Espr e NULL oppure se NULL e fra i valori della SottoSelect SELECT Matricola FROM Esami WHERE Voto IN ( 18, 19, 20 )
71 IN o Join? IN va usato quando e strettamente necessario e non a posto di giunzioni SELECT Nome FROM Studenti WHERE Matricola IN (SELECT Matricola FROM Esami WHERE Voto>27)
72 Va meglio scritta come SELECT DISTINCT s.Nome FROM Studenti s, Esami e WHERE s.Matricola = e.Matricola AND Voto > 27 E piu efficiente perche ce un ottimizzatore che velocizza le join rispetto alle SottoSelect
73 Predicati Esistenziali [NOT] EXISTS ( SottoSelect ) E Vero se la SottoSelect non ritorna linsieme vuoto. SELECT Nome FROM Studenti s WHERE NOT EXISTS (SELECT * FROM Esami e, Corsi c WHERE e.Corso = c.Corso AND s.Matricola = e.Matricola AND c.Professore = Ferro) Nota: nella sottoselect si puo usare la variabile di correlazione della select superiore ma non il contrario
74 EXISTS o JOIN? SELECT e.Matricola FROM Esami e WHERE EXISTS (SELECT * FROM Corsi c WHERE c.Corso = e.Corso AND c.Professore=Ferro)
75 Usando lOttimizzatore di Join SELECT e.Matricola FROM Esami e, Corsi c WHERE c.Corso = e.Corso AND c.Professore=Ferro E piu efficiente.
76 Altri Quantificatori Espr op (ANY | ALL) (SottoSelect) op {=,, >,, <, } SELECT s.Nome FROM Studenti s, Esami e WHERE s.Matricola = e.Matricola AND e.Voto > ALL (SELECT DISTINCT f.Voto FROM Esami f, Studenti t WHERE f.Matricola = t.Matricola AND t.Nome = Mario Rossi)
77 Espr = ANY (SottoSelect) equivale a Espr IN (Sottoselect) Espr NOT IN (SottoSelect) non equivale a Espr <> ANY (SottoSelect) ma a Espr <> All (SottoSelect)
78 Ricordiamo lesempio Agenti(CodiceAgente,Nome,Zona Supervisore,Commissione) Clienti(CodiceCliente,Nome,Citta,Scont o) Ordini(CodiceOrdine,CodiceCliente,Cod iceAgente,Articolo,Data,Ammontare)
79 Quantificatore Universale Supponiamo di voler trovare i codici di quei clienti che hanno fatto ordini a TUTTI gli agenti di Catania. Per ogni agente z di Catania esiste un ordine y del nostro cliente x a z. z y y(n,x,z,p,d,a) sse z y y(n,x,z,p,d,a)
80 Tradotta in SQL SELECT c.CodiceCliente FROM Clienti c WHERE NOT EXISTS (SELECT * FROM Agenti a WHERE a.Zona = Catania AND NOT EXISTS ( SELECT * FROM Ordini v WHERE v.CodiceCliente = c.CodiceCliente AND v.CodiceAgente = a.CodiceAgente) )
Aggregazione dati
82 Obiettivi Al completamento della lezione, 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 Al completamento della lezione, 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
83 Cosa sono? Operano su insiemi di righe per dare un risultato per gruppo. IMPIEGATI SalarioMassimo DEPTNO SAL MAX(SAL)
84 Funzioni Statistiche MAX,MIN,COUNT,AVG,SUM Operano sui valori di un certo attributo ignorando i valori NULL Se i valori sono tutti NULL allora valgono tutte NULL eccetto COUNT che vale zero. COUNT(DISTINCT..) da il numero dei valori distinti di un attributo mentre COUNT(*) da il numero delle righe
85 Esempi SELECT MIN(Voto),MAX(Voto),AVG(Voto) FROM Esami WHERE Matricola = SELECT COUNT(*) FROM Esami WHERE Corso = Database 1
86 Quali sono AVG COUNT MAX MIN STDDEV SUM VARIANCE AVG COUNT MAX MIN STDDEV SUM VARIANCE
87 Uso SELECT[column,] group_function(column) FROMtable [WHEREcondition] [GROUP BYcolumn] [ORDER BYcolumn];
88 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%';
89 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
90 Uso di COUNT COUNT(*) SQL> SELECTCOUNT(*) 2 FROMemp 3 WHEREdeptno = 30; COUNT(*) ritorna il numero di righe di una tabella.
91 Creare gruppi di dati IMPIEGATI salariomedio in IMPIEGATI per ogni dipartimento DEPTNO SAL DEPTNO AVG(SAL)
92 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.
93 Raggruppamento GROUP BY Attributo {, Attributo} [HAVING Condizione] Va posto dopo WHERE e opera una partizione delle righe del risultato in base ad eguali valori su quegli attributi (NULL incluso). Quindi si produce una n-upla per ogni classe di equivalenza che soddisfa la condizione HAVING
94 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)
95 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)
96 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
97 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.
98 Query illegali con funzioni di raggruppamento Ogni colonna o espressione della SELECT che non e argomento di funzioni di 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
99 Non puo essere usata la WHERE per restringere I gruppi. Deve essere usata la HAVING. 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.
100 Escludere gruppi di ris. salario massimo per dipartmento maggiore di $2900 IMPIEGATI DEPTNO SAL DEPTNO MAX(SAL)
101 Clausola HAVING Uso di HAVING per restringere gruppi Le righe sono raggruppate. La funzione di raggruppamento e applicata. 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];
102 Uso di HAVING SQL> SELECT deptno, max(sal) 2 FROM emp 3 GROUP BY deptno 4 HAVING max(sal)>2900; DEPTNO MAX(SAL)
103 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
104 Funzioni di raggruppamento annidate SQL> SELECT max(avg(sal)) 2 FROM emp 3 GROUP BY deptno; MAX(AVG(SAL))
105 Esempio SELECT Nome, Matricola MIN(Voto),MAX(Voto),AVG(Voto) FROM Esami, Studenti WHERE Esami.Matricola = Studenti.Matricola GROUP BY Nome,Matricola HAVING COUNT(*) > 8
106 Sommario SELECTcolumn, group_function(column) FROMtable [WHEREcondition] [GROUP BYgroup_by_expression] [HAVINGgroup_condition] [ORDER BYcolumn]; Ordine di valutazione delle clausole: WHERE GROUP BY HAVING Ordine di valutazione delle clausole: WHERE GROUP BY HAVING
107 Visualizzare Dati da piu tabelle (||) Diversi tipi di Joins Operatori Insiemistici
108 Tabelle Tabelle ::= Tabella [Ide] {, Tabella [Ide]} Tabella::= Ide | Tabella OpInsiem Tabella | Tabella Giunzione Tabella [USING (Attributo{,Attributo})|ON Condizione]
109 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
110 Ancora su Join ed Operatori Insiemistici Cross Join e il prodotto cartesiano Union Join e lunione esterna cioe si estendono le due tabelle con le colonne dellaltra con valori nulli e si fa lunione delle due stesse tabelle.
111 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
112 Esempi Natural Join SELECT Studenti.Nome,Esami.Corso,Esami.Voto FROM Esami NATURAL JOIN Studenti Nome,Corso e Voto degli esami
113 [LEFT|RIGHT|FULL] usato con Natural Join o Join e la giunzione esterna nelle tre modalita sinistra,destra o completa.
114 Right Outer Join Outer Join Operators Left Outer Join Join Le righe che soddisfano la join Le righe escluse dalla join della tabella a sx Le righe escluse dalla join della tabella a dx Full outer join
115 Altro Esempio Agenti(CodiceAgente,Nome,Zona Supervisore,Commissione) Clienti(CodiceCliente,Nome,Citta,Sconto) Ordini(CodiceOrdine,CodiceCliente,Codic eAgente,Articolo,Data,Ammontare)
116 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
117 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)
118 Le operazioni Insiemistici A UNION B A INTERSECT B A MINUS B
119 Le operazioni 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
120 UNIONE SELECT * FROM Clienti UNION CORRESPONDING Agenti Fornisce tutti i nomi dei clienti e degli agenti. In effetti nei sistemi commerciali sarebbe SELECT Nome FROM Clienti UNION SELECT Nome FROM Agenti
121 Formalizziamo
122 Attributi Attributi ::= * | Espr [[AS] NuovoNome] {, Espr [[AS] NuovoNome] } Espr ::= [Ide.]Attributo | Costante | ( Espr ) | [-] Espr [ Espr] | (SUM | COUNT |AVG | MAX | MIN) ( [DISTINCT] [Ide.] Attributo ) | COUNT ( * ) ::= ( + | - | * | / )
123 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
124 Tabelle Tabelle ::= Tabella [Ide] {, Tabella [Ide]} Tabella::= Ide | Tabella OpInsiem Tabella | Tabella Giunzione Tabella [USING (Attributo{,Attributo})|ON Condizione]
125 Esempi SELECT Professore FROM CP,CMV,MNIT WHERE CP.Corso = CMV.Corso AND CMV.Matricola = NMIT.Matricola AND Nome=Paolo Rossi AND Voto > 27
126 Sintassi Completa del SELECT Select ::= Sottoselect {(UNION|EXCEPT) Sottoselect} [ORDER BY Attributo[DESC] {, Attributo[DESC]} ]
127 Sottoselect Sottoselect ::= SELECT [DISTINCT] (* | Espr[[AS] NewName] {,Espr [[AS] NewName]}) FROM Tabella [Ide]{,Tabella[Ide]} [WHERE Condizione] [GROUP BY Attributo {,Attributo}] [HAVING Condizione]
128 Condizione Condizione ::= Predicato | ( Condizione ) | NOT Condizione | Condizione (AND | OR) Condizione
129 Predicato Predicato::= Espr [NOT] IN ( SottoSelect ) | Espr [NOT] IN ( Valore {,Valore} ) | Espr opc (Espr | ( SottoSelect ) ) | Espr IS [NOT] NULL | Espr opc (ANY | ALL) ( SottoSelect ) | [NOT] EXISTS ( SottoSelect ) | Espr [NOT] BETWEEN Espr AND Espr | Espr [NOT] LIKE Stringa opc ::= | | | | |
130 Espressioni Espr ::= [Ide.] Attributo | Costante | ( Espr ) | [-] Espr [ opa Espr] | (SUM | COUNT | AVG | MAX | MIN) ( [DISTINCT] [Ide.] Attributo) | COUNT ( * ) opa ::= (+ | - | * | / )
131 Tabelle Tabella ::= Ide | Tabella opins Tabella | Tabella giunzione Tabella [USING ( Attributo {, Attributo } ) | ON Condizione] giunzione ::= [CROSS|UNION|NATURAL] [LEFT!RIGHT|FULL]JOIN opins ::= (UNION|INTERSECT|EXCEPT) [CORRESPONDING [BY(Attributo {,Attributo} )]]