Estratto del documento

La select nidificata

Forma generale

La possibilità di calcolare una query secondo un determinato ordine temporale risulta di notevole importanza nello schema relazionale. Il modo per fare questo è costituito dalla cosiddetta "select nidificata". La forma generale è data da:

SELECT . . . FROM . . . WHERE espressione =!= (query); > ALL (query); !> ANY (query); < !<>=<=

Il suo funzionamento è abbastanza semplice (il lettore non si lasci ingannare dall’apparente complessità della forma generale). La query che si trova tra le parentesi tonde, chiamata anche "select interna", viene eseguita per prima quindi, sulla base della relazione-risultato così ottenuta, viene risolta l'altra query, chiamata anche "select esterna". A questo riguardo sono da tenere presenti le seguenti regole:

  • La select esterna può, a sua volta, essere interna ad un'altra select.
  • La condizione stabilita con WHERE, se necessario, deve essere sostituita con una HAVING.
  • Se la query interna restituisce più di un valore, la stessa deve essere preceduta da una delle due parole ANY oppure ALL.
  • Stabilito che dopo WHERE o HAVING possono comparire più attributi separati da virgole, si tenga presente che i valori a sinistra e a destra dell'operatore di condizione =, >, <, etc., devono coincidere in numero e tipo (vedere gli esempi proposti più avanti).
  • Quanto detto nel punto precedente, non esclude la possibilità di esprimere condizioni del tipo: WHERE a = (SELECT b FROM ....); in cui a costituisce un qualsiasi attributo, mentre b vuole indicare il nome di una qualunque funzione colonna; l'operatore di condizione "=", se necessario, può essere sostituito con qualunque altro operatore dello stesso tipo.

Nota: la select nidificata non è ammissibile in Microsoft Access.

L'attributo associato al massimo/minimo

Consideriamo il seguente problema: vogliamo conoscere il nome dell'autovettura che costa di più. Escluso il ricorso a query che elencano l'attributo nome insieme ad una funzione di gruppo max(lit), escluso qualunque raggruppamento di tuple, saremmo portati ad eseguire due query distinte; con la prima calcoliamo il prezzo più alto:

SELECT max(lit) FROM modello; [44.1]

Il risultato della query, cioè 654321, viene impiegato per scrivere:

SELECT nome FROM modello WHERE lit = 654321; [44.2]

Appare immediato il difetto di questo approccio. In particolare la seconda query non è generalizzabile in quanto una variazione dei dati della relazione MODELLO comporta anche una sua modifica. La nidificazione delle query evita questo inconveniente per la modifica della condizione stabilita nella [44.2]. Sostanzialmente si tratta delle due query precedenti con qualche modifica: ne riportiamo il testo:

SELECT nome FROM modello WHERE lit = (SELECT max(lit) FROM modello); [45]

Vediamo qui un esempio di come sia possibile esprimere, attraverso la nidificazione, espressioni condizionali in cui si confronta uno scalare con una funzione colonna (grazie al calcolo che avviene in tempi diversi!). Una notevole proprietà delle select nidificate è quella di essere equivalenti, in molti casi, alle join di una tabella con se stessa. Si consideri il problema risolto con la [25]. Allo stesso risultato si può arrivare con la select nidificata, calcolando per prima la relazione che restituisce il consumo a ciclo urbano della "126", quindi selezionando dalla relazione modello le tuple che rispettano la condizione richiesta.

Le parole ANY/ALL

Il prossimo argomento riguarda l'uso di ANY oppure ALL. Consideriamo il seguente problema: vogliamo conoscere i nomi delle autovetture della casa 3 che hanno lo stesso uso delle autovetture della casa 0. Il risultato si ottiene calcolando, con una nidificazione, le tipologie di uso delle auto della casa 0, quindi selezionando le auto della casa 3 che sono della stessa tipologia. Purtroppo la query:

SELECT nome FROM modello WHERE nocasa = '3' AND uso = (SELECT uso FROM modello WHERE nocasa = '0'); [46]

restituisce un errore se, come accade con i dati del nostro esempio, la relazione interna ha cardinalità maggiore di uno. Ciò avviene poiché la condizione posta nella terza riga risulta ambigua: questa, infatti, deve valere per uno o per tutti gli scalari calcolati dalla select interna.

Anteprima
Vedrai una selezione di 3 pagine su 9
Informatica - select nidificata Pag. 1 Informatica - select nidificata Pag. 2
Anteprima di 3 pagg. su 9.
Scarica il documento per vederlo tutto.
Informatica - select nidificata Pag. 6
1 su 9
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher valeria0186 di informazioni apprese con la frequenza delle lezioni di Informatica e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Roma La Sapienza o del prof Grande Antonio.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community