Sei sulla pagina 1di 131

SQL

Structured Query
Language
Comandi base di DML

Rosalba Giugno
giugno@dmi.unict.it
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 luso interattivo.
Embedded SQL : per luso allinterno di
linguaggi di programmazione (Ada, C,
COBOL, FORTRAN, PASCAL, PL/1, etc..). I
comandi SQL sono preceduti dalle parole
chiave EXEC SQL
Module SQL: Per scrivere procedure il cui
contenuto e un singolo comando
SQL,compilate separatamente, chiamate
come procedure esterne da programmi.
5
Capacit del comando
SQL SELECT
Selezione
Proiezione
Tabella 1 Tabella 2
Tabella 1 Tabella 1
Join
6
SELECT

SELECT [DISTINCT] Attributi
FROM Tabelle
[WHERE Condizione]
7
Attributi e Tabelle
Attributi ::= * | Attributo {, Attributo}
Tabelle ::= Tabella {, Tabella}

Dove Tabella sta per una determinata
relazione ed Attributo e uno degli
attributi delle tabelle citate nel FROM
8
QUERY SU UNA
TABELLA
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

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

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

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 SQL
I comandi SQL non sono case sensitive.
Possono essere distribuiti in una o pi
righe.
Clausole sono usualmente inserite in
linee separate.
15







Selezionare tutte le
colonne
DEPTNO DNAME LOC
--------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> SELECT *
2 FROM dept;
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
Espressioni Aritmetiche
Creare espressioni attraverso luso di
operatori aritmetici.
Operatore
+
-
*
/
Descrizione
Somma
Sottrazione
Moltiplicazione
Divisione
18

Uso degli operatori
Aritmetici










SQL> SELECT ename, sal, sal+300
2 FROM emp;
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











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










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
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
22










Uso dellAlias




SQL> SELECT ename AS name, sal salary
2 FROM emp;
NAME SALARY
------------- ---------
...
SQL> SELECT ename "Name",
2 sal*12 "Annual Salary"
3 FROM emp;




Name Annual Salary
------------- -------------
...
23
Alias o Correlation
Names
SELECT Professore
FROM CP p, CMV e
WHERE p.Corso = e.Corso AND
Matricola = 123456

Per evitare ambiguita, quando si usano piu
tabelle con lo stesso nome-attributo, si mette il
punto.
24
Alias o Correlation
Names


SELECT c1.Matricola, c2.Matricola
FROM CMV c1, CMV c2
WHERE c1.voto < c2.voto

25








Righe duplicate
Le righe duplicate sono restituite per
default
SQL> SELECT deptno
2 FROM emp;
DEPTNO
---------
10
30
10
20
...
14 rows selected.
26






Eliminazione delle righe
duplicate
E consentito dalluso della parola chiave
DISTINCT nella clausola SELECT
SQL> SELECT DISTINCT deptno
2 FROM emp;
DEPTNO
---------
10
20
30

Restrizioni ed
ordinamento Dati

28
Obiettivi
Al completamento della lezione,
dovreste essere in grado di:
Limitare il numero di righe ottenute da una
query
Riordinare le righe ottenute da una query
29
Esempio
"selezionare
tutti gli impiegati
del dipartimeto 10"







IMPIEGATI
EMPNO ENAME JOB ... DEPTNO

7839 KING PRESIDENT 10
7698 BLAKE MANAGER 30
7782 CLARK MANAGER 10
7566 JONES MANAGER 20
...





IMPIEGATI
EMPNO ENAME JOB ... DEPTNO

7839 KING PRESIDENT 10
7782 CLARK MANAGER 10
7934 MILLER CLERK 10
30


Limitare le righe
selezionate
Limitare le righe tramite luso della
clausola WHERE.



La clausola WHERE segue la clausola
FROM.
SELECT [DISTINCT] {*| colonna [alias], ...}
FROM tabella
[WHERE condizione(i)];
31








Uso della clausola
WHERE
SQL> SELECT ename, job, deptno
2 FROM emp
3 WHERE job='CLERK';
ENAME JOB DEPTNO
---------- --------- ---------
JAMES CLERK 30
SMITH CLERK 20
ADAMS CLERK 20
MILLER CLERK 10
32
Stringhe di caratteri e
Date
Stringhe di caratteri e le date vanno
incluse tra apici.
I caratteri sono case sensitive e le date
sono format sensitive.
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 e {=, =, >, >, <, s}
SottoSelect deve dare come risultato
una tabella con un solo elemento o
vuota (nel qual caso produce il valore
U). Il valore U viene prodotto anche nel
caso che uno degli operandi ha il valore
NULL.
35
Operatori di confronto
Operatore
=
>
>=
<
<=
<>
Significato
Uguale a
pi grande di
maggiore o uguale di
minore di
minore o uguale a
diverso
36




