Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoRosina Valeri Modificato 11 anni fa
1
SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it www.dmi.unict.it/~giugno/ Rosalba Giugno giugno@dmi.unict.it www.dmi.unict.it/~giugno/
2
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
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
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
5 Capacità del comando SQL SELECT Selezione Proiezione Tabella 1 Tabella 2 Tabella 1 Join
6
6 SELECT SELECT [DISTINCT] Attributi FROM Tabelle [WHERE Condizione]
7
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
8 QUERY SU UNA TABELLA
9
9 Esempi SELECT Indirizzo, Telefono FROM Studenti WHERE Nome=Teo Verdi
10
10 QUERY SU DUE TABELLE
11
11 Esempi SELECT Corso FROM Esami,Studenti WHERE Esami.Matricola = Studenti.Matricola AND Nome=Mario Rossi;
12
12 QUERY SU PIU TABELLE
13
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
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
15 Selezionare tutte le colonne DEPTNO DNAME LOC --------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON SQL> SELECT * 2 FROM dept;
16
16 Selezionare una particolare colonna DEPTNO LOC --------- ------------- 10 NEW YORK 20 DALLAS 30 CHICAGO 40 BOSTON SQL> SELECT deptno, loc 2 FROM dept; DEPTNO DNAME LOC --------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON
17
17 Espressioni Aritmetiche Creare espressioni attraverso luso di operatori aritmetici. Operatore + - * / Descrizione Somma Sottrazione Moltiplicazione Divisione
18
18 Uso degli operatori Aritmetici SQL> SELECT ename, sal, sal+300 2 FROMemp; ENAME SAL exp ---------- --------- --------- KING 5000 5300 BLAKE 2850 3150 CLARK 2450 2750 JONES 2975 3275 MARTIN 1250 1550 ALLEN 1600 1900... 14 rows selected.
19
19 Precedenza Operatori SQL> SELECT ename, sal, 12*sal+100 2 FROM emp; ENAME SAL exp ---------- --------- ---------- KING 5000 60100 BLAKE 2850 34300 CLARK 2450 29500 JONES 2975 35800 MARTIN 1250 15100 ALLEN 1600 19300... 14 rows selected.
20
20 Uso delle parentesi SQL> SELECT ename, sal, 12*(sal+100) 2 FROM emp; ENAME SAL exp ---------- --------- ----------- KING 5000 61200 BLAKE 2850 35400 CLARK 2450 30600 JONES 2975 36900 MARTIN 1250 16200... 14 rows selected.
21
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
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
23 Alias o Correlation Names SELECT Professore FROM CP p, CMV e WHERE p.Corso = e.Corso AND Matricola = 123456 Per evitare ambiguita, quando si usano piu tabelle con lo stesso nome-attributo, si mette il punto.
24
24 Alias o Correlation Names SELECT c1.Matricola, c2.Matricola FROM CMV c1, CMV c2 WHERE c1.voto < c2.voto
25
25 Righe duplicate Le righe duplicate sono restituite per default SQL> SELECT deptno 2 FROM emp; SQL> SELECT deptno 2 FROM emp; DEPTNO --------- 10 30 10 20... 14 rows selected.
26
26 Eliminazione delle righe duplicate E consentito dalluso della parola chiave DISTINCT nella clausola SELECT SQL> SELECT DISTINCT deptno 2 FROM emp; DEPTNO --------- 10 20 30
27
Restrizioni ed ordinamento Dati
28
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
29 Esempio "…selezionare tutti gli impiegati del dipartimeto 10" IMPIEGATI EMPNO ENAME JOB... DEPTNO 7839KINGPRESIDENT 10 7698BLAKEMANAGER 30 7782CLARKMANAGER 10 7566JONESMANAGER 20... IMPIEGATI EMPNO ENAME JOB... DEPTNO 7839KINGPRESIDENT 10 7782CLARKMANAGER 10 7934MILLERCLERK 10
30
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
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
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
33 CONDIZIONE Condizione : := Predicato | (Condizione) | NOT Condizione | Condizione (AND | OR) Condizione Il risultato puo essere TRUE(T),FALSE(F) o UNKOWN(U).
34
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
35 Operatori di confronto Operatore = > >= < <= <> Significato Uguale a più grande di maggiore o uguale di minore di minore o uguale a diverso
36
36 Uso degli Operatori di Confronto SQL> SELECT ename, sal, comm 2 FROM emp 3 WHERE sal<=comm; ENAME SAL COMM ---------- --------- --------- MARTIN 1250 1400
37
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
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
39 Predicato Between AND Espr1 [NOT] BETWEEN Espr2 AND Espr3. Equivale a [NOT] Espr2 Espr1 AND Espr1 Espr3
40
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 --------- ---------- --------- --------- 7902 FORD 3000 7566 7369 SMITH 800 7902 7788 SCOTT 3000 7566 7876 ADAMS 1100 7788
41
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
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
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
44 Esempio SELECT Nome FROM Studenti WHERE Indirizzo LIKE Via Etnea % Fornisce tutti gli studenti che abitano in Via Etnea
45
45 Predicati Espr IS [NOT] NULL esempio: SELECT Nome FROM Studenti WHERE Telefono IS NOT NULL
46
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
47 LOGICA A 3 VALORI U=Unknown;
48
48 Uso delloperatore AND AND richiede entrambe le condizioni TRUE. SQL> SELECT empno, ename, job, sal 2 FROM emp 3 WHERE sal>=1100 4 AND job='CLERK'; EMPNO ENAME JOB SAL --------- ---------- --------- --------- 7876 ADAMS CLERK 1100 7934 MILLER CLERK 1300
49
49 Uso delloperatore OR OR richiede almeno una condizione TRUE. SQL> SELECT empno, ename, job, sal 2 FROM emp 3 WHERE sal>=1100 4 OR job='CLERK'; EMPNO ENAME JOB SAL --------- ---------- --------- --------- 7839 KING PRESIDENT 5000 7698 BLAKE MANAGER 2850 7782 CLARK MANAGER 2450 7566 JONES MANAGER 2975 7654 MARTIN SALESMAN 1250... 7900 JAMES CLERK 950... 14 rows selected.
50
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
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
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
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
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
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
56
Visualizzare Dati da più Tabelle
57
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
58 EMPNO DEPTNO LOC ----- ------- -------- 7839 10 NEW YORK 7698 30 CHICAGO 7782 10 NEW YORK 7566 20 DALLAS 7654 30 CHICAGO 7499 30 CHICAGO... 14 rows selected. EMPNO DEPTNO LOC ----- ------- -------- 7839 10 NEW YORK 7698 30 CHICAGO 7782 10 NEW YORK 7566 20 DALLAS 7654 30 CHICAGO 7499 30 CHICAGO... 14 rows selected. Ottenere dati da più Tabelle IMPIEGATI DIPARTIMENTI EMPNOENAME...DEPTNO -----------...------ 7839KING... 10 7698BLAKE... 30... 7934MILLER... 10 DEPTNO DNAME LOC ------ ------------------ 10ACCOUNTINGNEW YORK 20RESEARCHDALLAS 30SALESCHICAGO 40OPERATIONSBOSTON
59
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
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
61 Generare un Prodotto Cartesiano ENAME DNAME ------ ---------- KINGACCOUNTING BLAKE ACCOUNTING... KINGRESEARCH BLAKE RESEARCH... 56 rows selected. ENAME DNAME ------ ---------- KINGACCOUNTING BLAKE ACCOUNTING... KINGRESEARCH BLAKE RESEARCH... 56 rows selected. IMPIEGATI (14 righe) DIPARTIMENTI (4 righe) EMPNOENAME...DEPTNO -----------...------ 7839KING... 10 7698BLAKE... 30... 7934MILLER... 10 EMPNOENAME...DEPTNO -----------...------ 7839KING... 10 7698BLAKE... 30... 7934MILLER... 10 DEPTNO DNAME LOC ------ ------------------ 10ACCOUNTINGNEW YORK 20RESEARCHDALLAS 30SALESCHICAGO 40OPERATIONSBOSTON DEPTNO DNAME LOC ------ ------------------ 10ACCOUNTINGNEW YORK 20RESEARCHDALLAS 30SALESCHICAGO 40OPERATIONSBOSTONProdotto Cartesiano: 14*4=56 rows
62
62 Cosa e una Equijoin? IMPIEGATI DIPARTIMENTI EMPNO ENAME DEPTNO ------ ------- ------- 7839 KING 10 7698 BLAKE 30 7782 CLARK 10 7566 JONES 20 7654 MARTIN 30 7499 ALLEN 30 7844 TURNER 30 7900 JAMES 30 7521 WARD 30 7902 FORD 20 7369 SMITH 20... 14 rows selected. DEPTNO DNAME LOC ------- ---------- -------- 10 ACCOUNTING NEW YORK 30 SALES CHICAGO 10 ACCOUNTINGNEW YORK 20 RESEARCHDALLAS 30 SALES CHICAGO 20 RESEARCHDALLAS... 14 rows selected. Chiave Straniera Chiave Primaria Chiave Primaria
63
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 ----- ------ ------ ------ --------- 7839 KING 10 10 NEW YORK 7698 BLAKE 30 30 CHICAGO 7782 CLARK 10 10 NEW YORK 7566 JONES 20 20 DALLAS... 14 rows selected.
64
64 Condizioni di Ricerca addizioli Uso delloperatore AND EMPDEPT EMPNO ENAME DEPTNO ------ ------- ------- 7839 KING 10 7698 BLAKE 30 7782 CLARK 10 7566 JONES 20 7654 MARTIN 30 7499 ALLEN 30 7844 TURNER 30 7900 JAMES 30 7521 WARD 30 7902 FORD 20 7369 SMITH 20... 14 rows selected. DEPTNO DNAME LOC ------ ----------------- 10 ACCOUNTINGNEW YORK 30SALES CHICAGO 10 ACCOUNTINGNEW YORK 20 RESEARCHDALLAS 30 SALES CHICAGO 20 RESEARCHDALLAS... 14 rows selected.
65
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
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 107... 9 rows selected. NAMECUSTID ----------------- JOCKSPORTS 100 TKB SPORT SHOP 101 VOLLYRITE 102 JUST TENNIS 103 K+T SPORTS 105 SHAPE UP 106 WOMENS SPORTS 107... 9 rows selected. CLIENTI CUSTID ORDID ------- 101 610 102 611 104 612 106 601 102 602 106 604 106 605... 21 rows selected. CUSTID ORDID ------- 101 610 102 611 104 612 106 601 102 602 106 604 106 605... 21 rows selected.ORDINI ORDID ITEMID ------ ------- 610 3 611 1 612 1 601 1 602 1... 64 rows selected. ORDID ITEMID ------ ------- 610 3 611 1 612 1 601 1 602 1... 64 rows selected.PROD.
67
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
68 Predicati Di Appartenenza e Quantificatori
69
69 CONDIZIONE Condizione : := Predicato | (Condizione) | NOT Condizione | Condizione (AND | OR) Condizione Il risultato puo essere TRUE(T),FALSE(F) o UNKOWN(U).
70
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
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
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
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
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
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
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
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
78 Ricordiamo lesempio Agenti(CodiceAgente,Nome,Zona Supervisore,Commissione) Clienti(CodiceCliente,Nome,Citta,Scont o) Ordini(CodiceOrdine,CodiceCliente,Cod iceAgente,Articolo,Data,Ammontare)
79
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
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) )
81
Aggregazione dati
82
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
83 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
84
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
85 Esempi SELECT MIN(Voto),MAX(Voto),AVG(Voto) FROM Esami WHERE Matricola = 123456 SELECT COUNT(*) FROM Esami WHERE Corso = Database 1
86
86 Quali sono AVG COUNT MAX MIN STDDEV SUM VARIANCE AVG COUNT MAX MIN STDDEV SUM VARIANCE
87
87 Uso SELECT[column,] group_function(column) FROMtable [WHEREcondition] [GROUP BYcolumn] [ORDER BYcolumn];
88
88 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%';
89
89 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
90
90 Uso di COUNT COUNT(*) --------- 6 SQL> SELECTCOUNT(*) 2 FROMemp 3 WHEREdeptno = 30; COUNT(*) ritorna il numero di righe di una tabella.
91
91 Creare gruppi di dati IMPIEGATI salariomedio in IMPIEGATI per ogni dipartimento 2916.6667 2916.6667 2175 2175 1566.6667 1566.6667 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 DEPTNO AVG(SAL) ------- --------- 10 2916.6667 20 2175 30 1566.6667
92
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
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
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) --------- 10 2916.6667 20 2175 30 1566.6667
95
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) --------- 2916.6667 2175 1566.6667
96
96 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
97
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) --------- --------- --------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 20 ANALYST 6000 20 CLERK 1900... 9 rows selected.
98
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
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) > 2000 4 GROUP BY deptno; 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 WHERE AVG(sal) > 2000 * ERROR at line 3: ORA-00934: group function is not allowed here Query illegali con funzioni di raggrup.
100
100 Escludere gruppi di ris. salario massimo per dipartmento maggiore di $2900 IMPIEGATI 5000 3000 2850 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 DEPTNO MAX(SAL) --------- 10 5000 20 3000
101
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
102 Uso di HAVING SQL> SELECT deptno, max(sal) 2 FROM emp 3 GROUP BY deptno 4 HAVING max(sal)>2900; DEPTNO MAX(SAL) --------- 10 5000 20 3000
103
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 8275 5 HAVING SUM(sal)>5000
104
104 Funzioni di raggruppamento annidate SQL> SELECT max(avg(sal)) 2 FROM emp 3 GROUP BY deptno; MAX(AVG(SAL)) ------------- 2916.6667
105
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
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
107 Visualizzare Dati da piu tabelle (||) Diversi tipi di Joins Operatori Insiemistici
108
108 Tabelle Tabelle ::= Tabella [Ide] {, Tabella [Ide]} Tabella::= Ide | Tabella OpInsiem Tabella | Tabella Giunzione Tabella [USING (Attributo{,Attributo})|ON Condizione]
109
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
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
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
112 Esempi Natural Join SELECT Studenti.Nome,Esami.Corso,Esami.Voto FROM Esami NATURAL JOIN Studenti Nome,Corso e Voto degli esami
113
113 [LEFT|RIGHT|FULL] usato con Natural Join o Join e la giunzione esterna nelle tre modalita sinistra,destra o completa.
114
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
115 Altro Esempio Agenti(CodiceAgente,Nome,Zona Supervisore,Commissione) Clienti(CodiceCliente,Nome,Citta,Sconto) Ordini(CodiceOrdine,CodiceCliente,Codic eAgente,Articolo,Data,Ammontare)
116
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
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
118 Le operazioni Insiemistici A UNION B A INTERSECT B A MINUS B
119
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
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
121 Formalizziamo
122
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
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
124 Tabelle Tabelle ::= Tabella [Ide] {, Tabella [Ide]} Tabella::= Ide | Tabella OpInsiem Tabella | Tabella Giunzione Tabella [USING (Attributo{,Attributo})|ON Condizione]
125
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
126 Sintassi Completa del SELECT Select ::= Sottoselect {(UNION|EXCEPT) Sottoselect} [ORDER BY Attributo[DESC] {, Attributo[DESC]} ]
127
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
128 Condizione Condizione ::= Predicato | ( Condizione ) | NOT Condizione | Condizione (AND | OR) Condizione
129
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
130 Espressioni Espr ::= [Ide.] Attributo | Costante | ( Espr ) | [-] Espr [ opa Espr] | (SUM | COUNT | AVG | MAX | MIN) ( [DISTINCT] [Ide.] Attributo) | COUNT ( * ) opa ::= (+ | - | * | / )
131
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} )]]
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.