|
(rapida spiegazione non esaustiva)
Si possono presentare casi in cui si voglia vedere il
risultato di diverse query insieme, combinando il loro output; in questi casi si
usa l’espressione UNION. Per unire l’output delle due query seguenti, stampando
tutti gli IDAcquirente, insieme con tutti quelli che hanno mandato un ordine, si
esegua:
SELECT IDAcquirente FROM ANTICHITA UNION SELECT
IDAntiquario FROM ORDINI;
Si noti che SQL richiede che la
lista di colonne di entrambe le Select siano uguali per tipo, colonna per
colonna. In questo caso IDAcquirente ed IDAntiquario sono dello stesso tipo
(Interi [integer]). Si noti inoltre che SQL elimina automaticamente le righe
duplicate usando UNION (come fossero due set di dati); per le query singole si
deve usare DISTINCT.
L’outer join, (join esterno) si usa quando una join fra tabelle viene “unita” con le righe non
incluse nella condizione di join; questo risulta particolarmente utile se nella
query sono contenute delle costanti di tipo testo. Per esempio:
SELECT IDAntiquario, 'presente in Ordini ed
Antichita' FROM ORDINI, ANTICHITA WHERE IDAntiquario =
IDAcquirente UNION SELECT IDAcquirente, 'presente solo in
Antichita' FROM ANTICHITA WHERE IDAcquirente NOT
IN (SELECT
IDAntiquario FROM ORDINI);
La prima query fa una join per
stampare tutti gli Antiquari in entrambe le tabelle, e per aggiungere un breve
commento dopo ciascun ID. La UNION combina questa lista con la successiva, che
viene generata anzi tutto richiamando gli ID non presenti nella tabella ORDINI,
infine stampando gli ID esclusi dalla condizione di join. Quindi, ciascuna riga
nella tabella ANTICHITA viene esaminata, e se l’IDAcquirente non è nella lista
di esclusione, viene stampato con il commento fra apici.
Ci possono essere modi
più semplici per generare la stessa lista di ID, ma attaccare a ciascuna riga un
commento fisso appropriato è ben più complesso se fatto in altri modi.
Questo concetto è utile in situazioni in cui una chiave
primaria viene messa in condizione di join con una chiave secondaria, ma la
chiave secondaria può essere NULL per alcune chiavi primarie. Ad esempio, in una
tabella la chiave primaria è il venditore e in un’altra è il cliente, con il
venditore riportato nella stessa riga. Se un venditore non ha clienti, il suo
nome non appare nella tabella dei clienti.
L’outer join si usa allora per ottenere
la lista di tutti i venditori,
insieme con i loro clienti, sia nel caso in cui il venditore abbia clienti sia
nel caso in cui non ne abbia, cioè non venga stampato il nome del cliente (un
valore di NULL logico) se il venditore non ha clienti, ma è nella tabella dei
venditori. In caso contrario, il venditore sarà stampato insieme con ognuno dei
suoi clienti.
Un altro punto importante riguardo ai NULL nelle condizioni
di join: l’ordine delle tabelle nella lista successiva all’istruzione FROM è
molto importante. La regola è che SQL aggiunge la seconda tabella alla prima; se
la prima tabella presenta solo righe contenenti NULL nella colonna di join, e la
seconda tabella ha una riga con NULL nella colonna di join, tale riga non
risulta nella condizione di join, e pertanto deve venire inclusa con i dati di
riga della prima tabella. Questa è un altro esempio in cui comunemente viene
impiegato un outer join.
Il concetto di NULL è importante, e può essere proficuo
investigarlo in maniera più approfondita. >BASTA QUERY!!! O non ne avete
ancora avuto abbastanza? … adesso si passa a qualcosa del tutto differente...
di
|