View
7.742
Download
4
Tags:
Embed Size (px)
DESCRIPTION
subquery inner query simple queries
Citation preview
Lezione SQL-SubQuery 1
Prof. Silvano Natalizi – classe VA – Liceo Tecnico – Gennaio 2009
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)
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.
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
Quale query è valutata per prima ? La query interna è valutata per prima, poi
quella esterna
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
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
(=,<>,<,<=,>,>=)
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
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.
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
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;
Esecuzione della subquery
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!
CONTINUA…