Uso degli Operatori di
Confronto
SQL> SELECT ename, sal, comm
2 FROM emp
3 WHERE sal<=comm;
ENAME SAL COMM
---------- --------- ---------
MARTIN 1250 1400
37
Altri Operatori di
Confronto
Operatore
BETWEEN
...AND...
IN(list)
LIKE
IS NULL
Significato
compreso tra due valori

Corrisp. ad uno dei valori nella lista
Operatore di pattern matching
Valore nullo
38




Uso delloperatore
BETWEEN
ENAME SAL
---------- ---------
MARTIN 1250
TURNER 1500
WARD 1250
ADAMS 1100
MILLER 1300

SQL> SELECT ename, sal
2 FROM emp
3 WHERE sal BETWEEN 1000 AND 1500;
Limite
inferiore
Limite
superiore
BETWEEN consente la selezione di
righe con attributi in un particolare
range.
39
Predicato Between AND
Espr1 [NOT] BETWEEN Espr2 AND
Espr3.

Equivale a
[NOT] Espr2 sEspr1 AND Espr1sEspr3
40




Uso delloperatore IN
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 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.
SQL> SELECT ename
2 FROM emp
3 WHERE ename LIKE 'S%';
42




Uso delloperatore LIKE
Il pattern-matching di caratteri pu essere
combinato.






Iidentificatore ESCAPE (\) deve essere
usato per cercare "%" o "_".
SQL> SELECT ename
2 FROM emp
3 WHERE ename LIKE '_A%';
ENAME
----------
MARTIN
JAMES
WARD
43
Operatori di Match
Attributo [NOT] LIKE Stringa

Dove Stringa puo contenere anche:
_ che fa match con qualunque
carattere
% che fa match con qualunque
sequenza di caratteri
vale U se lattributo e NULL
44
Esempio
SELECT Nome
FROM Studenti
WHERE Indirizzo LIKE Via Etnea %

Fornisce tutti gli studenti che abitano in
Via Etnea
45
Predicati
Espr IS [NOT] NULL

esempio:

SELECT Nome
FROM Studenti
WHERE Telefono IS NOT NULL
46
Operatori Logici
Operatore
AND

OR

NOT
Significato
Restituisce TRUE if entrambe le
condizioni sono TRUE
Restituisce TRUE se almeno una
delle condizioni TRUE
Restituisce TRUE se la condizione
FALSE
47
LOGICA A 3 VALORI
p 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;
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




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




Uso delloperatore NOT
SQL> SELECT ename, job
2 FROM emp
3 WHERE job NOT IN ('CLERK','MANAGER','ANALYST');
ENAME JOB
---------- ---------
KING PRESIDENT
MARTIN SALESMAN
ALLEN SALESMAN
TURNER SALESMAN
WARD SALESMAN
51
Regole di precedenza
Loverride delle regole di precedenza
ottenuto con luso delle parentesi.
Ordine di val. Operatore
1 Tutti gli operatori di
confronto
2 NOT
3 AND
4 OR
52


Regole di precedenza
ENAME JOB SAL
---------- --------- ---------
KING PRESIDENT 5000
MARTIN SALESMAN 1250
ALLEN SALESMAN 1600
TURNER SALESMAN 1500
WARD SALESMAN 1250
SQL> SELECT ename, job, sal
2 FROM emp
3 WHERE job='SALESMAN'
4 OR job='PRESIDENT'
5 AND sal>1500;
53


