Che materia stai cercando?

Informatica - select nidificata Appunti scolastici Premium

Appunti per l' idoneità di Informatica del professor Grande sulla select nidificata, con analisi dei seguenti argoemnti: la forma generale, l'attributo associato al massimo/minimo, le parole ANY/ALL, la condizione equivalente, la particolare struttura di query nidificata, la nidificazione, la select ciclica.

Esame di Informatica docente Prof. A. Grande

Anteprima

ESTRATTO DOCUMENTO

11.4 Una condizione equivalente

Qualora le condizioni per la nidificazione siano di questo tipo, ovvero condizioni "maggiore di

ALL", si possono evitare ricorsi alla ALL con una query equivalente, costituita nel nostro caso da:

SELECT .. FROM ..

WHERE ..

AND .. >

(SELECT max(..) FROM ..

WHERE ..); [48.1]

Una osservazione relativa alle due specifiche ANY/ALL. Intuitivamente si capisce che la particella

ANY e' notevolmente meno restrittiva rispetto alla ALL. Questo ci introduce al discorso che segue.

Supponiamo di voler risolvere il quesito precedente con una variante: la cilindrata deve essere

maggiore di una qualunque etc. In questo caso si perviene con facilita' alla scrittura del testo della

query, mentre non altrettanto semplice risulta la comprensione del suo risultato.

SELECT nome FROM modello

WHERE nocasa = '0'

AND cc > ANY

(SELECT cc FROM modello

WHERE nocasa = '3'); [49]

NOME

-----------------

bx 19 trd diesel

cx 25 limousine

cx25 trd turbods

cx 25 gti turbo

bx 19 trd diesel

cx 25 limousine

cx25 trd turbods

cx 25 gti turbo

. . . .

. . . .

cx 25 limousine

cx25 trd turbods

cx 25 gti turbo

Cosa e' accaduto? La ragione di questo sta nella diversa restrittivita' di ANY e ALL unitamente al

meccanismo di funzionamento della SELECT nidificata. Se infatti la relazione interna ha

cardinalita' maggiore di uno, la stessa tupla della SELECT esterna risulta "vincente" per diverse

volte, portando al risultato visto. Questo inconveniente viene facilmente evitato aggiungendo alla

lista dei valori la parola DISTINCT.

11.5 (ancora) Una condizione equivalente

Analogamente a quanto detto in precedenza in occasione della [48.1], problemi derivanti dall'uso di

query simili alla [49], a maggior ragione, possono essere evitati con una query del tipo:

SELECT nome FROM modello

WHERE nocasa = '0'

AND cc >

(SELECT min(cc) FROM modello

WHERE nocasa = '3'); [49.1]

Una interessante osservazione merita la condizione espressa per la query [47.1]. Si capisce

immediatamente che l'inversione del risultato e percio’ della WHERE, si ottiene facendo precedere

IN da NOT. Riportiamo il testo della query corrispondente, assieme al risultato per confermarne la

correttezza.

SELECT nome FROM modello

WHERE nocasa = '3'

AND uso NOT IN

(SELECT uso FROM modello

WHERE nocasa = '0'); [50]

NOME

--------------

126

panda 750 l

panda 1000 s

panda d diesel

Si tenga presente, e questo e' quanto ci premeva notare, che la stessa inversione, se ci riferiamo alla

query equivalente [47], si ottiene cambiando ANY con ALL assieme alla negazione NOT. Nel caso

presentato di seguito la negazione viene espressa ricorrendo al simbolo equivalente "!".

SELECT nome FROM modello

WHERE nocasa = '3'

AND uso != ALL

(SELECT uso FROM modello

WHERE nocasa = '0'); [51]

11.6 Una particolare struttura di query nidificata

Una interessante possibilita' della SELECT nidificata, viene evidenziata nella query che stiamo per

commentare: supponiamo di voler ottenere il nome della casa che produce il maggior numero di

autovetture. Allo scopo di facilitare la comprensione della query, sono necessarie alcune

considerazioni. Problemi di ricerca dell'attributo, la casa costruttrice nel nostro caso, associato ad un

valore calcolato con una funzione colonna, si risolvono sempre con una nidificazione, analogamente

a quanto esemplificato nella query [45]. In aggiunta a questo, dovremo considerare che i dati

necessari ad una delle due SELECT si trovano su tabelle diverse, quindi dovremo ricorrere anche ad

una join. Il problema maggiore pero' riguarda la ricerca del massimo non sui dati di una colonna,

