Chi ha conoscenze di SQL sa cosa sono le JOIN. Nelle nostre guide ed in diversi articoli abbiamo spiegato come funzionano le JOIN e come è possibile creare delle relazioni fra le diverse tabelle di un database.
L’esigenza più comune soddisfatta dallo strumento JOIN è quella di individuare le corrispondenze tra due tabelle; in tal caso soccorre la clausola INNER JOIN che, appunto, individua e restituisce i campi che soddisfano la corrispondenza cercata all’interno delle due o più tabelle coinvolte nella JOIN.
Decisamente meno intuitiva è l’esigenza contraria di individuare i campi che non hanno una corrispondenza all’interno della JOIN.
Facciamo un esempio. Supponiamo di dover gestire un database di un sito di e-commerce composto da due sole tabelle:
- clienti (contenente l’anagrafica della clientela)
- ordini (contenente gli ordini effettuati dai clienti)
Soddisfare la prima esigenza, come sappiamo, è piuttosto semplice:
SELECT clienti.nome, clienti.cognome
FROM clienti
INNER JOIN ordini
ON clienti.id = ordini.id_cliente
ORDER BY clienti.cognome ASC
e fin qui nessun problema.
Ma come possiamo fare per ottenere il risultato inverso? Beh… per prima cosa non utilizzeremo una INNER JOIN ma una LEFT JOIN al fine di cercare non una corrispondenza piena ma una parziale dove, comunque, i risultati della tabella di sinistra vengono restituiti ugualmente. Fatto questo andremo a cercare (mediante la clausola WHERE) i record mancanti (cioè non riscontrati all’interno della relazione) quindi identificati come NULL (nel linguaggio SQL si definisce come NULL una sorta di "valore speciale" che identifica un’assenza di valore.).
Vediamo il codice:
SELECT clienti.nome, clienti.cognome
FROM clienti
LEFT JOIN ordini
ON clienti.id = ordini.id_cliente
WHERE ordini.id_cliente IS NULL
ORDER BY clienti.cognome ASC
Il risultato sarà, appunto, l’elenco dei nominativi dei nostri clienti che non hanno mai acquistato nulla.