Lezione Sql Sub Query

8,339 views

Published on

subquery inner query simple queries

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
8,339
On SlideShare
0
From Embeds
0
Number of Embeds
129
Actions
Shares
0
Downloads
53
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Lezione Sql Sub Query

  1. 1. Lezione SQL-SubQuery 1 Prof. Silvano Natalizi – classe VA – Liceo Tecnico – Gennaio 2009
  2. 2. Che cosa è una SubQuery ? <ul><li>Una SubQuery è una query SELECT interna (nested/nidificata) ad un’altra query di tipo SELECT o INSERT o UPDATE o DELETE </li></ul><ul><li>È usata per creare della informazione richiesta dalla query esterna (principale) </li></ul><ul><li>Una subquery può contenere altre query nidificate al suo interno. Questa nidificazione può proseguire per molti livelli (all’infinito) </li></ul>
  3. 3. Quando è necessaria una subquery? <ul><li>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. </li></ul><ul><li>Ad esempio, per scrivere una SELECT che ci permetta di conoscere i voti dello studente la cui media dei voti è la più alta. </li></ul>
  4. 4. Sintassi della SubQuery <ul><li>La sintassi della subquery è la medesima di una normale SELECT </li></ul><ul><li>La subquery è sempre racchiusa tra una coppia di parentesi tonde </li></ul><ul><li>Una subquery non termina con il punto e virgola </li></ul><ul><li>Non usare la clausola ORDER BY all’interno di una subquery </li></ul>
  5. 5. Quale query è valutata per prima ? <ul><li>La query interna è valutata per prima, poi quella esterna </li></ul>
  6. 6. Come si creano le subquery <ul><ul><li>Main query: prima query che appare nel comando SELECT </li></ul></ul><ul><ul><li>La Subquery restituisce i valori che vengono usati nella query principale </li></ul></ul>
  7. 7. Come si scrive in pratica una subquery <ul><li>Di solito una subquery appare dopo la clausola WHERE al seguente modo: </li></ul><ul><li>WHERE test_expr [NOT] IN (subquery) </li></ul><ul><li>WHERE test_expr op ALL (subquery) </li></ul><ul><li>WHERE test_expr op ANY (subquery) </li></ul><ul><li>WHERE test_expr op (subquery) </li></ul><ul><li>WHERE [NOT] EXISTS (subquery) </li></ul><ul><li>test_expr è un valore, il nome di una colonna, un’espressione </li></ul><ul><li>Op è un operatore di confronto (=,<>,<,<=,>,>=) </li></ul>
  8. 8. Che cosa restituiscono le subquery <ul><li>Bisogna essere consapevoli, di volta in volta, di quali dati sono restituiti da una query nidificata </li></ul><ul><li>Le query nidificate possono restituire un valore singolo o valori multipli: </li></ul><ul><ul><li>To match valori singoli usa l’operatore = </li></ul></ul><ul><ul><li>To macth valori multipli usa l’operatore IN </li></ul></ul>
  9. 9. Query semplici o non correlate <ul><li>Una query semplice è quella che viene valutatua indipendentemente dalla sua query esterna ed è elaborata solo una volta. </li></ul><ul><li>Una query correlata invece dipende dai dati della query esterna. </li></ul><ul><li>In questa lezione ci limitiamo a studiare le query interne semplici. </li></ul>
  10. 10. Esempio di subquery: enunciato del problema <ul><li>Risolviamo il problema di trovare tutti i voti degli studenti inferiori al voto medio di tutti gli studenti. </li></ul><ul><li>Come si fa ? </li></ul><ul><li>Il voto medio non esiste nella tabella voto, perché è un attributo derivato da calcolare con la funzione aggregata avg(voto). </li></ul><ul><li>Pertanto prima di rispondere alla domanda posta, occore avere il dato voto medio che ci viene restituito da una prima query </li></ul><ul><li>Possiamo pertanto utilizzare due query: </li></ul><ul><li>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 </li></ul>
  11. 11. Esempio di subquery: soluzione del problema <ul><li>La query interna si scrive così: </li></ul><ul><ul><li>(SELECT avg(voto) FROM voto ) </li></ul></ul><ul><li>La query esterna si scrive così: </li></ul><ul><ul><li>SELECT idStudente,idmateria, voto, FROM voto WHERE voto<(…); </li></ul></ul><ul><li>Mettendo insieme le due query otteniamo: </li></ul><ul><ul><li>SELECT idStudente,idmateria, voto FROM voto WHERE voto<(SELECT avg(voto) FROM voto ) ORDER BY idStudente; </li></ul></ul>
  12. 12. Esecuzione della subquery
  13. 13. Se si vuole sapere quanti sono i voti maggiori del voto medio ? Minori ? <ul><li>La query interna non cambia. </li></ul><ul><li>Quella esterna invece ha la funzione aggregata count(voto): </li></ul><ul><li>Pertanto avremo: </li></ul><ul><ul><li>SELECT count(voto) as ‘numero voti minori media’ FROM voto WHERE voto<(SELECT avg(voto) FROM voto); </li></ul></ul><ul><li>come vediamo dal risultato dell’esecuzione di questa subquery, abbiamo 7 voti inferiori alla media </li></ul><ul><li>Questo risultato ci conforta, perché se contiamo le righe del risultato della precedente subquery, troviamo proprio 7! </li></ul>
  14. 14. CONTINUA…

×