ma sui valori ottenuti da una funzione colonna (la count che calcola le tuple di ciascuna casa

costruttrice). Per risolverlo consideriamo i risultati delle prossime tre query.

La prima potra' apparire scontata, ma e' funzionale al nostro ragionamento. Si tratta della query che

calcola quante sono le tuple della tabella MODELLO. La riportiamo con il risultato.

SELECT count(*)

FROM modello; COUNT(*)

--------

12

Se aggiungiamo, alla query precedente la clausola GROUP BY in relazione all'attributo nocasa,

otteniamo una lista con il numero di modelli prodotti da ogni costruttore. Ne riportiamo il testo

insieme al risultato.

SELECT count(*)

FROM modello

GROUP BY nocasa; COUNT(*)

--------

4

2

5

1

Risulta semplice ora ottenere il massimo tra i valori appena elencati: bastera' chiedere il calcolo del

massimo sui risultati della query precedente. Anche in questo caso riportiamo la query ed il suo

risultato.

SELECT max(count(*))

FROM modello

GROUP BY nocasa; [52]

MAX(COUNT(*))

-------------

5

Le considerazioni svolte precedentemente alle tre query ed il risultato ottenuto con la [52] possono

riassumersi nei punti che riepiloghiamo di seguito come risolutivi del nostro problema e di

problemi analoghi:

- select nidificata come richiesto per il calcolo di attributi associati ad un valore massimo (vedere

query [45]);

- select interna come la [52]

- la query esterna deve eseguire una join ed un raggruppamento sulla casa costruttrice.

La fasatura tra le due select, quella interna e quella esterna, si otterra' imponendo una condizione

nella query esterna che usa una funzione colonna; attenzione a non confondere questo con la lista

che segue SELECT nella query interna. Ancora aggiungiamo che il raggruppamento della select

esterna puo' essere su nocasa oppure su casa. Il testo della query ed il suo risultato sono riportati di

seguito.

SELECT casa, count(*)

FROM marche, modello

WHERE marche.nocasa = modello.nocasa

GROUP BY casa

HAVING count(*) =

(SELECT max(count(*))

FROM modello

GROUP BY nocasa); [53]

CASA COUNT(*)

-------- ----------

fiat 5

11.7 La nidificazione il "tutto" ed una sua parte

La select nidificata risulta decisiva nei casi in cui il software Sql che utilizziamo non ammette l'uso

della opzione "(+)" come era stato fatto per la query [23]. Se questo avviene la query che elenca i

nomi dei costruttori che non producono alcun modello e' ottenuta con una nidificazione in cui la

query interna elenca i codici dei costruttori che producono almeno un modello, mentre la esterna

impone la condizione che ilcodice deve essere diverso da tutti quelli contenuti nella select interna. Il

testo della query viene riportato di seguito senza il risultato.

SELECT casa

FROM marche

WHERE nocasa NOT IN

(SELECT DISTINCT nocasa

FROM modello); [54]

Strutture simili, sono risolutive in tutti i casi in cui il risultato viene trovato per differenza dal

momento che una relazione rappresenta il tutto (la relazione MARCHE nel nostro esempio elenca

tutti i produttori), mentre un'altra relazione rappresenta un sottoinsieme del tutto (la relazione

MODELLO contiene i costruttori, sotto forma di codici, che producono almeno un modello).

11.8.1 La nidificazione su piu' valori (nella stessa condizione)

La prossima query vuole essere un esempio in cui la condizione per la query interna deve

confrontare non uno ma necessariamente due valori. In casi analoghi si raccomanda di fare

attenzione affinche' gli argomenti oggetto del confronto siano uguali in tipo e numero ai due livelli

di query, interno ed esterno. Consideriamo le seguenti relazioni:


PAGINE

9

PESO

41.00 KB

PUBBLICATO

+1 anno fa


DETTAGLI
Esame: Informatica
Corso di laurea: Corso di laurea in economia e commercio (POMEZIA, ROMA)
SSD:
A.A.: 2013-2014

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à La Sapienza - Uniroma1 o del prof Grande Antonio.

Acquista con carta o conto PayPal

Scarica il file tutte le volte che vuoi

Paga con un conto PayPal per usufruire della garanzia Soddisfatto o rimborsato

Recensioni
Ti è piaciuto questo appunto? Valutalo!

Altri appunti di Informatica

Informatica - le reti e Internet
Appunto
Informatica - i fondamenti di Excel - (parte 1)
Appunto
Informatica - la Join - SQL
Appunto
Informatica -  le tabelle - SQL
Appunto