+ All Categories

C6 Sql2

Date post: 05-Dec-2014
Category:
Upload: majong-devjfu
View: 545 times
Download: 2 times
Share this document with a friend
Description:
 
24
Basi di Dati Interrogazioni complesse (II parte)
Transcript
Page 1: C6 Sql2

Basi di Dati

Interrogazioni complesse (II parte)

Page 2: C6 Sql2

Basi di Dati – Dove ci troviamo?

C) Modello Relazionale, Algebra relazionale, SQL

1 2 3 4 5 6 7

E) Tecnologia di un DBMS

1 2 3 4 5 6

A) Introduzione

1 2

B) Prog. Concettuale (ER)

1 2 3 4 5 6 7

D) Prog. Logica e Normalizzazione

1 2 3 4

F) Programmazione DB

1 2

2 Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 3: C6 Sql2

Classificazione delle interrogazioni complesse

Basi di Dati ‐ Interrogazioni complesse (II parte)3

Query con ordinamentoQuery con aggregazioniQuery con raggruppamentoQuery binarieQuery nidificate

Page 4: C6 Sql2

Esempio : gestione ordini 

4

cliente COD‐CLI NOME    INDIRIZZO P‐IVA

COD‐ORD COD‐CLI DATA   IMPORTO

COD‐ORD COD‐PROD QTA

COD‐PROD NOME   PREZZOprodotto

dettaglio

ordine

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 5: C6 Sql2

Istanza di ordine 

5

ordine

COD‐ORD

1

2

3

4

5

6

COD‐CLI

3

4

3

1

1

3

DATA

2004‐06‐01

2004‐08‐03

2004‐09‐01

2004‐07‐01

2004‐08‐01

2004‐09‐03

IMPORTO

50.000

8.000

5.500

12.000

1.500

27.000

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 6: C6 Sql2

Query binarie

Costruite concatenando due query SQL tramite operatori insiemistici:UNION  unioneINTERSECT  intersezioneEXCEPT  differenza

si eliminano i duplicati

6 Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 7: C6 Sql2

UnioneSelezionare i codici degli ordini i cui importi superano 500 € oppure presenti in qualche dettaglio con quantità superiore a 1000.

SELECT COD‐ORDFROM ORDINEWHERE IMPORTO > 500

UNIONSELECT COD‐ORDFROM DETTAGLIOWHERE QTA > 1000

7 Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 8: C6 Sql2

Differenza

8

Selezionare i codici degli ordini i cui importi superano 500 € ma non presenti in nessun dettaglio con quantità superiore a 1000.

SELECT COD‐ORDFROM ORDINEWHERE IMPORTO > 500

EXCEPTSELECT COD‐ORDFROM DETTAGLIOWHERE QTA > 1000

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 9: C6 Sql2

Intersezione

9

Selezionare i codici degli ordini i cui importi superano 500 € e che sono presenti in qualche dettaglio con quantità superiore a 1000.

SELECT COD‐ORDFROM ORDINEWHERE IMPORTO > 500

INTERSECTSELECT COD‐ORDFROM DETTAGLIOWHERE QTA > 1000

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 10: C6 Sql2

Query nidificate

10

Costruite concatenando due query SQL nel predicato where:[NOT] IN  appartenenza[NOT] EXISTS  esistenzaANY, ALL  quantificatori

comparatore:   =, !=, <, <=, >, >=

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 11: C6 Sql2

Query nidificate (nested)

11

Selezionare nome e indirizzo dei clienti che hanno emesso qualche ordine di importo superiore a 10.000 €.

SELECT NOME, INDIRIZZOFROM CLIENTEWHERE COD‐CLI IN 

SELECT COD‐CLIFROM ORDINEWHERE IMPORTO > 10.000

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 12: C6 Sql2

Equivalenza fra IN e query semplici

12

SELECT NOME, INDIRIZZOFROM CLIENTEWHERE COD‐CLI IN 

SELECT COD‐CLIFROM ORDINEWHERE IMPORTO > 10.000

equivale (a meno di duplicati) a:

SELECT NOME, INDIRIZZOFROM CLIENTE JOIN ORDINE 

ON CLIENTE.COD‐CLI = ORDINE.COD‐CLIWHERE IMPORTO > 10.000

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 13: C6 Sql2

Nested Query complesse (fino a 8 livelli)

13

Selezionare nome e indirizzo dei clienti che hanno emesso qualche ordine i cui dettagli comprendono il prodotto “Pneumatico”.

SELECT NOME, INDIRIZZO  FROM CLIENTEWHERE COD‐CLI IN 

SELECT COD‐CLI  FROM ORDINEWHERE COD‐ORD IN

SELECT COD‐ORD  FROM DETTAGLIOWHERE COD‐PROD IN 

