Sei sulla pagina 1di 130

SQL

per l’interrogazione
di basi di dati
Breve storia dell’SQL
 SQL: Structured Query Language
 SQL sviluppato alla IBM nel 1973
 Dal 1983 standard de facto
 Primo standard nel 1986 rivisto nel 1989 (SQL-89)
 Secondo standard nel 1992 (SQL-2 o SQL-92)
 Terzo standard nel 1999 (SQL-3 o SQL-99)
 Quasi tutti i DBMS commerciali adottano lo standard SQL piu’ estensioni
proprie (non-standard)
 Alcuni sistemi commerciali
 Oracle, Informix, Sybase, DB2, SQL-Server, etc.
 Alcuni sistemi open-source:
 MySQL, Postgres
 Esistono sistemi commerciali che utilizzano interfacce tipo QBE (Query by
Example): ACCESS
 Tuttavia hanno sistemi per la traduzione automatica in SQL

DB - SQL per interrogazione basi di dati 2


Standard SQL-92
 E’ utilizzato, nel DML (Data Manipulation
Language), dai principali DBMS
relazionali. Mentre per il DDL (Data
Definition Language) ci sono variazioni
significative.
 Prevede 3 livelli di linguaggio, di
complessita’ crescente: Entry SQL,
Intermediate SQL, Full SQL

DB - SQL per interrogazione basi di dati 3


Capacità del comando SELECT
Selezione Proiezione

Tabella 1 Tabella 1
Join

Tabella 1 Tabella 2
DB - SQL per interrogazione basi di dati 4
SELECT
 SELECT [DISTINCT] EsprAttributi
FROM Tabelle
[WHERE Condizione]
 La query
1. considera il prodotto cartesiano tra le Tabelle
2. fra queste seleziona solo le righe che soddisfano Condizione
3. e infine valuta le espressioni specificate in EsprAttributi
(chiamata anche “Target List”)
 La SELECT implementa gli operatori Ridenominazione
Proiezione, Selezione e Join dell’algebra relazionale
 Piu’ altro che vedremo piu’ avanti

DB - SQL per interrogazione basi di dati 5


Attributi e Tabelle
 EsprAttributi ::= * | EsprAttributo {, EsprAttributo}
 Tabelle ::= Tabella {, Tabella}

 Dove Tabella sta per una determinata relazione


ed EsprAttributo e’ un’espressione basata su
degli attributi delle tabelle citate nel FROM

DB - SQL per interrogazione basi di dati 6


Esempio 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

DB - SQL per interrogazione basi di dati 7


Esempio 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

 SELECT Indirizzo, Telefono


FROM Studenti
WHERE Nome=‘Teo Verdi’
DB - SQL per interrogazione basi di dati 8
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 Quali esami ha
Matematica 345678 22 superato Mario Rossi?
Discreta
Architettura 345678 30
Architetture

DB - SQL per interrogazione basi di dati 9


Esempio di JOIN
 SELECT Corso
FROM Esami,Studenti
WHERE Esami.Matricola = Studenti.Matricola
AND Nome=‘Mario Rossi’;

DB - SQL per interrogazione basi di dati 10


Query su piu’ tabelle (JOIN)
Studenti
NOME MATRICOL INDIRIZZO TELEFONO
Mario Rossi 123456 Via Etnea 1 222222 Esami
Ugo Bianchi 234567 Via Roma 2 333333 CORSO MATRICOLA VOTO
Teo Verdi 345678 Via Enna 3 444444 Programmazione 345678 27
Architetture 123456 30
Programmazione 234567 18
Matematica 345678 22
Discreta
Architettura 345678 30

Corsi
CORSO PROFESSORE
Programmazione Ferro
Architetture
Matematica Discreta
Pappalardo
Lizzio
Quali Professori hanno
dato piu' di 24 a Teo
Ferro Programmazione Verdi ed in quali corsi?
Pappalardo Architetture

DB - SQL per interrogazione basi di dati 11


Esempio di JOIN su tre tabelle
 Quali professori hanno dato piu’ di 24 a
Verdi ed in quali corsi?
 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

DB - SQL per interrogazione basi di dati 12


Scrittura Comandi SQL
 I comandi SQL non sono case sensitive
 Possono essere distribuiti in una o più righe
 Clausole diverse sono usualmente inserite in linee
