back to top

Il contrario di una INNER JOIN: ovvero ottenere i record non corrispondenti

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)
Ora si supponga di voler estrarre due diverse liste di clienti: 1) la lista dei clienti che hanno già fatto un ordine; 2) la lista dei clienti che non hanno ancora comprato nulla.

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.

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

Leggi anche...

Come ottenere l’ID dell’ultimo record inserito in MySQL, PostgreSQL, SQL Server e Oracle?

Ottenere l'ID dell'ultimo record inserito in una tabella, dopo...

Database completo regioni, province e comuni italiani (in formato SQL)

Quando si sviluppa un sito web o un'applicazione in...

File CSV: cosa sono, come si aprono e come crearli

In questo articolo cercheremo di capire cos'รจ il formato...

Confrontare due tabelle e trovare i record senza corrispondenza

all'interno di un database relazionale può essere utile poter...

Eseguire comandi SQL online con SQL Fiddle

Sì. E' possibile testare codice SQL senza aver installato...

SQL: Calcolare la media dei valori di più campi

Attraverso una semplice query SQL è possibile calcolare dinamicamente...
Pubblicitร