Regole di precedenza
ENAME JOB SAL
---------- --------- ---------
KING PRESIDENT 5000
ALLEN SALESMAN 1600
Luso delle parentesi forza la priorit
SQL> SELECT ename, job, sal
2 FROM emp
3 WHERE (job='SALESMAN'
4 OR job='PRESIDENT')
5 AND sal>1500;
54
ORDINAMENTO
ORDER BY Attributo [DESC] {, Attributo
[DESC] }
Va posto dopo il WHERE e fa si che il
risultato sia ordinato secondo Attributo
in senso crescente mentre se lo si vuole
decrescente si deve aggiungere DESC
55
Esempio
SELECT e.Corso, e.Voto
FROM Esami e, Studenti s
WHERE e.Matricola = s.Matricola
AND s.Nome = Mario Rossi
ORDER BY Voto DESC
Visualizzare Dati
da pi Tabelle
57
Obiettivi
Al completamento della lezione,
dovreste essere in grado di:
Scrivere comandi SELECT per accedere
a dati da pi tabelle
Vedere dati che generalmente non
soddisfano una condizione di join con
luso delle outer join
Fare la Join di una tabella con se stessa
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.
Ottenere dati da pi Tabelle
IMPIEGATI DIPARTIMENTI
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?
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.colonna
FROM tabella, tabella2
WHERE tabella1.colonna1 = tabella2.colonna2;
60
Prodotto Cartesiano
Il prodotto cartesiano e ottenuto
quando:
Una condizione join e omessa
Una condizione join e non valida
Tutte le righe della prima tabella ammettono
join con tutte le righe della seconda
Per evitare il prodotto cartesiano, includere
sempre condizioni join valida nella clausola
WHERE .
61
Generare un Prodotto
Cartesiano
ENAME DNAME
------ ----------
KING ACCOUNTING
BLAKE ACCOUNTING
...
KING RESEARCH
BLAKE RESEARCH
...
56 rows selected.
IMPIEGATI (14 righe) DIPARTIMENTI (4 righe)
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
Prodotto
Cartesiano:
14*4=56 rows
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 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 Primaria
63









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 delloperatore AND
EMP 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 delloperatore 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
Tabelle
NAME CUSTID
----------- ------
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.
ORDINI
ORDID ITEMID
------ -------
610 3
611 1
612 1
601 1
602 1
...
64 rows selected.
PROD.
67
Join di piu di due
Tabelle

SQL> SELECT *
2 FROM clienti, ordini, prod
3 WHERE clineti.custid=ordini.custid
AND prod.ordid=prod.ordid;
68
Predicati Di
Appartenenza e
Quantificatori
69
CONDIZIONE
Condizione : := Predicato |
(Condizione) | NOT Condizione |
Condizione (AND | OR) Condizione

Il risultato puo essere
TRUE(T),FALSE(F) o UNKOWN(U).
70
Predicati di
Appartenenza
Espr [NOT] IN ( (SottoSelect) | (Valore {,
Valore} ) ).
Vale U se Espr e NULL oppure se
NULL e fra i valori della SottoSelect

SELECT Matricola
FROM Esami
WHERE Voto IN ( 18, 19, 20 )
71
IN o Join?
IN va usato quando e strettamente
necessario e non a posto di giunzioni
SELECT Nome
FROM Studenti
WHERE Matricola IN
(SELECT Matricola
FROM Esami
WHERE Voto>27)
72
Va meglio scritta come
SELECT DISTINCT s.Nome
FROM Studenti s, Esami e
WHERE s.Matricola = e.Matricola AND
Voto > 27
E piu efficiente perche ce un
ottimizzatore che velocizza le join
rispetto alle SottoSelect
73
Predicati Esistenziali
[NOT] EXISTS ( SottoSelect )
E Vero se la SottoSelect non ritorna
linsieme vuoto.
SELECT Nome
FROM Studenti s
WHERE NOT EXISTS
(SELECT *
FROM Esami e, Corsi c
WHERE e.Corso = c.Corso
AND s.Matricola = e.Matricola
AND c.Professore = Ferro)
Nota: nella sottoselect si
puo usare la variabile di
correlazione della select
superiore ma non il
contrario
74
EXISTS o JOIN?
SELECT e.Matricola
FROM Esami e
WHERE EXISTS
(SELECT *
FROM Corsi c
WHERE c.Corso = e.Corso
AND
c.Professore=Ferro)
75
Usando lOttimizzatore
di Join
SELECT e.Matricola
FROM Esami e, Corsi c
WHERE c.Corso = e.Corso
AND c.Professore=Ferro

E piu efficiente.
76
Altri Quantificatori
Espr op (ANY | ALL) (SottoSelect)
op e {=, =, >, >, <, s}
SELECT s.Nome
FROM Studenti s, Esami e
WHERE s.Matricola = e.Matricola AND
e.Voto > ALL
(SELECT DISTINCT f.Voto
FROM Esami f , Studenti t
WHERE f.Matricola = t.Matricola AND
t.Nome = Mario Rossi)

77
Espr = ANY (SottoSelect) equivale a
Espr IN (Sottoselect)

