Comandi SQL Vari: UNION ed Outer Joins

 

(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...