SQL EXCEPT / MINUS

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).

Sélection d'un ensemble avec exception

Sélection d’un ensemble avec exception

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 » :

idprenomnomdate_inscription
1LionelMartineau2012-11-14
2PaulCornu2012-12-15
3SarahSchmitt2012-12-17
4SabineLenoir2012-12-18

Table « clients_refus_email » :

idprenomnomdate_refus
1PaulCornu2013-01-27
2ManuelGuillot2013-01-27
3SabineLenoir2013-01-29
4NataliePetitjean2013-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 :

prenomnom
LionelMartineau
SarahSchmitt

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.

Partager