|
In questa sezione parleremo dell' utilizzo degli Alias, dell' In
, dell' utilizzo delle subquery, e come queste possono venire utilizzate
nel nostro esempio di 3 tabelle.
Per prima cosa diamo un' occhiata alla query
riportata qui sotto, che ritorna i cognomi di quegli antiquari che hanno fatto
un' ordine e che tipo di oggetto hanno ordinato, mostrando solo gli ordini in
essere (se notate infatti esiste un' antiquario che ha ordinato un' oggetto di
cui e' già in possesso):
SELECT PERS.CognomeAntiquario Cognome, ORD.OggettoRicercato
Oggetto Ordinato
FROM Ordini ORD, Antiquari PERS WHERE ORD.IDAntiquario = PERS.IDAntiquario AND
ORD.OggettoRicercato IN
(SELECT Oggetto FROM Antichita);Questa query
ritorna questo risultato:
Cognome Oggetto Ordinato -------
----------------
Smith Tavolo
Smith Scrivania
Akins Sedia
Lawson Specchio
C'e' veramente un mucchio di cose da vedere in questa query. analizziamola
nello specifico :
- Per prima cosa, nella linea della clausola SELECT compaiono le parole
"Cognome" e "Oggetto Ordinato" che forniscono l'
intestazione delle colonne del report ritornato dalla query
- Le parole PERS ed ORD sono alias; gli alias sono dei nomi
alternativi per le due tabelle che compaiono nella clausola FROM e che
vengono utilizzati come prefissi in tutta la dot notation delle colonne
utilizzate nella query, in modo da eliminare le ambiguità , in particolar
modo nella clausola WHERE dell' equijoin , dove entrambi le colonne si
chiamano IDAntiquario e quindi la dot notation si renda indispensabile per
evitare confusione tra i due
- Notate che la tabella Ordini e' quella che compare per prima nella
clausola FROM; questo ci permette di essere sicuri che il report verrà
tratto dai dati presenti in questa tabella e che la tabella Antiquari viene
utilizzata solo per recuperare le informazioni dettagliate (i cognomi)
- La cosa più importante; l' AND nella clausola WHERE forza a richiamare la
subquery contenuta nella clausola IN ("= ANY" o "= SOME" sono due
utilizzi equivalenti ad IN). Questo e' quello che fa: la subquery contenuta
tra le parentesi viene eseguita, ritornando l' elenco di tutti gli oggetti
contenuti nella tabella Antichita non essendoci nessuna clausola WHERE nella
subquery; dopodiché, perché una riga nella tabella degli
ordini possa venire inserita nel report finale, il valore del campo
OggettoRicercato deve essere all' interno della lista degli oggetti
restituita dalla subquery. Per chiarire meglio la cosa si può vederla in
questo modo: la subquery ritorna un set di oggetti con i quali vengono
confrontati gli oggetti presenti nella colonna OggettoRicercato e la
condizione di inclusione diventa vera solo se il valore del campo
OggettoRicercato è presente nella lista ritornata dalla subquery
- Inoltre tenete ben presente che quando usate le clausole IN, "= ANY", o "= SOME"
NON potete fare riferimento a più colonne diverse. sono i valori che
vengono restituiti a potere essere differenti , e il confronto può venire
fatto tra valori differenti contenuti in ogni RIGA ma NON in colonne
differenti. il viceversa non e' possibile.
Ok, penso che abbiamo
discusso in maniera ampia e dettagliata del comando SELECT e penso che dovreste
essere a questo punto in grado di arrivare a fare query di selezione decisamente
complesse, per cui passiamo agli altri comandi di SQL
di
|