Dans le langage SQL la commande EXCEPT s’utilise entre 2 instructions pour récupérer les enregistrements de la première instruction sans inclure les résultats de la seconde requête. Si un même enregistrement devait être présent dans les résultats des 2 syntaxes, ils ne seront pas présent dans le résultat final.
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
Dès lors, il faut remplacer tout le reste de ce cours par MINUS pour les SGBD correspondants.
Syntaxe
La syntaxe d’une requête SQL est toute simple :
SELECT * FROM table1 EXCEPT SELECT * FROM table2
Cette requête permet de lister les résultats du table 1 sans inclure les enregistrements de la table 1 qui sont aussi dans la table 2.
Attention : les colonnes de la première requête doivent être similaires entre la première et la deuxième requête (même nombre, même type et même ordre).
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).
Exemple
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.