separate
 Per convenzione si usa scrivere i costrutti SQL in
maiuscolo
 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

DB - SQL per interrogazione basi di dati 13


Selezionare tutte le colonne
SQL> SELECT *
2 FROM dept;

DEPTNO DNAME LOC


--------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

DB - SQL per interrogazione basi di dati 14


Selezionare certe colonne
SQL> SELECT deptno, loc
2 FROM dept;

DEPTNO LOC
--------- -------------
10 NEW YORK
20 DALLAS
30 CHICAGO
40 BOSTON

DEPTNO DNAME LOC


--------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
DB - SQL per interrogazione basi di dati 15
Selezione colonne
 L’interpretazione algebrica delle variabili
del SELECT e’ l’operatore  (Proiezione)
dell’algebra relazionale
 Con la variante ‘*’ che in Algebra
relazionale corrisponde alla non-
applicazione del 

DB - SQL per interrogazione basi di dati 16


Espressioni aritmetiche nel SELECT
 Creare espressioni attraverso l’uso di
operatori aritmetici

Operatore Descrizione

+ Somma

- Sottrazione

* Moltiplicazione

/ Divisione

DB - SQL per interrogazione basi di dati 17


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.

DB - SQL per interrogazione basi di dati 18


Precedenza operatori aritmetici
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.

DB - SQL per interrogazione basi di dati 19


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.

DB - SQL per interrogazione basi di dati 20


Alias delle colonne
 Ridenominare il nome di una colonna
 Operatore  (Ridenominazione) dell’algebra
relazionale
 Deve 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

DB - SQL per interrogazione basi di dati 21


Uso 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


------------- -------------
...

DB - SQL per interrogazione basi di dati 22


Alias di tabelle (Correlation Names)
 SELECT Professore
FROM Corsi c, Esami e
WHERE c.Corso = e.Corso AND
Matricola = 123456

 Per evitare ambiguità, colonne con lo stesso nome su tabelle


diverse devono essere specializzate tramite l’alias delle tabelle
 SELECT Professore, c.Corso
FROM Corsi c, Esami e
WHERE c.Corso = e.Corso AND Matricola =
123456
 In caso contrario l’SQL restituisce errore

DB - SQL per interrogazione basi di dati 23


Self JOIN
 Alias necessario per self-join
 SELECT s1.Matricola, s2.Matricola
FROM Studenti s1, Studenti s2
WHERE s1.matricola <> s2.matricola
 Cosa fa?

DB - SQL per interrogazione basi di dati 24


Righe duplicate
 Le righe duplicate sono restituite per
default
SQL> SELECT deptno
2 FROM emp;

DEPTNO
---------
10
30
10
20
...
14 rows selected.

DB - SQL per interrogazione basi di dati 25


Eliminazione delle righe duplicate
E’ consentito dall’uso della parola chiave
DISTINCT nella clausola SELECT
SQL> SELECT DISTINCT deptno
2 FROM emp;

DEPTNO
---------
10
20
30

DB - SQL per interrogazione basi di dati 26


Restrizioni ed
ordinamento Dati
Esempio
IMPIEGATI
EMPNO ENAME JOB ... DEPTNO "…selezionare
tutti gli impiegati
7839 KING PRESIDENT 10 del dipartimeto 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

DB - SQL per interrogazione basi di dati 28


Limitare le righe selezionate
 Limitare le righe tramite l’uso della clausola
WHERE.
 Corrisponde operatore  (Restrizione) dell’algebra
relazionale
SELECT [DISTINCT] {*| colonna [alias], ...}
FROM tabella
[WHERE condizione(i)];

 La clausola WHERE segue la clausola FROM


 E’ opzionale

DB - SQL per interrogazione basi di dati 29


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

DB - SQL per interrogazione basi di dati 30


Stringhe di caratteri e Date

 Stringhe di caratteri e 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';

DB - SQL per interrogazione basi di dati 31


Condizione

 Condizione : := Predicato |
“(“Condizione”)” | NOT Condizione |
Condizione (AND | OR) Condizione

 Il risultato puo’ essere TRUE(T),FALSE(F)


o UNKOWN(U).

DB - SQL per interrogazione basi di dati 32


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.

DB - SQL per interrogazione basi di dati 33


