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
|