lezione sql sub query

14
Lezione SQL-SubQuery 1 Prof. Silvano Natalizi – classe VA – Liceo Tecnico – Gennaio 2009

Upload: silvano-natalizi-itis-alessandro-volta-perugia

Post on 22-May-2015

7.757 views

Category:

Education


4 download

DESCRIPTION

subquery inner query simple queries

TRANSCRIPT

Page 1: Lezione Sql Sub Query

Lezione SQL-SubQuery 1

Prof. Silvano Natalizi – classe VA – Liceo Tecnico – Gennaio 2009

Page 2: Lezione Sql Sub Query

Che cosa è una SubQuery ? Una SubQuery è una query SELECT interna

(nested/nidificata) ad un’altra query di tipo SELECT o INSERT o UPDATE o DELETE

È usata per creare della informazione richiesta dalla query esterna (principale)

Una subquery può contenere altre query nidificate al suo interno. Questa nidificazione può proseguire per molti livelli (all’infinito)

Page 3: Lezione Sql Sub Query

Quando è necessaria una subquery?

Quano non è possibile ricavare direttamente da nessuna tabella la risposta al quesito posto, se prima non si risponde, con l’uso della SELECT, ad un’altra domanda.

Ad esempio, per scrivere una SELECT che ci permetta di conoscere i voti dello studente la cui media dei voti è la più alta.

Page 4: Lezione Sql Sub Query

Sintassi della SubQuery La sintassi della subquery è la medesima di

una normale SELECT La subquery è sempre racchiusa tra una

coppia di parentesi tonde Una subquery non termina con il punto e

virgola Non usare la clausola ORDER BY all’interno di

una subquery

Page 5: Lezione Sql Sub Query

Quale query è valutata per prima ? La query interna è valutata per prima, poi

quella esterna

Page 6: Lezione Sql Sub Query

Come si creano le subquery Main query: prima query che appare nel

comando SELECT La Subquery restituisce i valori che vengono

usati nella query principale

Page 7: Lezione Sql Sub Query

Come si scrive in pratica una subquery Di solito una subquery appare dopo la

clausola WHERE al seguente modo: WHERE test_expr [NOT] IN (subquery) WHERE test_expr op ALL (subquery) WHERE test_expr op ANY (subquery) WHERE test_expr op (subquery) WHERE [NOT] EXISTS (subquery) test_expr è un valore, il nome di una colonna,

un’espressione Op è un operatore di confronto

(=,<>,<,<=,>,>=)

Page 8: Lezione Sql Sub Query

Che cosa restituiscono le subquery

Bisogna essere consapevoli, di volta in volta, di quali dati sono restituiti da una query nidificata

Le query nidificate possono restituire un valore singolo o valori multipli: To match valori singoli usa l’operatore = To macth valori multipli usa l’operatore IN

Page 9: Lezione Sql Sub Query

Query semplici o non correlate Una query semplice è quella che viene

valutatua indipendentemente dalla sua query esterna ed è elaborata solo una volta.

Una query correlata invece dipende dai dati della query esterna.

In questa lezione ci limitiamo a studiare le query interne semplici.

Page 10: Lezione Sql Sub Query

Esempio di subquery: enunciato del problema Risolviamo il problema di trovare tutti i voti degli

studenti inferiori al voto medio di tutti gli studenti.

Come si fa ? Il voto medio non esiste nella tabella voto, perché

è un attributo derivato da calcolare con la funzione aggregata avg(voto).

Pertanto prima di rispondere alla domanda posta, occore avere il dato voto medio che ci viene restituito da una prima query

Possiamo pertanto utilizzare due query: Una prima query interna che ci restituisce il valor

medio del voto ed una query esterna che ricava tutti i voti che siano inferiori a questo valor medio

Page 11: Lezione Sql Sub Query

Esempio di subquery: soluzione del problema La query interna si scrive così:

(SELECT avg(voto) FROM voto ) La query esterna si scrive così:

SELECT idStudente,idmateria, voto, FROM voto WHERE voto<(…);

Mettendo insieme le due query otteniamo: SELECT idStudente,idmateria, voto FROM voto

WHERE voto<(SELECT avg(voto) FROM voto ) ORDER BY idStudente;

Page 12: Lezione Sql Sub Query

Esecuzione della subquery

Page 13: Lezione Sql Sub Query

Se si vuole sapere quanti sono i voti maggiori del voto medio ? Minori ? La query interna non cambia. Quella esterna invece ha la funzione aggregata

count(voto): Pertanto avremo:

SELECT count(voto) as ‘numero voti minori media’ FROM voto WHERE voto<(SELECT avg(voto) FROM voto);

come vediamo dal risultato dell’esecuzione di questa subquery, abbiamo 7 voti inferiori alla media

Questo risultato ci conforta, perché se contiamo le righe del risultato della precedente subquery, troviamo proprio 7!

Page 14: Lezione Sql Sub Query

CONTINUA…