Operatori di confronto
Operatore Significato

= Uguale a

> più grande di

>= maggiore o uguale di

< minore di

<= minore o uguale a

<> diverso

DB - SQL per interrogazione basi di dati 34


Uso degli Operatori di Confronto

SQL> SELECT ename, sal, comm


2 FROM emp
3 WHERE sal<=comm;

ENAME SAL COMM


---------- --------- ---------
MARTIN 1250 1400

DB - SQL per interrogazione basi di dati 35


Altri Operatori di Confronto
Operatore Significato

BETWEEN compreso tra due valori


...AND...

IN(list) Corrisp. ad uno dei valori nella lista

LIKE Operatore di pattern matching

IS NULL Valore nullo

DB - SQL per interrogazione basi di dati 36


Uso dell’operatore BETWEEN
 BETWEEN consente la selezione di
righe con attributi in un particolare
range.
SQL> SELECT ename, sal
2 FROM emp
3 WHERE sal BETWEEN 1000 AND 1500;

ENAME SAL Limite Limite


---------- --------- inferiore superiore
MARTIN 1250
TURNER 1500
WARD 1250
ADAMS 1100
MILLER 1300
DB - SQL per interrogazione basi di dati 37
Predicato BETWEEN
 Espr1 [NOT] BETWEEN Espr2 AND
Espr3.

 Equivale a
 [NOT] Espr2 Espr1 AND Espr1Espr3

DB - SQL per interrogazione basi di dati 38


Uso dell’operatore 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

DB - SQL per interrogazione basi di dati 39


Uso 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.

SQL> SELECT ename


2 FROM emp
3 WHERE ename LIKE 'S%';

DB - SQL per interrogazione basi di dati 40


Uso dell’operatore LIKE
 Il
pattern-matching di caratteri può essere
combinato.
SQL> SELECT ename
2 FROM emp
3 WHERE ename LIKE '_A%';

ENAME
----------
MARTIN
JAMES
WARD

 I’identificatore
ESCAPE (\) deve essere
usato per cercare "%" o "_".
DB - SQL per interrogazione basi di dati 41
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

DB - SQL per interrogazione basi di dati 42


Esempio
 SELECT Nome
FROM Studenti
WHERE Indirizzo LIKE “Via Etnea %”

 Restituisce tutti gli studenti che abitano in Via


Etnea

DB - SQL per interrogazione basi di dati 43


Predicati
 Espr IS [NOT] NULL

 esempio:
 SELECTNome
FROM Studenti
WHERE Telefono IS NOT NULL

DB - SQL per interrogazione basi di dati 44


Operatori Logici
Operatore Significato

AND Restituisce TRUE if entrambe le


condizioni sono TRUE
OR Restituisce TRUE se almeno una
delle condizioni è TRUE

NOT Restituisce TRUE se la condizione è


FALSE

DB - SQL per interrogazione basi di dati 45


Logica a tre 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;
DB - SQL per interrogazione basi di dati 46
Uso dell’operatore 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

DB - SQL per interrogazione basi di dati 47


Uso dell’operatore 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.

DB - SQL per interrogazione basi di dati 48


Uso dell’operatore 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

DB - SQL per interrogazione basi di dati 49


Regole di precedenza
Ordine di val. Operatore
1 Tutti gli operatori di
confronto
2 NOT
3 AND
4 OR

 La precedenza puo’ essere


controllata tramite il normale uso di
parentesi
DB - SQL per interrogazione basi di dati 50
Regole di precedenza
SQL> SELECT ename, job, sal
2 FROM emp
3 WHERE job='SALESMAN'
4 OR job='PRESIDENT'
5 AND sal>1500;

ENAME JOB SAL


---------- --------- ---------
KING PRESIDENT 5000
MARTIN SALESMAN 1250
ALLEN SALESMAN 1600
TURNER SALESMAN 1500
WARD SALESMAN 1250

DB - SQL per interrogazione basi di dati 51


Regole di precedenza
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;

ENAME JOB SAL


---------- --------- ---------
KING PRESIDENT 5000
ALLEN SALESMAN 1600

DB - SQL per interrogazione basi di dati 52


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

DB - SQL per interrogazione basi di dati 53


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

DB - SQL per interrogazione basi di dati 54