Espr NOT IN (SottoSelect) non equivale
a Espr <> ANY (SottoSelect) ma a Espr
<> All (SottoSelect)
78
Ricordiamo lesempio
Agenti(CodiceAgente,Nome,Zona
Supervisore,Commissione)
Clienti(CodiceCliente,Nome,Citta,Scont
o)
Ordini(CodiceOrdine,CodiceCliente,Cod
iceAgente,Articolo,Data,Ammontare)
79
Quantificatore
Universale
Supponiamo di voler trovare i codici di
quei clienti che hanno fatto ordini a
TUTTI gli agenti di Catania.
Per ogni agente z di Catania esiste un
ordine y del nostro cliente x a z.
z-y y(n,x,z,p,d,a) sse
-z -y y(n,x,z,p,d,a)
80
Tradotta in SQL
SELECT c.CodiceCliente
FROM Clienti c
WHERE NOT EXISTS
(SELECT *
FROM Agenti a
WHERE a.Zona = Catania
AND NOT EXISTS
( SELECT *
FROM Ordini v
WHERE v.CodiceCliente = c.CodiceCliente
AND v.CodiceAgente = a.CodiceAgente) )
Aggregazione dati

82
Obiettivi
Al completamento della lezione,
dovreste essere in grado di:
Identificare le funzioni di
raggruppamento
Descriverne luso
Raggruppare dati usando GROUP BY
Includere ed escludere righe tramite
luso di HAVING
83




















Cosa sono?
Operano su insiemi di righe per dare un
risultato per gruppo.
IMPIEGATI
Salario
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 sono
AVG
COUNT
MAX
MIN
STDDEV
SUM
VARIANCE
87
Uso



SELECT [column,] group_function(column)
FROM table
[WHERE condition]
[GROUP BY column]
[ORDER BY column];
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> SELECT AVG(sal), MAX(sal),
2 MIN(sal), SUM(sal)
3 FROM emp
4 WHERE job LIKE 'SALES%';
89





Uso di MIN e MAX
Possono essere usati su qualsiasi tipo.
SQL> SELECT MIN(hiredate), MAX(hiredate)
2 FROM emp;
MIN(HIRED MAX(HIRED
--------- ---------
17-DEC-80 12-JAN-83
90





Uso di COUNT
COUNT(*)
---------
6
SQL> SELECT COUNT(*)
2 FROM emp
3 WHERE deptno = 30;
COUNT(*) ritorna il numero di righe di
una tabella.
91






















Creare gruppi di dati
IMPIEGATI
salario
medio
in IMPIEGATI
per ogni
dipartimento
2916.6667
2175
1566.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
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.
93
Raggruppamento
GROUP BY Attributo {, Attributo}
[HAVING Condizione]
Va posto dopo WHERE e opera una
partizione delle righe del risultato in
base ad eguali valori su quegli attributi
(NULL incluso). Quindi si produce una
n-upla per ogni classe di equivalenza
che soddisfa la condizione HAVING
94




Uso di GROUP BY
Tutte le colonne della SELECT che
non sono in funzioni di gruppo devono
essere nella GROUP BY.
SQL> SELECT deptno, AVG(sal)
2 FROM emp
3 GROUP BY deptno;
DEPTNO AVG(SAL)
--------- ---------
10 2916.6667
20 2175
30 1566.6667
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












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 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
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
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;
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.
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
Query illegali con
funzioni di raggrup.
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 3000
20 2975
30 1600
30 2850
30 1250
30 950
30 1500
30 1250
DEPTNO MAX(SAL)
--------- ---------
10 5000
20 3000
101


Clausola HAVING
Uso di HAVING per restringere gruppi
Le righe sono raggruppate.
La funzione di raggruppamento e
applicata.
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];
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
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




Funzioni di
raggruppamento
annidate
SQL> 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


Sommario
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];
Ordine di valutazione delle clausole:
WHERE
GROUP BY
HAVING
107
Visualizzare Dati da piu
tabelle (||)
Diversi tipi di Joins
Operatori Insiemistici
108
Tabelle
Tabelle ::= Tabella [Ide] {, Tabella [Ide]}

Tabella::= Ide | Tabella OpInsiem
Tabella | Tabella Giunzione Tabella
[USING (Attributo{,Attributo})|ON
Condizione]
109
Giunzioni ed Operatori
Insiemistici
Giunzione ::=
[CROSS|UNION|NATURAL] [LEFT|
RIGHT | FULL] JOIN
OpInsiem ::= (UNION | INTERSECT |
EXCEPT) [CORRESPONDING [BY (
Attributo {,Attributo}) ] ]
USING e ON solo con JOIN; LEFT,
RIGHT,FULL solo con NATURAL JOIN
e JOIN
110
Ancora su Join ed
Operatori Insiemistici
Cross Join e il prodotto cartesiano
Union Join e lunione esterna cioe si
estendono le due tabelle con le colonne
dellaltra con valori nulli e si fa lunione
delle due stesse tabelle.
111
Ancora sulle Join
Natural Join e quella classica
Join... Using e la natural join sui dati
attributi
JoinOn su quelli che soddisfano una
data condizione
112
Esempi
Natural Join

