all’interno di un database relazionale può essere utile poter identificare, rapidamente, i record di una tabella che non trovano corrispondenza all’interno di un’altra tabella usualmente utilizzata per delle JOIN. Per fare ciò, in pratica, dovremo confrontare due tabelle, concepite per essere legate da un vincolo di JOIN, ed estrarre tutti i record privi di un collegamento.
Per fare un esempio supponiamo di avere un database con due tabelle così strutturate:
- utenti
- id
- username
- password
- anagrafica
- id_utente
- nome
- cognome
- indirizzo
- cap
- citta
- provincia
Nella tabella "utenti" vengono memorizzati i dati di accesso di tutti gli utenti abilitati, mentre nella tabella "anagrafica" vengono registrati i dati anagrafici degli utenti che hanno completato il proprio profilo.
Le due tabelle sono concettualmente legate tra loro da una relazione in quanto il campo "id_utente" dela tabella "anagrafica" è utilizzato per creare delle JOIN con il campo "id" della tabella "utenti".
Ora supponiamo di voler identificare, attraverso una query SQL, tutti gli utenti che non hanno completato il profilio, cioè tutti i record della tabella "utenti" che non hanno un corrispettivo nella tabella "anagrafica".
Per farlo possiamo utilizzare differenti query:
1) Utilizziamo una LEFT JOIN
SELECT u.id FROM utenti AS u LEFT JOIN anagrafica AS a ON u.id = a.id_utente WHERE a.nome IS NULL
2) Utilizziamo una subquery
SELECT id FROM uteni WHERE id NOT IN ( SELECT id_utente FROM anagrafica )
oppure:
SELECT id FROM utenti WHERE NOT EXISTS ( SELECT * FROM anagrafica WHERE utenti.id = anagrafica.id_utente )
In tutti i casi otterremo in risposta dal DBMS un elenco egli identificativi della tabella "utenti" che non trovano nessuna corrispondenza in "anagrafica".
Negli esempi visi sopra abbiamo utilizzato delle query per effettuare delle SELECT ma nulla vieta, ad esempio, di utilizzare le medesime tecniche per effettuare delle cancellazioni. Si supponga, ad esempio, di voler cancellare tutti gli utenti del sito che non hanno compilato una scheda anagrafica. Per farlo sarà sufficiente lanciare la seguente query:
DELETE FROM utenti WHERE NOT EXISTS ( SELECT * FROM anagrafica WHERE utenti.id = anagrafica.id_utente )
L’istruzione qui sopra effettuerà la cancellazione di tutti i record della tabella "utenti" che non trovano corrispondenza nella tabella "anagrafica".