Visualizzare Dati
da più Tabelle
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
l’uso delle outer join
 Fare la Join di una tabella con se stessa

DB - SQL per interrogazione basi di dati 56


Ottenere dati da più Tabelle
IMPIEGATI DIPARTIMENTI
EMPNO ENAME ... DEPTNO DEPTNO DNAME LOC
------ ----- ... ------ ------ ---------- --------
7839 KING ... 10 10 ACCOUNTING NEW YORK
7698 BLAKE ... 30 20 RESEARCH DALLAS
... 30 SALES CHICAGO
7934 MILLER ... 10 40 OPERATIONS BOSTON

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.

DB - SQL per interrogazione basi di dati 57


Cosa è una Join?
 La join viene usata per effettuare
query su più tabelle.
SELECT tabella1.colonna, tabella2.colonna
FROM tabella, tabella2
WHERE tabella1.colonna1 = tabella2.colonna2;

 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.

DB - SQL per interrogazione basi di dati 58


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 .
DB - SQL per interrogazione basi di dati 59
Generare un Prodotto Cartesiano
IMPIEGATI (14 righe) DIPARTIMENTI (4 righe)
EMPNO ENAME ... DEPTNO DEPTNO DNAME LOC
------ ----- ... ------ ------ ---------- --------
7839 KING ... 10 10 ACCOUNTING NEW YORK
7698 BLAKE ... 30 20 RESEARCH DALLAS
... 30 SALES CHICAGO
7934 MILLER ... 10 40 OPERATIONS BOSTON

ENAME DNAME
------ ----------
KING ACCOUNTING
“Prodotto BLAKE ACCOUNTING
Cartesiano: ...
KING RESEARCH
14*4=56 rows” BLAKE RESEARCH
...
56 rows selected.

DB - SQL per interrogazione basi di dati 60


Cosa e’ una Equijoin?
IMPIEGATI DIPARTIMENTI
EMPNO ENAME DEPTNO DEPTNO DNAME LOC
------ ------- ------- ------- ---------- --------
7839 KING 10 10 ACCOUNTING NEW YORK
7698 BLAKE 30 30 SALES CHICAGO
7782 CLARK 10 10 ACCOUNTING NEW YORK
7566 JONES 20 20 RESEARCH DALLAS
7654 MARTIN 30 30 SALES CHICAGO
7499 ALLEN 30 30 SALES CHICAGO
7844 TURNER 30 30 SALES CHICAGO
7900 JAMES 30 30 SALES CHICAGO
7521 WARD 30 30 SALES CHICAGO
7902 FORD 20 20 RESEARCH DALLAS
7369 SMITH 20 20 RESEARCH DALLAS
... ...
14 rows selected. 14 rows selected.

Chiave Straniera Chiave Primaria

DB - SQL per interrogazione basi di dati 61


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.

DB - SQL per interrogazione basi di dati 62


Condizioni di Ricerca addizionali
Uso dell’operatore AND
EMP DEPT
EMPNO ENAME DEPTNO DEPTNO DNAME LOC
------ ------- ------- ------ --------- --------
7839 KING 10 10 ACCOUNTING NEW YORK
7698 BLAKE 30 30 SALES CHICAGO
7782 CLARK 10 10 ACCOUNTING NEW YORK
7566 JONES 20 20 RESEARCH DALLAS
7654 MARTIN 30 30 SALES CHICAGO
7499 ALLEN 30 30 SALES CHICAGO
7844 TURNER 30 30 SALES CHICAGO
7900 JAMES 30 30 SALES CHICAGO
7521 WARD 30 30 SALES CHICAGO
7902 FORD 20 20 RESEARCH DALLAS
7369 SMITH 20 20 RESEARCH DALLAS
... ...
14 rows selected. 14 rows selected.

DB - SQL per interrogazione basi di dati 63


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’;

DB - SQL per interrogazione basi di dati 64


Join di piu’ di due Tabelle
CLIENTI ORDINI
NAME CUSTID CUSTID ORDID
----------- ------ ------- -------
JOCKSPORTS 100 101 610
TKB SPORT SHOP 101 102 611
VOLLYRITE 102 104 612
JUST TENNIS 103 106 601
K+T SPORTS 105 102 602 PROD.
SHAPE UP 106 106 604
ORDID ITEMID
WOMENS SPORTS 107 106 605
------ -------
... ... ...
610 3
9 rows selected. 21 rows selected.
611 1
612 1
601 1
602 1
...
64 rows selected.

