|
Un altro uso comune delle Queries coinvolge l’uso di operatori per permettere
ad una condizione di WHERE di includere l’output di una SELECT di una Query
annidata.
Dapprima, si mostri la lista degli acquirenti che hanno comprato un
oggetto dispendioso (ovvero con il prezzo dell’articolo che superi di 100
dollari il prezzo medio di tutti gli oggetti comprati):
SELECT IDAcquirente FROM ANTICHITA WHERE Prezzo
>
(SELECT AVG(Prezzo) +
100 FROM ANTICHITA);
La query annidata fra parentesi calcola il prezzo medio,
somma 100, ed usando il risultato, si stampa un IDAcquirente per ciascun oggetto
venduto di prezzo superiore. Si può usare DISTINCT IDAcquirente per visualizzare
una sola riga per ciascun IDAcquirente selezionato.
Stampa i Cognomi della tabella ANTIQUARI, solo se hanno
comprato un oggetto:
SELECT COGNOMEANTIQUARIO FROM ANTIQUARI WHERE
IDAntiquario IN
(SELECT DISTINCT IDAcquirente FROM
ANTICHITA);
La query annidata (o sottoquery) seleziona una lista di
acquirenti, e stampa il cognome di un Antiquario se e solo se il suo
IDAntiquario appare nella lista selezionata dalla sottoquery (talvolta chiamata
lista dei candidati).
Nota: alcuni DBMS permettono di usare il
segno uguale (‘=’) al posto di IN; per chiarezza, però, si preferisce l’uso di
IN, in quanto la sottoquery non ritorna un valore singolo, bensì una lista.
Per un esempio relativo all' UPDATE, sappiamo che il
gentiluomo che ha acquistato la libreria ha il Nome sbagliato nel database, e
che il nome corretto è Giovanni:
UPDATE ANTIQUARI SET NOMEANTIQUARIO =
'Giovanni' WHERE IDAntiquario =
(SELECT
IDAcquirente FROM
ANTICHITA WHERE OGGETTO =
'Libreria');
In primis,
la sottoquery cerca l’IDAcquirente per la persona o le persone che hanno
acquistato la libreria, in secundis la query esterna aggiorna il Nome.
Regola delle sottoquery: quando si ha una sottoquery come parte di una condizione di
WHERE, l’istruzione di SELECT deve avere un numero di colonne pari in numero e
tipo a quelle contenute nella condizione di WHERE della query esterna.
In altre parole, se si ha:
“WHERE NomeColonna = (SELECT….);”
l’istruzione di Select deve avere solo una colonna, per
trovare una corrispondenza con il NomeColonna della condizione di Where esterna;
in più, il tipo deve essere il medesimo (due interi, due stringhe di caratteri, etc..).
di
|