A savoir : cette commande s’appelle différemment selon les Systèmes de Gestion de Base de Données (SGBD) :
- EXCEPT : PostgreSQL
- MINUS : MySQL et Oracle
Syntaxe
La syntaxe d’une requête SQL est toute simple :
SELECT * FROM table1 EXCEPT SELECT * FROM table2
Schéma explicatif
Cette commande permet de récupérer les éléments de l’ensemble A sans prendre en compte les éléments de A qui sont aussi présent dans l’ensemble B. Dans le schéma ci-dessous seule la zone bleu sera retournée grâce à la commande EXCEPT (ou MINUS).
Sélection d’un ensemble avec exceptionExemple
Imaginons un système informatique d’une entreprise. Ce système contient 2 tables contenant des listes de clients:
- Une table « clients_inscrits » qui contient les prénoms, noms et date d’inscription de clients
- Une table « clients_refus_email » qui contient les informations des clients qui ne souhaitent pas être contacté par email
Cet exemple aura pour objectif de sélectionner les utilisateurs pour envoyer un email d’information. Les utilisateurs de la deuxième table ne devront pas apparaître dans les résultats.
Table « clients_inscrits » :
| id | prenom | nom | date_inscription |
|---|---|---|---|
| 1 | Lionel | Martineau | 2012-11-14 |
| 2 | Paul | Cornu | 2012-12-15 |
| 3 | Sarah | Schmitt | 2012-12-17 |
| 4 | Sabine | Lenoir | 2012-12-18 |
Table « clients_refus_email » :
| id | prenom | nom | date_refus |
|---|---|---|---|
| 1 | Paul | Cornu | 2013-01-27 |
| 2 | Manuel | Guillot | 2013-01-27 |
| 3 | Sabine | Lenoir | 2013-01-29 |
| 4 | Natalie | Petitjean | 2013-02-03 |
Pour pouvoir sélectionner uniquement le prénom et le nom des utilisateurs qui accepte de recevoir des emails informatifs. La requête SQL à utiliser est la suivante :
SELECT prenom, nom FROM clients_inscrits EXCEPT SELECT prenom, nom FROM clients_refus_email
Résultats :
| prenom | nom |
|---|---|
| Lionel | Martineau |
| Sarah | Schmitt |
Ce tableau de résultats montre bien les utilisateurs qui sont dans inscrits et qui ne sont pas présent dans le deuxième tableau. Par ailleurs, les résultats du deuxième tableau ne sont pas présent sur ce résultat final.