DB - SQL per interrogazione basi di dati 65


Join di piu’ di due Tabelle

SQL> SELECT *
2 FROM clienti, ordini, prod
3 WHERE clienti.custid=ordini.custid
AND prod.ordid=prod.ordid;

DB - SQL per interrogazione basi di dati 66


Predicati Di Appartenenza e
Quantificatori

DB - SQL per interrogazione basi di dati 67


Condizione
 Condizione : := Predicato |
“(“Condizione”)” | NOT Condizione |
Condizione (AND | OR) Condizione

 Il risultato puo’ essere TRUE(T),FALSE(F)


o UNKOWN(U).

DB - SQL per interrogazione basi di dati 68


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 )

DB - SQL per interrogazione basi di dati 69


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)

DB - SQL per interrogazione basi di dati 70


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

DB - SQL per interrogazione basi di dati 71


Predicati Esistenziali
 [NOT] EXISTS “(“ SottoSelect “)”
 E’ Vero se la SottoSelect non ritorna l’insieme vuoto.
SELECT Nome
FROM Studenti s
WHERE NOT EXISTS
Nota: nella sottoselect si
(SELECT *
puo’ usare la variabile di
FROM Esami e, Corsi c correlazione della select
WHERE e.Corso = c.Corso superiore ma non il
AND s.Matricola = e.Matricola contrario
AND c.Professore = “Giuffrida”)

DB - SQL per interrogazione basi di dati 72


EXISTS o JOIN?
SELECT e.Matricola
FROM Esami e
WHERE EXISTS
(SELECT *
FROM Corsi c
WHERE c.Corso = e.Corso
AND c.Professore=‘Giuffrida’)

DB - SQL per interrogazione basi di dati 73


Usando l’Ottimizzatore di Join
SELECT e.Matricola
FROM Esami e, Corsi c
WHERE c.Corso = e.Corso
AND c.Professore=‘Giuffrida’

 E’ piu’ efficiente.

DB - SQL per interrogazione basi di dati 74


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’)

DB - SQL per interrogazione basi di dati 75


Altri quantificatori
 Espr = ANY (SottoSelect) equivale a Espr
IN (Sottoselect)

 Espr NOT IN (SottoSelect) non equivale a


Espr <> ANY (SottoSelect) ma a Espr <>
All (SottoSelect)

DB - SQL per interrogazione basi di dati 76


Ricordiamo l’esempio
 Agenti(CodiceAgente,Nome,Zona
Supervisore,Commissione)
 Clienti(CodiceCliente,Nome,Citta’,Sconto)
 Ordini(CodiceOrdine,CodiceCliente,Codic
eAgente,Articolo,Data,Ammontare)

DB - SQL per interrogazione basi di dati 77


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)

DB - SQL per interrogazione basi di dati 78


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

DB - SQL per interrogazione basi di dati 79


Aggregazione dati
Obiettivi

 Al completamento della lezione,


dovreste essere in grado di:
 Identificarele funzioni di
raggruppamento
 Descriverne l’uso
 Raggruppare dati usando GROUP BY
 Includere ed escludere righe tramite
l’uso di HAVING
DB - SQL per interrogazione basi di dati 81
Cosa sono?
 Operano su insiemi di righe per dare un
risultato per gruppo.
IMPIEGATI
DEPTNO SAL
--------- ---------
10 2450
10 5000
10 1300
20 800
20 1100
20 3000 “Salario MAX(SAL)
20 3000 Massimo” ---------
20 2975 5000
30 1600
30 2850
30 1250
30 950
30 1500
30 1250

DB - SQL per interrogazione basi di dati 82


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

DB - SQL per interrogazione basi di dati 83


Esempi
 SELECT MIN(Voto),MAX(Voto),AVG(Voto)
FROM Esami
WHERE Matricola = ‘123456’

 SELECT COUNT(*)
FROM Esami
WHERE Corso = ‘Database 1’

DB - SQL per interrogazione basi di dati 84


Quali sono
 AVG
 COUNT
 MAX
 MIN
 STDDEV
 SUM
 VARIANCE

