Alias, In e l' utilizzo delle Subquery

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 :

  1. 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
  2. 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 
  3. 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)
  4. 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
  5. 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