SELECT COD‐PROD  FROM PRODOTTOWHERE NOME = 'Pneumatico'

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 14: C6 Sql2

La query equivalente

14

equivale (a meno di duplicati) a:

SELECT NOME, INDIRIZZOFROM CLIENTE AS C, ORDINE AS O, 

DETTAGLIO AS D, PRODOTTO AS P WHERE C.COD‐CLI = O.COD‐CLI

AND O.COD‐ORD = D.COD‐ORDAND D.COD‐PROD = P.COD‐PRODAND NOME= 'Pneumatico'

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 15: C6 Sql2

Esempio : gestione personale 

15

impiegato

MATR

1

2

3

NOME

Piero

Giorgio

Giovanni

DATA‐ASS

1‐1‐02

1‐1‐04

1‐7‐03

SALARIO

1500 €

2000 €

1000 €

assegnamentoMATR

1

1

2

3

NUM‐PROG

3

4

3

4

PERC

50

50

100

100

progettoTITOLO

Idea

Wide

TIPO

Esprit

Esprit

MATR‐MGR

2

null

NUM‐PROG

3

4

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 16: C6 Sql2

Nested query correlate (con variabile)

16

Selezionare il nome degli impiegati il cui salario è maggiore di quello del proprio manager.

SELECT NOMEFROM IMPIEGATI AS X, WHERE SALARIO >( SELECT SALARIO

FROM IMPIEGATIWHERE MATR = X.MATR‐MGR

)

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 17: C6 Sql2

Nested query correlate (con variabile)

17

SELECT NOMEFROM IMPIEGATI AS X, WHERE SALARIO>( SELECT SALARIO

FROM IMPIEGATIWHERE MATR = X.MATR‐MGR )

sulla relazione IMPIEGATI (matricola, nome, manager…) equivale al JOIN

SELECT X.NOMEFROM IMPIEGATI AS X, IMPIEGATI AS YWHERE X.SALARIO > Y.SALARIO

AND Y.MATR = X.MATR‐MGR

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 18: C6 Sql2

Uso di IN nelle modifiche

18

aumentare di 5 € l’importo di tutti gli ordini che comprendono  il prodotto 456

UPDATE ORDINESET IMPORTO = IMPORTO + 5WHERE COD‐ORD IN

SELECT COD‐ORDFROM DETTAGLIOWHERE COD‐PROD = '456'

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 19: C6 Sql2

Query con NOT IN

19

Selezionare nome e indirizzo dei clienti che non hanno emesso nessun ordine di importo superiore a 10.000 €.

SELECT NOME, INDIRIZZOFROM CLIENTEWHERE COD‐CLI NOT IN

SELECT COD‐CLIFROM ORDINEWHERE IMPORTO > 10.000

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 20: C6 Sql2

Le query con ANY e ALL

20

SELECT COD‐ORD FROM ORDINE WHERE IMPORTO > ANY 

SELECT IMPORTOFROM ORDINE

SELECT COD‐ORDFROM ORDINEWHERE IMPORTO >= ALL

SELECT IMPORTOFROM ORDINE

COD‐ORD

1

2

3

IMPORTO

50

300

90

ANY

F

V

V

ALL

F

V

F

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 21: C6 Sql2

Riduzione di query innestate 

21

Attenzione! 

Come si è visto, è spesso possibile ridurre una queryinnestata a una query semplice.

Tuttavia, le query innestate formulate con i seguenti operatori non si possono ridurre:NOT INALL (con qualsiasi operatore di confronto)NOT EXISTS con subquery correlata

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 22: C6 Sql2

Esempi

22

in quali tipi di progetti lavora Giovanni?

SELECT TIPO  FROM PROGETTO 

WHERE NUM‐PROG IN

SELECT NUM‐PROG FROM ASSEGNAMENTO 

WHERE MATR IN

SELECT MATR FROM IMPIEGATO

WHERE NOME='Giovanni‘

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 23: C6 Sql2

Esempi

23

chi è il manager di Piero?

SELECT NOME  FROM IMPIEGATO WHERE MATR IN     

SELECT MATR‐MGR FROM IMPIEGATO  WHERE NOME='Piero'

Basi di Dati ‐ Interrogazioni complesse (II parte)

Page 24: C6 Sql2

Esercizi

24

Riprendere le basi di dati per la gestione del personale e degli ordini ed esprimere in SQL le interrogazioni :quale impiegati lavorano in un progetto in cui non lavora il loro manager?quanti ordini ha emesso Paolo?quante candele sono state ordinate il 5/7/04?calcolare per ciascun cliente la somma degli importi di tutti gli ordiniestrarre l'ordine di importo più alto

Basi di Dati ‐ Interrogazioni complesse (II parte)


Recommended