sql structured query language comandi base di dml rosalba giugno [email protected] giugno/ rosalba...
TRANSCRIPT
SQL Structured Query
Language Comandi base di DML
SQL Structured Query
Language Comandi base di DML
Rosalba Giugno
www.dmi.unict.it/~giugno/
Rosalba Giugno
www.dmi.unict.it/~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 l’uso interattivo.
Embedded SQL : per l’uso all’interno 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
Capacità del comando SQL SELECT
SelezioneSelezione ProiezioneProiezione
Tabella 1Tabella 1 Tabella 2Tabella 2
Tabella 1Tabella 1 Tabella 1Tabella 1JoinJoin
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 TABELLANOME MATRICOL INDIRIZZO TELEFONO Mario Rossi 123456 Via Etnea 1 222222 Ugo Bianchi 234567 Via Roma 2 333333 Teo Verdi 345678 Via Enna 3 444444
Vorrei conoscere indirizzo e telefono di Teo Verdi
Via Enna 3 444444
9
Esempi
SELECT Indirizzo, Telefono
FROM Studenti
WHERE Nome=‘Teo Verdi’
NOME MATRICOL INDIRIZZO TELEFONO Mario Rossi 123456 Via Etnea 1 222222 Ugo Bianchi 234567 Via Roma 2 333333 Teo Verdi 345678 Via Enna 3 444444
10
QUERY SU DUE TABELLE
NOME MATRICOL INDIRIZZO TELEFONO Mario Rossi 123456 Via Etnea 1 222222 Ugo Bianchi 234567 Via Roma 2 333333 Teo Verdi 345678 Via Enna 3 444444
CORSO MATRICOLA VOTO Programmazione 345678 27 Architetture 123456 30 Programmazione 234567 18 Matematica Discreta
345678 22
Architettura 345678 30
Quali esami ha superato Mario Rossi?
Architetture
11
Esempi
SELECT Corso
FROM Esami,Studenti
WHERE
Esami.Matricola = Studenti.Matricola AND Nome=‘Mario Rossi’;
12
QUERY SU PIU’ TABELLE
NOME MATRICOL INDIRIZZO TELEFONO Mario Rossi 123456 Via Etnea 1 222222 Ugo Bianchi 234567 Via Roma 2 333333 Teo Verdi 345678 Via Enna 3 444444
CORSO MATRICOLA VOTO Programmazione 345678 27 Architetture 123456 30 Programmazione 234567 18 Matematica Discreta
345678 22
Architettura 345678 30
CORSO PROFESSORE Programmazione Ferro Architetture Pappalardo Matematica Discreta Lizzio
Quali Professori hanno dato piu' di 24 a Teo Verdi ed in quali corsi?
Ferro Programmazione Pappalardo Architetture
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 SQLScrittura 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
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
Selezionare una particolare colonna
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
Espressioni AritmeticheEspressioni AritmeticheCreare espressioni attraverso l’uso di operatori aritmetici.Creare espressioni attraverso l’uso di operatori aritmetici.
Operatore
+
-
*
/
Descrizione
Somma
Sottrazione
Moltiplicazione
Divisione
18
Uso degli operatori Aritmetici
Uso degli operatori Aritmetici
SQL> SELECT ename, sal, sal+300 2 FROM emp;
ENAME SAL exp---------- --------- ---------KING 5000 5300BLAKE 2850 3150CLARK 2450 2750JONES 2975 3275MARTIN 1250 1550ALLEN 1600 1900...14 rows selected.
19
Precedenza OperatoriPrecedenza Operatori
SQL> SELECT ename, sal, 12*sal+100 2 FROM emp;
ENAME SAL exp---------- --------- ----------KING 5000 60100BLAKE 2850 34300CLARK 2450 29500JONES 2975 35800MARTIN 1250 15100ALLEN 1600 19300...14 rows selected.
20
Uso delle parentesiUso delle parentesi
SQL> SELECT ename, sal, 12*(sal+100) 2 FROM emp;
ENAME SAL exp---------- --------- -----------KING 5000 61200BLAKE 2850 35400CLARK 2450 30600JONES 2975 36900MARTIN 1250 16200...14 rows selected.
21
Alias delle colonne Alias delle colonne
Rinominare il nome di una colonnaUtile con dei calcoliDeve seguire immediatamente il nome di
una colonna (SENZA VIRGOLA); può essere usata opzionalmente la parola chiave AS tra il nome della colonna e l’alias.
Richiede doppio apice se l’alias ha degli spazi
Rinominare il nome di una colonnaUtile con dei calcoliDeve seguire immediatamente il nome di
una colonna (SENZA VIRGOLA); può essere usata opzionalmente la parola chiave AS tra il nome della colonna e l’alias.
Richiede doppio apice se l’alias ha degli spazi
22
Uso dell’AliasUso dell’Alias
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 = 123456
Per evitare ambiguita’, quando si usano piu’ tabelle con lo stesso nome-attributo, si mette il punto.
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 duplicateRighe duplicateLe righe duplicate sono restituite per defaultLe righe duplicate sono restituite per defaultSQL> SELECT deptno 2 FROM emp;
SQL> SELECT deptno 2 FROM emp;
DEPTNO--------- 10 30 10 20...14 rows selected.
26
Eliminazione delle righe duplicate
Eliminazione delle righe duplicate
E’ consentito dall’uso della parola chiave E’ consentito dall’uso della parola chiave DISTINCT nella clausola SELECTDISTINCT nella clausola SELECTSQL> SELECT DISTINCT deptno 2 FROM emp;
DEPTNO--------- 10 20 30
Restrizioni ed ordinamento Dati
Restrizioni ed ordinamento Dati
28
ObiettiviObiettivi
Al completamento della lezione, dovreste essere in grado di:Limitare il numero di righe ottenute da una
queryRiordinare le righe ottenute da una query
Al completamento della lezione, dovreste essere in grado di:Limitare il numero di righe ottenute da una
queryRiordinare le righe ottenute da una query
29
EsempioEsempio
"…selezionare "…selezionare tutti gli impiegati tutti gli impiegati
del dipartimeto 10"del dipartimeto 10"
IMPIEGATIIMPIEGATI
EMPNO ENAME JOB ... DEPTNO
7839 KING PRESIDENT 10 7698 BLAKE MANAGER 30 7782 CLARK MANAGER 10 7566 JONES MANAGER 20 ...
IMPIEGATIIMPIEGATI
EMPNO ENAME JOB ... DEPTNO
7839 KING PRESIDENT 10 7782 CLARK MANAGER 10 7934 MILLER CLERK 10
30
Limitare le righe selezionate
Limitare le righe selezionate
Limitare le righe tramite l’uso della clausola WHERE.
La clausola WHERE segue la clausola FROM.
Limitare le righe tramite l’uso della clausola WHERE.
La clausola WHERE segue la clausola FROM.
SELECT [DISTINCT] {*| colonna [alias], ...}FROM tabella[WHERE condizione(i)];
31
Uso della clausola WHEREUso della clausola WHERE
SQL> SELECT ename, job, deptno 2 FROM emp 3 WHERE job='CLERK';
ENAME JOB DEPTNO---------- --------- ---------JAMES CLERK 30SMITH CLERK 20ADAMS CLERK 20MILLER CLERK 10
32
Stringhe di caratteri e Date
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> SELECT ename, job, deptno 2 FROM emp 3 WHERE ename = 'JAMES';
SQL> SELECT ename, job, deptno 2 FROM emp 3 WHERE ename = '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 confrontoOperatori 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
Uso degli Operatori di Confronto
SQL> SELECT ename, sal, comm 2 FROM emp 3 WHERE sal<=comm;
ENAME SAL COMM---------- --------- ---------MARTIN 1250 1400
37
Altri Operatori di Confronto
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 dell’operatore BETWEEN
Uso dell’operatore BETWEEN
ENAME SAL---------- ---------MARTIN 1250TURNER 1500WARD 1250ADAMS 1100MILLER 1300
SQL> SELECT ename, sal 2 FROM emp 3 WHERE sal BETWEEN 1000 AND 1500;
Limiteinferiore
Limitesuperiore
BETWEEN consente la selezione di righe con attributi in un particolare range.
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 Espr1Espr3
40
Uso dell’operatore IN Uso dell’operatore IN E’ usato per selezionare righe che hanno un attributo che assume valori contenuti in una lista.
E’ usato per selezionare righe che hanno un attributo che assume valori contenuti in una lista.
SQL> SELECT empno, ename, sal, mgr 2 FROM emp 3 WHERE mgr 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
Uso dell’operatore LIKEUso dell’operatore 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> SELECT ename 2 FROM emp 3 WHERE ename LIKE 'S%';
42
Uso dell’operatore LIKEUso dell’operatore LIKE Il pattern-matching di caratteri può essere
combinato.
I’identificatore ESCAPE (\) deve essere usato per cercare "%" o "_".
Il pattern-matching di caratteri può essere combinato.
I’identificatore ESCAPE (\) deve essere usato per cercare "%" o "_".
SQL> SELECT ename 2 FROM emp 3 WHERE ename LIKE '_A%';
ENAME---------- MARTINJAMES 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 l’attributo e’ NULL
44
Esempio
SELECT Nome
FROM Studenti
WHERE Indirizzo LIKE “Via Etnea %”
Fornisce tutti gli studenti che abitano in Via Etnea
45
PredicatiEspr IS [NOT] NULL
esempio:
SELECT Nome
FROM Studenti
WHERE Telefono IS NOT NULL
46
Operatori LogiciOperatori 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 VALORIp q p and q P or q not p
T T T T F
T F F T F
T U U T F
F F F F T
F U F U T
U U U U U
U=Unknown;U=Unknown;
48
Uso dell’operatore ANDUso dell’operatore ANDAND AND richiede entrambe le condizionirichiede entrambe le condizioni TRUE. 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
Uso dell’operatore ORUso dell’operatore OROR OR richiede almeno una condizionerichiede almeno una condizione TRUE. TRUE.OR OR richiede almeno una condizionerichiede almeno una condizione TRUE. 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
Uso dell’operatore NOTUso dell’operatore NOT
SQL> SELECT ename, job 2 FROM emp 3 WHERE job NOT IN ('CLERK','MANAGER','ANALYST');
ENAME JOB---------- ---------KING PRESIDENTMARTIN SALESMANALLEN SALESMANTURNER SALESMANWARD SALESMAN
51
Regole di precedenzaRegole di precedenza
L’override delle regole di precedenza è ottenuto con l’uso delle parentesi.L’override delle regole di precedenza è ottenuto con l’uso delle parentesi.
Ordine di val. Operatore
1 Tutti gli operatori diconfronto
2 NOT
3 AND
4 OR
52
Regole di precedenzaRegole di precedenza
ENAME JOB SAL---------- --------- ---------KING PRESIDENT 5000MARTIN SALESMAN 1250ALLEN SALESMAN 1600TURNER SALESMAN 1500WARD SALESMAN 1250
ENAME JOB SAL---------- --------- ---------KING PRESIDENT 5000MARTIN SALESMAN 1250ALLEN SALESMAN 1600TURNER SALESMAN 1500WARD 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 precedenzaRegole di precedenza
ENAME JOB SAL---------- --------- ---------KING PRESIDENT 5000ALLEN SALESMAN 1600
ENAME JOB SAL---------- --------- ---------KING PRESIDENT 5000ALLEN SALESMAN 1600
L’uso delle parentesi forza la prioritàL’uso delle parentesi forza la prioritàL’uso delle parentesi forza la prioritàL’uso 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
Visualizzare Dati da più Tabelle
57
ObiettiviObiettivi
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 l’uso 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 l’uso delle outer join
Fare la Join di una tabella con se stessa
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ù TabelleOttenere dati da più TabelleIMPIEGATIIMPIEGATI DDIPARTIMENTIIPARTIMENTI EMPNO ENAME ... DEPTNO------ ----- ... ------ 7839 KING ... 10 7698 BLAKE ... 30 ... 7934 MILLER ... 10
DEPTNO DNAME LOC ------ ---------- -------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON
59
Cosa è una Join?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.
SELECT tabella1.colonna, tabella2.colonnaFROM tabella, tabella2WHERE tabella1.colonna1 = tabella2.colonna2;
SELECT tabella1.colonna, tabella2.colonnaFROM tabella, tabella2WHERE tabella1.colonna1 = tabella2.colonna2;
60
Prodotto CartesianoProdotto Cartesiano
Il prodotto cartesiano e’ ottenuto quando:
Una condizione join e’ omessaUna condizione join e’ non validaTutte le righe della prima tabella ammettono
join con tutte le righe della secondaPer evitare il prodotto cartesiano, includere
sempre condizioni join valida nella clausola WHERE .
Il prodotto cartesiano e’ ottenuto quando:
Una condizione join e’ omessaUna condizione join e’ non validaTutte le righe della prima tabella ammettono
join con tutte le righe della secondaPer evitare il prodotto cartesiano, includere
sempre condizioni join valida nella clausola WHERE .
61
Generare un Prodotto CartesianoGenerare un Prodotto Cartesiano
ENAME DNAME------ ----------KING ACCOUNTINGBLAKE ACCOUNTING ...KING RESEARCHBLAKE RESEARCH...56 rows selected.
ENAME DNAME------ ----------KING ACCOUNTINGBLAKE ACCOUNTING ...KING RESEARCHBLAKE RESEARCH...56 rows selected.
IMPIEGATI (14 righe) IMPIEGATI (14 righe) DIPARTIMENTI (4 righe) DIPARTIMENTI (4 righe)
EMPNO ENAME ... DEPTNO------ ----- ... ------ 7839 KING ... 10 7698 BLAKE ... 30 ... 7934 MILLER ... 10
EMPNO ENAME ... DEPTNO------ ----- ... ------ 7839 KING ... 10 7698 BLAKE ... 30 ... 7934 MILLER ... 10
DEPTNO DNAME LOC ------ ---------- -------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON
DEPTNO DNAME LOC ------ ---------- -------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON
““ProdottoProdottoCartesiano: Cartesiano:
14*4=56 rows”14*4=56 rows”
62
Cosa e’ una Equijoin?Cosa e’ una Equijoin?IMPIEGATI IMPIEGATI DIPARTIMENTI 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 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 30 SALES CHICAGO 30 SALES CHICAGO 30 SALES CHICAGO 30 SALES CHICAGO 20 RESEARCH DALLAS 20 RESEARCH DALLAS...14 rows selected.
Chiave Straniera Chiave Straniera Chiave PrimariaChiave Primaria
63
Estrarre Record con Equijoin
Estrarre Record con Equijoin
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 10 10 NEW YORK 7698 BLAKE 30 30 CHICAGO 7782 CLARK 10 10 NEW YORK 7566 JONES 20 20 DALLAS...14 rows selected.
64
Condizioni di Ricerca addizioli
Uso dell’operatore AND
Condizioni di Ricerca addizioli
Uso dell’operatore ANDEMP EMP DEPT DEPT 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 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 30 SALES CHICAGO 30 SALES CHICAGO 30 SALES CHICAGO 30 SALES CHICAGO 20 RESEARCH DALLAS 20 RESEARCH DALLAS...14 rows selected.
65
Condizioni di Ricerca Uso dell’operatore AND
Condizioni di Ricerca Uso dell’operatore AND
SQL> SELECT emp.empno, emp.ename, emp.deptno, 2 dept.deptno, dept.loc 3 FROM emp, dept 4 WHERE emp.deptno=dept.deptno AND ENAME=‘KING’;
66
Join di piu’ di due TabelleJoin di piu’ di due Tabelle
NAME CUSTID----------- ------JOCKSPORTS 100TKB SPORT SHOP 101VOLLYRITE 102JUST TENNIS 103K+T SPORTS 105SHAPE UP 106WOMENS SPORTS 107... ...9 rows selected.
NAME CUSTID----------- ------JOCKSPORTS 100TKB SPORT SHOP 101VOLLYRITE 102JUST TENNIS 103K+T SPORTS 105SHAPE UP 106WOMENS SPORTS 107... ...9 rows selected.
CLIENTI 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.
ORDINIORDINI
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. PROD.
67
Join di piu’ di due TabelleJoin 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’ c’e’ un ottimizzatore che velocizza le join rispetto alle SottoSelect
73
Predicati Esistenziali[NOT] EXISTS “(“ SottoSelect “)”
E’ Vero se la SottoSelect non ritorna l’insieme 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
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 l’Ottimizzatore 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 l’esempio
Agenti(CodiceAgente,Nome,Zona Supervisore,Commissione)
Clienti(CodiceCliente,Nome,Citta’,Sconto)
Ordini(CodiceOrdine,CodiceCliente,CodiceAgente,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.
zy 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 datiAggregazione dati
82
ObiettiviObiettivi
Al completamento della lezione, dovreste essere in grado di: Identificare le funzioni di
raggruppamentoDescriverne l’usoRaggruppare dati usando GROUP BY Includere ed escludere righe tramite
l’uso di HAVING
Al completamento della lezione, dovreste essere in grado di: Identificare le funzioni di
raggruppamentoDescriverne l’usoRaggruppare dati usando GROUP BY Includere ed escludere righe tramite
l’uso di HAVING
83
Cosa sono?Cosa sono?Operano su insiemi di righe per dare un risultato per gruppo.Operano su insiemi di righe per dare un risultato per gruppo.
IMPIEGATIIMPIEGATI
““SalarioSalarioMassimo”Massimo”
DEPTNO SAL--------- --------- 10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 30 1500 30 1250
MAX(SAL)
---------
5000
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 = ‘123456’
SELECT COUNT(*)
FROM Esami
WHERE Corso = ‘Database 1’
86
Quali sonoQuali sono
AVG COUNT MAXMIN STDDEV SUMVARIANCE
AVG COUNT MAXMIN STDDEV SUMVARIANCE
87
UsoUso
SELECT [column,] group_function(column)FROM table[WHERE condition][GROUP BY column][ORDER BY column];
88
Uso di AVG e SUMUso di AVG e SUM
AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL)-------- --------- --------- --------- 1400 1600 1250 5600
Possono essere usati su dati numerici.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%';
89
Uso di MIN e MAXUso di MIN e MAX
Possono essere usati su qualsiasi tipo.Possono essere usati su qualsiasi tipo.
SQL> SELECT MIN(hiredate), MAX(hiredate) 2 FROM emp;
MIN(HIRED MAX(HIRED--------- ---------17-DEC-80 12-JAN-83
90
Uso di COUNTUso di COUNT
COUNT(*)--------- 6
SQL> SELECT COUNT(*) 2 FROM emp 3 WHERE deptno = 30;
COUNT(*) ritorna il numero di righe di una tabella.COUNT(*) ritorna il numero di righe di una tabella.
91
Creare gruppi di datiCreare gruppi di datiIMPIEGATIIMPIEGATI
““salariosalariomedio medio
in IMPIEGATIin IMPIEGATIper ogniper ogni
dipartimento”dipartimento”
2916.66672916.6667
21752175
1566.66671566.6667
DEPTNO SAL--------- --------- 10 2450 10 5000 10 1300 20 800 20 1100 20 3000 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
Creare gruppi tramite: GROUP BY
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.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 BYUso di GROUP BYTutte le colonne della SELECT che non sono in funzioni di gruppo devono essere nella 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
Uso GROUP BYUso GROUP BY
La colonna di GROUP BY non deve essere necessariamente nella SELECT.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 21751566.6667
96
Raggruppare piu’ di una colonna
Raggruppare piu’ di una colonnaIMPIEGATIIMPIEGATI
““sommare I salari sommare I salari in IMPIEGATIin IMPIEGATI
per ongi lavoro, per ongi lavoro, RagruppatiRagruppati
per dipartimeno”per dipartimeno”
DEPTNO JOB SAL
--------- --------- ---------
10 MANAGER 2450
10 PRESIDENT 5000
10 CLERK 1300
20 CLERK 800
20 CLERK 1100
20 ANALYST 3000
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
10
10
20
20
20
30
30
30
97
Uso di GROUP BY su colonne multiple
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
Query illegali con funzioni di raggruppamento
Query illegali con funzioni di raggruppamento
Ogni colonna o espressione della SELECT che non e’ argomento di funzioni di deve essere nella GROUP BY.
Ogni colonna o espressione della SELECT che non e’ argomento di funzioni di deve essere nella GROUP BY.
SQL> SELECT deptno, COUNT(ename) 2 FROM emp;
SQL> SELECT deptno, COUNT(ename) 2 FROM emp;
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) > 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.
Query illegali con funzioni di raggrup.
100
Escludere gruppi di ris.Escludere gruppi di ris.
““salariosalariomassimo massimo
per dipartmentoper dipartmentomaggiore dimaggiore di
$2900”$2900”
IMPIEGATIIMPIEGATI
50005000
30003000
28502850
DEPTNO SAL
--------- ---------
10 2450
10 5000
10 1300
20 800
20 1100
20 3000
20 3000
20 2975
30 1600
30 2850
30 1250
30 950
30 1500
30 1250
DEPTNO MAX(SAL)
--------- ---------
10 5000
20 3000
101
Clausola HAVINGClausola HAVING
Uso di HAVING per restringere gruppiLe righe sono raggruppate.La funzione di raggruppamento e’
applicata.
Uso di HAVING per restringere gruppiLe righe sono raggruppate.La funzione di raggruppamento e’
applicata.
SELECT column, group_functionFROM table[WHERE condition][GROUP BY group_by_expression][HAVING group_condition][ORDER BY column];
102
Uso di HAVINGUso 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
Uso di HAVINGUso 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 6000MANAGER 8275
5 HAVING SUM(sal)>5000
104
Funzioni di raggruppamento
annidate
Funzioni di raggruppamento
annidateSQL> SELECT max(avg(sal)) 2 FROM emp 3 GROUP BY deptno;
MAX(AVG(SAL))------------- 2916.6667
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
SommarioSommarioSELECT column, group_function(column)FROM table[WHERE condition][GROUP BY group_by_expression][HAVING group_condition][ORDER BY column];
Ordine di valutazione delle clausole:WHEREGROUP BYHAVING
Ordine di valutazione delle clausole:WHEREGROUP BYHAVING
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’ l’unione esterna cioe’ si estendono le due tabelle con le colonne dell’altra con valori nulli e si fa l’unione 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,CodiceAgente,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 l’operatore insiemistico. Se c’e’ anche BY si specificano su quali comuni attributi proiettare
120
UNIONESELECT *
FROM Clienti UNION CORRESPONDING AgentiFornisce 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
AttributiAttributi ::= * | 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} “)”]]