SELECT
Studenti.Nome,Esami.Corso,Esami.Voto
FROM Esami NATURAL JOIN Studenti

Nome,Corso e Voto degli esami
113
[LEFT|RIGHT|FULL] usato con Natural
Join o Join e la giunzione esterna nelle
tre modalita sinistra,destra o completa.


114
Right Outer Join
Outer Join Operators
Left Outer Join Join
Le righe che
soddisfano la
join
Le righe escluse
dalla join della
tabella a sx
Le righe escluse
dalla join della
tabella a dx
Full outer join
115
Altro Esempio
Agenti(CodiceAgente,Nome,Zona
Supervisore,Commissione)
Clienti(CodiceCliente,Nome,Citta,Sconto)
Ordini(CodiceOrdine,CodiceCliente,Codic
eAgente,Articolo,Data,Ammontare)
116
Esempio di Join On
SELECT
Agenti.CodiceAgente,Ordini.Ammontare
FROM Agenti JOIN Ordini
ON Agenti.Supervisore =
Ordini.CodiceAgente

Codice agente ed ammontare degli ordini dei
supervisori
117
Giunzione Esterna
SELECT
Agenti.CodiceAgente,Ordini.Ammontare
FROM Agenti NATURAL LEFT JOIN
Ordini

Codice agente ed ammontare degli agenti incluso
quelli che non hanno effettuato ordini (avranno
ammontare NULL)
118
Le operazioni
Insiemistici
A UNION B
A INTERSECT B
A MINUS B
119
Le operazioni
Insiemistici
OpInsiem ::= (UNION | INTERSECT |
EXCEPT) [CORRESPONDING [BY (
Attributo {,Attributo}) ] ]
Union,Intersect,Except sono ,,-.
CORRESPONDING fa proiettare sugli
attributi comuni e poi si applica loperatore
insiemistico. Se ce anche BY si specificano
su quali comuni attributi proiettare
120
UNIONE
SELECT *
FROM Clienti UNION
CORRESPONDING Agenti
Fornisce tutti i nomi dei clienti e degli agenti.
In effetti nei sistemi commerciali
sarebbe
SELECT Nome FROM Clienti
UNION
SELECT Nome FROM Agenti
121
Formalizziamo
122
Attributi
Attributi ::= * | Espr [[AS] NuovoNome]
{, Espr [[AS] NuovoNome] }

Espr ::= [Ide.]Attributo | Costante |
( Espr ) | [-] Espr [ Espr] | (SUM |
COUNT |AVG | MAX | MIN) (
[DISTINCT] [Ide.] Attributo ) | COUNT
( * )
::= ( + | - | * | / )
123
Esempio
SELECT AVG(Voto) AS Media Rossi
FROM Esami, Studenti
WHERE Nome = Paolo Rossi AND
Esami.Matricola =
Studenti.Matricola

Media dei voti di Paolo Rossi
124
Tabelle
Tabelle ::= Tabella [Ide] {, Tabella [Ide]}

Tabella::= Ide | Tabella OpInsiem
Tabella | Tabella Giunzione Tabella
[USING (Attributo{,Attributo})|ON
Condizione]
125
Esempi

SELECT Professore
FROM CP,CMV,MNIT
WHERE CP.Corso = CMV.Corso AND
CMV.Matricola = NMIT.Matricola AND
Nome=Paolo Rossi AND Voto > 27
126
Sintassi Completa del
SELECT

Select ::= Sottoselect
{(UNION|EXCEPT) Sottoselect}
[ORDER BY Attributo[DESC]
{, Attributo[DESC]} ]
127
Sottoselect
Sottoselect ::= SELECT [DISTINCT]
(* | Espr[[AS] NewName] {,Espr [[AS]
NewName]})
FROM Tabella [Ide]{,Tabella[Ide]}
[WHERE Condizione]
[GROUP BY Attributo {,Attributo}]
[HAVING Condizione]
128
Condizione

Condizione ::= Predicato |
( Condizione ) |
NOT Condizione |
Condizione (AND | OR) Condizione
129
Predicato
Predicato::= Espr [NOT] IN ( SottoSelect ) |
Espr [NOT] IN ( Valore {,Valore} ) |
Espr opc (Espr | ( SottoSelect ) ) |
Espr IS [NOT] NULL |
Espr opc (ANY | ALL) ( SottoSelect )
|
[NOT] EXISTS ( SottoSelect ) |
Espr [NOT] BETWEEN Espr AND Espr
|
Espr [NOT] LIKE Stringa
opc ::= < | > | s | > | = | =

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