La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

SQL Structured Query Language Comandi base di DML Rosalba Giugno Rosalba Giugno

Presentazioni simili


Presentazione sul tema: "SQL Structured Query Language Comandi base di DML Rosalba Giugno Rosalba Giugno"— Transcript della presentazione:

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} )]]


Scaricare ppt "SQL Structured Query Language Comandi base di DML Rosalba Giugno Rosalba Giugno"

Presentazioni simili


Annunci Google