DB - SQL per interrogazione basi di dati 85


Uso

SELECT [column,] group_function(column)


FROM table
[WHERE condition]
[GROUP BY column]
[ORDER BY column];

DB - SQL per interrogazione basi di dati 86


Uso di AVG e SUM
 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%';

AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL)


-------- --------- --------- ---------
1400 1600 1250 5600

DB - SQL per interrogazione basi di dati 87


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

DB - SQL per interrogazione basi di dati 88


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

COUNT(*)
---------
6

DB - SQL per interrogazione basi di dati 89


Creare gruppi di dati
IMPIEGATI
DEPTNO SAL
--------- ---------
10 2450
10 5000 2916.6667
10 1300
20 800 “salario DEPTNO AVG(SAL)
20 1100 medio
------- ---------
20 3000 2175in IMPIEGATI
20 3000 per ogni 10 2916.6667
20 2975 dipartimento” 20 2175
30 1600
30 1566.6667
30 2850
30 1250 1566.6667
30 950
30 1500
30 1250

DB - SQL per interrogazione basi di dati 90


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.

DB - SQL per interrogazione basi di dati 91


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

DB - SQL per interrogazione basi di dati 92


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

DB - SQL per interrogazione basi di dati 93


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

DB - SQL per interrogazione basi di dati 94


Raggruppare piu’ di una colonna
IMPIEGATI
DEPTNO JOB SAL
--------- --------- ---------
10 MANAGER 2450
DEPTNO JOB SUM(SAL)
10 PRESIDENT 5000
-------- --------- ---------
10 CLERK 1300
10 CLERK 1300
20 CLERK 800 “sommare I salari
10 MANAGER 2450
20 CLERK 1100 in IMPIEGATI
10 PRESIDENT 5000
20 ANALYST 3000 per ogni lavoro,
20 ANALYST 6000
20 ANALYST 3000 Ragruppati
20 CLERK 1900
20 MANAGER 2975 per dipartimeno”
20 MANAGER 2975
30 SALESMAN 1600
30 CLERK 950
30 MANAGER 2850
30 MANAGER 2850
30 SALESMAN 1250
30 SALESMAN 5600
30 CLERK 950
30 SALESMAN 1500
30 SALESMAN 1250

DB - SQL per interrogazione basi di dati 95


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.

DB - SQL per interrogazione basi di dati 96


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

DB - SQL per interrogazione basi di dati 97


Query illegali con funzioni di raggrup.

 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

DB - SQL per interrogazione basi di dati 98


Escludere gruppi
IMPIEGATI
DEPTNO SAL
--------- ---------
10 2450
10 5000 5000
10 1300
20 800
20 1100 “salario DEPTNO MAX(SAL)
20 3000 massimo --------- ---------
3000
20 3000 per dipartmento 10 5000
20 2975 maggiore di 20 3000
30 1600 $2900”
30 2850
30 1250
30 950
2850
30 1500
30 1250

DB - SQL per interrogazione basi di dati 99


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];

DB - SQL per interrogazione basi di dati 100


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

DB - SQL per interrogazione basi di dati 101


Uso di HAVING
SQL> SELECT job, SUM(sal) PAYROLL
2 FROM emp
3 WHERE job NOT LIKE 'SALES%'
4 GROUP BY job
5 HAVING SUM(sal)>5000
6 ORDER BY SUM(sal);

JOB PAYROLL
--------- ---------
ANALYST 6000
MANAGER 8275

DB - SQL per interrogazione basi di dati 102


Funzioni di raggruppamento annidate

SQL> SELECT max(avg(sal))


2 FROM emp
3 GROUP BY deptno;

MAX(AVG(SAL))
-------------
2916.6667

DB - SQL per interrogazione basi di dati 103


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

DB - SQL per interrogazione basi di dati 104


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

DB - SQL per interrogazione basi di dati 105


Visualizzare Dati da piu’ tabelle (||)

 Diversi tipi di Joins


 Operatori Insiemistici

DB - SQL per interrogazione basi di dati 106


Tabelle
 Tabelle ::= Tabella [Ide] {, Tabella [Ide]}

 Tabella::= Ide | Tabella OpInsiem Tabella |


Tabella Giunzione Tabella
 [USING “(“Attributo{,Attributo}“)”|ON
Condizione]

