Daniele Merli
a- a+

Subquery

Per introdurre il concetto rivediamo l'utilizzo dellaspecifica IN.
Avevamo detto che questo controlla se un valore e'presente in una lista.
In altre parole il predicato IN formulato con:

campo IN (a, b, c, ...);

e' equivalente a

campo = a OR campo = b OR campo = c OR ... ;

I valori della lista potrebbero essere quelli selezionati dauno statement SELECT e cioe' potremmo fare unasottointerrogazione per ricavare i dati della lista che ciinteressano.
Ad esempio potremmo usare:

SELECT NOME,INDIRIZZO FROM XYZ WHERE NOME IN (SELECT NOME FROM ZYX WHERE CITTA = 'Asti');

Il SELECT traparentesi selezionerebbe tutti i campi NOME della tavola ZYXche possiedono come citta' 'Asti'.
Il primo SELECT visualizzerebbe i campi NOME e INDIRIZZO ditutte le righe il cui NOME e' presente nella lista creatadal costrutto precedente.
Sono anche possibili statement del tipo:

SELECT NOME, INDIRIZZO FROM TAVOLA1 WHERE CITTA IN(SELECT CITTA FROM TAVOLA2 WHERE NUMERO IN(SELECT NUMERO FROM TAVOLA3 WHERE IMPORTO > 50000));

oppure

SELECT NOME FROM TAVOLA1 WHERE CITTA = 'Asti' AND IMPORTO IN(SELECT IMPORTO FROM TAVOLA2 WHERE IMPORTO > 50000);

Come avete sicuramente notato negli esempi precedenti e'stata utilizzata la specifica IN.
Se utente sa che una determinata sottointerrogazione ritornaesattamente un solo valore puo' utilizzare un normaleoperatore di confronto (=, >, <, ecc.).
Ad esempio:

SELECT NOME FROM TAVOLA1 WHERE CITTA =(SELECT CITTA FROM TAVOLA2 WHERE NOME = 'Rossi');

oppure

SELECT NOME FROM TAVOLA1 WHERE IMPORTO <(SELECT MAX(IMPORTO) FROM TAVOLA2);

Terminiamo questa panoramica sulle interrogazioni guardandoancora il concetto di unione.

Due interrogazioni con SELECT possono essere unite al finedi creare una tavola unica.
Il vocabolo che permette di eseguire questa funzione e'UNION la cui sintassi e':

SELECT .... FROM tavola1 UNION SELECT .... FROM tavola2;

Il seguente esempio crea una tavola che e' la sommadelle due create dai comandi SELECT.

SELECT * FROM TAVOLA1 UNION SELECT * FROM TAVOLA2;

Nel caso che si vogliano eseguire piu' di dueinterrogazioni e' necessario utilizzare le parentesirotonde per la suddivisione.
Un esempio:

SELECT NOME FROM TAVOLA1 UNION(SELECT NOME FROM TAVOLA2 UNION SELECT INDIRIZZO FROM TAVOLA3);

Con questo abbiamo concluso il discorso legato alleinterrogazioni.
Avremmo potuto iniziare la trattazione di SQL partendo dallacreazione, cancellazione e modifica dei records in un sistemadi database.
Ho preferito iniziare dalle interrogazioni lasciando laparte relativa alle modifiche, creazione inclusa, perultima.
In questo modo chi legge questo fascicolo incomincia achiarirsi le idee manipolando oggetti gia' costruitisenza dovere, inizialmente, sforzarsi a immaginarsi comepossono essere creati questi oggetti.
Proseguiremo ora con alcuni argomenti legatiall'utilizzo dei prodotti gia' creati.