Top Banner
SQL Structured Query Language Comandi base di DML Rosalba Giugno [email protected] www.dmi.unict.it/~giugno/
131

SQL Structured Query Language Comandi base di DML Rosalba Giugno [email protected] giugno/ Rosalba Giugno [email protected] giugno

May 01, 2015

Download

Documents

Rosina Valeri
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

SQL Structured Query

Language Comandi base di DML

SQL Structured Query

Language Comandi base di DML

Rosalba Giugno

[email protected]

www.dmi.unict.it/~giugno/

Rosalba Giugno

[email protected]

www.dmi.unict.it/~giugno/

Page 2: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@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.

Page 3: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 4: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 5: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 6: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

6

SELECT

SELECT [DISTINCT] Attributi

FROM Tabelle

[WHERE Condizione]

Page 7: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 8: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 9: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 10: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 11: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

11

Esempi

SELECT Corso

FROM Esami,Studenti

WHERE

Esami.Matricola = Studenti.Matricola AND Nome=‘Mario Rossi’;

Page 12: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 13: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 14: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 15: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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;

Page 16: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 17: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 18: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 19: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 20: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 21: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 22: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

------------- -------------

...

Page 23: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 24: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

24

Alias o Correlation Names

SELECT c1.Matricola, c2.Matricola

FROM CMV c1, CMV c2

WHERE c1.voto < c2.voto

Page 25: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 26: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 27: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

Restrizioni ed ordinamento Dati

Restrizioni ed ordinamento Dati

Page 28: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 29: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 30: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 31: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 32: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 33: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

33

CONDIZIONE

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

Il risultato puo’ essere TRUE(T),FALSE(F) o UNKOWN(U).

Page 34: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 35: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

35

Operatori di confrontoOperatori di confronto

Operatore

=

>

>=

<

<=

<>

Significato

Uguale a

più grande di

maggiore o uguale di

minore di

minore o uguale a

diverso

Page 36: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 37: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 38: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 39: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

39

Predicato Between AND

Espr1 [NOT] BETWEEN Espr2 AND Espr3.

Equivale a

[NOT] Espr2 Espr1 AND Espr1Espr3

Page 40: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 41: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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%';

Page 42: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 43: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 44: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

44

Esempio

SELECT Nome

FROM Studenti

WHERE Indirizzo LIKE “Via Etnea %”

Fornisce tutti gli studenti che abitano in Via Etnea

Page 45: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

45

PredicatiEspr IS [NOT] NULL

esempio:

SELECT Nome

FROM Studenti

WHERE Telefono IS NOT NULL

Page 46: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 47: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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;

Page 48: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 49: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 50: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 51: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 52: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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;

Page 53: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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;

Page 54: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 55: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 56: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

Visualizzare Dati da più Tabelle

Visualizzare Dati da più Tabelle

Page 57: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 58: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 59: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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;

Page 60: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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 .

Page 61: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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”

Page 62: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 63: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 64: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 65: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 66: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 67: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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;

Page 68: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

68

Predicati Di Appartenenza e Quantificatori

Page 69: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

69

CONDIZIONE

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

Il risultato puo’ essere TRUE(T),FALSE(F) o UNKOWN(U).

Page 70: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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 )

Page 71: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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)

Page 72: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 73: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 74: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 75: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 76: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 77: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

77

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

Espr NOT IN (SottoSelect) non equivale a Espr <> ANY (SottoSelect) ma a Espr <> All (SottoSelect)

Page 78: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

78

Ricordiamo l’esempio

Agenti(CodiceAgente,Nome,Zona Supervisore,Commissione)

Clienti(CodiceCliente,Nome,Citta’,Sconto)

Ordini(CodiceOrdine,CodiceCliente,CodiceAgente,Articolo,Data,Ammontare)

Page 79: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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)

Page 80: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 81: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

Aggregazione datiAggregazione dati

Page 82: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 83: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 84: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 85: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

85

Esempi

SELECT MIN(Voto),MAX(Voto),AVG(Voto)

FROM Esami

WHERE Matricola = ‘123456’

SELECT COUNT(*)

FROM Esami

WHERE Corso = ‘Database 1’

Page 86: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

86

Quali sonoQuali sono

AVG COUNT MAXMIN STDDEV SUMVARIANCE

AVG COUNT MAXMIN STDDEV SUMVARIANCE

Page 87: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

87

UsoUso

SELECT [column,] group_function(column)FROM table[WHERE condition][GROUP BY column][ORDER BY column];

Page 88: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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%';

Page 89: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 90: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 91: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 92: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 93: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 94: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 95: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 96: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 97: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 98: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 99: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 100: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 101: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 102: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 103: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 104: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 105: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 106: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 107: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

107

Visualizzare Dati da piu’ tabelle (||)

Diversi tipi di Joins

Operatori Insiemistici

Page 108: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

108

Tabelle

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

Tabella::= Ide | Tabella OpInsiem Tabella | Tabella Giunzione Tabella

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

Page 109: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 110: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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.

Page 111: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 112: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

112

Esempi

Natural Join

SELECT Studenti.Nome,Esami.Corso,Esami.Voto

FROM Esami NATURAL JOIN Studenti

Nome,Corso e Voto degli esami

Page 113: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

113

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

Page 114: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 115: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

115

Altro Esempio

Agenti(CodiceAgente,Nome,Zona Supervisore,Commissione)

Clienti(CodiceCliente,Nome,Citta’,Sconto)

Ordini(CodiceOrdine,CodiceCliente,CodiceAgente,Articolo,Data,Ammontare)

Page 116: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 117: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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)

Page 118: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

118

Le operazioni Insiemistici

A UNION B

A INTERSECT B

A MINUS B

Page 119: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 120: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 121: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

121

Formalizziamo

Page 122: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

122

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

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

::= ( + | - | * | / )

Page 123: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 124: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

124

Tabelle

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

Tabella::= Ide | Tabella OpInsiem Tabella | Tabella Giunzione Tabella

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

Page 125: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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

Page 126: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

126

Sintassi Completa del SELECT

Select ::= Sottoselect

{(UNION|EXCEPT) Sottoselect}

[ORDER BY Attributo[DESC]

{, Attributo[DESC]} ]

Page 127: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

127

Sottoselect

Sottoselect ::= SELECT [DISTINCT]

(* | Espr[[AS] NewName] {,Espr [[AS] NewName]})

FROM Tabella [Ide]{,Tabella[Ide]}

[WHERE Condizione]

[GROUP BY Attributo {,Attributo}]

[HAVING Condizione]

Page 128: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

128

Condizione

Condizione ::= Predicato |

“(“ Condizione “)” |

NOT Condizione |

Condizione (AND | OR) Condizione

Page 129: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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 ::= | | | | |

Page 130: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

130

Espressioni

Espr ::= [Ide.] Attributo |

Costante |

“(” Espr “)” |

[-] Espr [ opa Espr] |

(SUM | COUNT | AVG | MAX | MIN)

“(” [DISTINCT] [Ide.] Attributo“)” |

COUNT “(” * “)”

opa ::= (+ | - | * | / )

Page 131: SQL Structured Query Language Comandi base di DML Rosalba Giugno giugno@dmi.unict.it giugno/ Rosalba Giugno giugno@dmi.unict.it giugno/

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