DB - SQL per interrogazione basi di dati 107


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

DB - SQL per interrogazione basi di dati 108


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.

DB - SQL per interrogazione basi di dati 109


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

DB - SQL per interrogazione basi di dati 110


Esempi
 Natural Join

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

 Nome,Corso e Voto degli esami

DB - SQL per interrogazione basi di dati 111


 [LEFT|RIGHT|FULL] usato con Natural
Join o Join e’ la giunzione esterna nelle tre
modalita’ sinistra,destra o completa.

DB - SQL per interrogazione basi di dati 112


Outer Join Operators
Full outer join

Left Outer Join Join Right Outer Join

Le righe escluse Le righe che Le righe escluse


dalla join della soddisfano la dalla join della
tabella a sx join tabella a dx
DB - SQL per interrogazione basi di dati 113
Altro Esempio
 Agenti(CodiceAgente,Nome,Zona
Supervisore,Commissione)
 Clienti(CodiceCliente,Nome,Citta’,Sconto)
 Ordini(CodiceOrdine,CodiceCliente,Codic
eAgente,Articolo,Data,Ammontare)

DB - SQL per interrogazione basi di dati 114


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

DB - SQL per interrogazione basi di dati 115


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)

DB - SQL per interrogazione basi di dati 116


Le operazioni su insiemi

A UNION B

A INTERSECT B

A MINUS B

DB - SQL per interrogazione basi di dati 117


Le operazioni su insiemi
 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

DB - SQL per interrogazione basi di dati 118


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

DB - SQL per interrogazione basi di dati 119


Formalizziamo

DB - SQL per interrogazione basi di dati 120


Attributi
 Attributi ::= * | Espr [[AS] NuovoNome] {,
Espr [[AS] NuovoNome] }

 Espr ::= [Ide.]Attributo | Costante |


“(“ Espr “)” | [-] Espr [ Espr] | (SUM |
COUNT |AVG | MAX | MIN) “(“ [DISTINCT]
[Ide.] Attributo “)” | COUNT “(“ * “)”
  ::= ( + | - | * | / )

DB - SQL per interrogazione basi di dati 121


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

DB - SQL per interrogazione basi di dati 122


Tabelle
 Tabelle ::= Tabella [Ide] {, Tabella [Ide]}

 Tabella::= Ide | Tabella OpInsiem Tabella |


Tabella Giunzione Tabella
 [USING “(“Attributo{,Attributo}“)”|ON
Condizione]

DB - SQL per interrogazione basi di dati 123


Esempi

 SELECT Professore
FROM CP,CMV,MNIT
WHERE CP.Corso = CMV.Corso
AND CMV.Matricola = NMIT.Matricola
AND Nome=‘Paolo Rossi’
AND Voto > 27

DB - SQL per interrogazione basi di dati 124


Sintassi Completa del SELECT

 Select ::= Sottoselect


 {(UNION|EXCEPT) Sottoselect}
 [ORDER BY Attributo[DESC]
 {, Attributo[DESC]} ]

DB - SQL per interrogazione basi di dati 125


Sottoselect
 Sottoselect ::= SELECT [DISTINCT]
 (* | Espr[[AS] NewName] {,Espr [[AS]
NewName]})
 FROM Tabella [Ide]{,Tabella[Ide]}
 [WHERE Condizione]
 [GROUP BY Attributo {,Attributo}]
 [HAVING Condizione]

DB - SQL per interrogazione basi di dati 126


Condizione

 Condizione ::= Predicato |


 “(“ Condizione “)” |
 NOT Condizione |
 Condizione (AND | OR) Condizione

DB - SQL per interrogazione basi di dati 127


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 ::=  |  |  |  |  | 

DB - SQL per interrogazione basi di dati 128


Espressioni
 Espr ::= [Ide.] Attributo |
 Costante |
 “(” Espr “)” |
 [-] Espr [ opa Espr] |
 (SUM | COUNT | AVG | MAX | MIN)
 “(” [DISTINCT] [Ide.] Attributo“)” |
 COUNT “(” * “)”
 opa ::= (+ | - | * | / )

DB - SQL per interrogazione basi di dati 129


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

DB - SQL per interrogazione basi di dati 130

Potrebbero piacerti anche