Retour à la liste des articles Articles
9 minutes de lecture

Que font les clauses SQL INTERSECT et MINUS ?

Connaissez-vous la différence entre les clauses INTERSECT et MINUS de SQL et comment les utiliser ? Vous trouverez des exemples et des explications dans cet article.

SQL INTERSECT et MINUS sont des clauses utiles pour trouver rapidement la différence entre deux tables et trouver les lignes qu'elles partagent.

INTERSECT compare les données entre les tables et renvoie uniquement les lignes de données qui existent dans les deux tables.

MINUS compare les données entre les tables et renvoie les lignes de données qui existent uniquement dans la première table que vous spécifiez.

SQL INTERSECT et MINUS (ou EXCEPT, selon votre dialecte SQL) font partie du cours de base SQL de LearnSQL.fr.

INTERSECT SQL

L'opérateur SQL INTERSECT est utilisé pour renvoyer les résultats de deux ou plusieurs instructions SELECT. Cependant, il ne renvoie que les lignes sélectionnées par toutes les requêtes ou ensembles de données. Si un enregistrement existe dans une requête et pas dans l'autre, il sera omis des résultats de INTERSECT.

Le nombre et l'ordre des colonnes doivent être les mêmes dans toutes les requêtes SELECT.

Les types de données des colonnes doivent être identiques, ou du moins compatibles entre eux. INTERSECT filtre les doublons et ne renvoie que les lignes distinctes qui sont communes à toutes les requêtes.

Voici la syntaxe de l'opérateur INTERSECT:

SELECT column_1 [, column_2, …, column_n]
FROM table_1 [, table_2, …, table_n]
[WHERE condition]

INTERSECT

SELECT column_1 [, column_2, …, column_n]
FROM table_1 [, table_2, …, table_n]
[WHERE condition]

Tout ce qui se trouve entre les crochets est entièrement facultatif. Le concept de INTERSECT est expliqué plus en détail par le schéma suivant :

INTERSECT

La requête INTERSECT renvoie les enregistrements figurant dans la zone ombrée. Ce sont les enregistrements qui existent dans les deux ensembles de données.

INTERSECT est un moyen parmi d'autres de fusionner les résultats de différentes requêtes SQL. Si vous souhaitez en savoir plus, cet article présente les différentes méthodes permettant de combiner les résultats de requêtes SQL.

SQL MINUS

La clause SQL MINUS est utilisée pour combiner deux instructions SELECT, mais elle renvoie les lignes de la première instruction SELECT qui ne sont pas renvoyées par la seconde instruction SELECT. La clause SQL MINUS renvoie uniquement les lignes qui ne sont pas disponibles dans la deuxième instruction SELECT.

Chaque instruction SELECT au sein d'une requête MINUS doit contenir le même nombre de champs dans les ensembles de résultats ainsi que des types de données similaires.

L'opérateur MINUS n'est pas pris en charge par toutes les bases de données SQL. Il peut être utilisé dans des bases de données comme MySQL et Oracle. Pour les bases de données telles que SQL Server, PostgreSQL et SQLite, utilisez l'opérateur EXCEPT pour effectuer ce type de requête.

SELECT column_1 [, column_2, …, column_n]
FROM table_1 [, table_2, …, table_n]
[WHERE condition]

MINUS

SELECT column_1 [, column_2, …, column_n]
FROM table_1 [, table_2, …, table_n]
[WHERE condition]

Le code SQL figurant entre les crochets est entièrement facultatif. Le concept de SQL MINUS est expliqué plus en détail par ce diagramme :

MINUS

La requête MINUS renvoie les enregistrements dans la zone rouge. Il s'agit des enregistrements qui existent dans le premier ensemble de données et non dans le second.

MINUS et INTERSECT : Exemples

Appliquons les clauses INTERSECT et MINUS à un exemple pratique. Imaginons que nous ayons les tableaux suivants.

customers - Contient des informations sur nos clients

idcustomer_namecountry
1Infotech SolutionsGermany
2Corpway IndustriesIreland
3Fenway IncEngland
4Fairview LtdFrance

suppliers - Contient des informations sur nos fournisseurs.

idcustomer_namecountry
1Carbon Way SuppliersSpain
2Alloy IncFrance
3Materials Delivered LtdIreland
4Concrete CrewPoland
5Conglorito SystemsItaly

Rédigeons maintenant une requête INTERSECT. Nous voulons trouver les pays que nos fournisseurs et nos clients ont en commun.

SELECT country
FROM customers
INTERSECT
SELECT country
FROM suppliers

Nous spécifions la colonne pays dans chaque clause SELECT. L'exécution de cette requête donne le jeu de données suivant :

country
France
Ireland

Si vous regardez en arrière sur les pages customers et suppliers nous pouvons constater que ce résultat est correct. Seuls les pays de France et d'Irlande sont partagés entre les tables.

Appliquons maintenant l'opérateur MINUS aux mêmes tableaux. Cela nous permettra d'obtenir les pays de notre table customers qui ne sont pas dans notre table suppliers dans notre table :

SELECT country
FROM customers
MINUS
SELECT country
FROM suppliers

L'exécution de cette requête donne le résultat suivant :

country
England
Germany

Et voilà : les pays qui sont uniques à notre customers table. L'ordre de vos clauses SELECT est très important ici, et c'est quelque chose dont vous devez tenir compte lorsque vous utilisez l'opérateur MINUS. Inversons l'ordre de nos clauses SELECT et voyons ce qui se passe.

SELECT country
FROM suppliers
EXCEPT
SELECT country
FROM customers

L'exécution de cette requête donne les données suivantes :

country
Italy
Poland
Spain

Comme vous pouvez le constater, notre ensemble de résultats est très différent. SQL commence par notre table suppliers et supprime ensuite tous les pays qui existent dans la table customers dans la table.

Si vous vous sentez dépassé, envisagez d'essayer le parcours Les Fondamentaux de SQL de LearnSQL.com, qui vous fournira des bases solides en SQL. Vous y apprendrez les instructions SQL de base telles que WHERE, GROUP BY, ORDER BY et HAVING. Vous apprendrez également à JOIN tables et à ajouter, modifier ou supprimer des données d'une base de données.

Il s'agissait d'un exemple simple vous montrant comment les opérateurs INTERSECT et MINUS peuvent être utilisés pour récupérer rapidement des ensembles de données distincts. Examinons d'autres exemples qui vous montrent comment ces opérateurs agissent dans trois scénarios différents :

  • Une table est le sous-ensemble des données de l'autre table.
  • Les deux tables contiennent les mêmes données.
  • L'une des tables de votre requête ne contient aucune donnée.

Autres exemples SQL INTERSECT et MINUS

Une table est un sous-ensemble des données de l'autre table

Pour ce scénario, imaginons que nous ayons deux tables appelées employees et planning_committee. Comme vous pouvez le constater, la table planning_committee est un sous-ensemble de employeesce qui signifie que toutes ses données sont également contenues dans la table employees.

employees - Tous les employés de notre entreprise.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

planning_committee - Tous les employés du comité de planification de notre entreprise.

employee_idfirst_namelast_name
415938JaneRamsey
783273AndrewJohnson

Voyons comment la clause INTERSECT se comporte dans ce scénario.

SELECT employee_id, first_name, last_name
FROM employees
INTERSECT
SELECT employee_id, first_name, last_name
FROM planning_committee

L'ensemble de données suivant est renvoyé :

employee_idfirst_namelast_name
415938JaneRamsey
783273AndrewJohnson

Comme vous pouvez le constater, seul le sous-ensemble est renvoyé. Ceci est dû au fait que la table planning_committee est un sous-ensemble de la table employees et le résultat sera donc simplement le tableau planning_committee tableau.

Que se passe-t-il si nous utilisons la clause MINUS à la place ? Imaginons que nous voulions trouver tous les employés qui ne font pas partie du comité de planification. Cela peut être réalisé en écrivant la requête ci-dessous :

SELECT employee_id, first_name, last_name
FROM employees
MINUS
SELECT employee_id, first_name, last_name
FROM planning_committee

L'exécution de cette requête donne le résultat suivant :

employee_idfirst_namelast_name
321873JohnSmith
832923ChristinaGrey

Vous pouvez voir que ces employés ne sont pas dans le tableau planning_committee et c'est le résultat souhaité ! Une fois encore, l'ordre des tableaux est important. Si nous inversions l'ordre des clauses de SELECT comme suit ...

SELECT employee_id, first_name, last_name
FROM planning_committee
EXCEPT
SELECT employee_id, first_name, last_name
FROM employees

... l'exécution de cette requête donnerait un résultat très différent :

employee_idfirst_namelast_name

Puisque toutes les données de la table planning_committee sont contenues dans la table employees rien n'est renvoyé. SQL MINUS ne renvoie que des données distinctes.

Il est temps d'examiner notre prochain scénario.

Les deux tables contiennent les mêmes données

Il peut y avoir une situation où deux tables SQL ont des données identiques. Comment les clauses INTERSECT et MINUS gèrent-elles cette situation, et à quels résultats devez-vous vous attendre ? Nous allons le découvrir !

Pour ce scénario, nous allons utiliser les tables suivantes :

payroll - Tous les employés actuellement inscrits sur la liste de paie de notre entreprise.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

employees - Tous les employés de notre entreprise.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

Vous pouvez constater que tous les employés de notre entreprise sont actuellement payés et qu'ils sont rémunérés comme il se doit. Par conséquent, ces tableaux contiennent des données identiques.

Voyons comment la clause INTERSECT traite ce cas :

SELECT employee_id, first_name, last_name
FROM employees
INTERSECT
SELECT employee_id, first_name, last_name
FROM payroll

L'exécution de cette requête renvoie ce résultat :

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

Puisque toutes les données ont été partagées entre les deux tables, tout est retourné !

Voyons maintenant comment la clause MINUS traite les tables qui partagent des données identiques :

SELECT employee_id, first_name, last_name
FROM employees
MINUS
SELECT employee_id, first_name, last_name
FROM payroll

L'exécution de cette requête donne le résultat suivant :

employee_idfirst_namelast_name

Aucune donnée n'est renvoyée ! SQL commence par sélectionner les données de notre employees et soustrait ensuite les données qui existent dans la table. payroll table. Dans ce cas, tout est supprimé.

Cela nous amène à notre dernier scénario. Que se passe-t-il si l'une des tables faisant partie d'une clause INTERSECT ou MINUS ne contient aucune donnée ?

Une table ne contient pas de données

Pour ce scénario, nous allons utiliser les tables suivantes :

employees - Tous les employés de notre entreprise.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

on_vacation - Tous les employés de notre entreprise actuellement en vacances.

employee_idfirst_namelast_name

Voyons comment la clause INTERSECT traite une table vide :

SELECT employee_id, first_name, last_name
FROM employees
INTERSECT
SELECT employee_id, first_name, last_name
FROM on_vacation

Nous obtenons le résultat suivant après avoir exécuté cette requête :

employee_idfirst_namelast_name

Aucun résultat ! Lorsque nous utilisons une table vide dans le cadre de la clause INTERSECT, nous obtenons un ensemble de données vide. Cela est dû au fait qu'aucune correspondance n'a pu être trouvée entre les deux tables.

La façon dont la clause MINUS est affectée par l'inclusion d'une table vide dépend entièrement de l'ordre que vous spécifiez. Par exemple, cette requête ...

SELECT employee_id, first_name, last_name
FROM employees
MINUS
SELECT employee_id, first_name, last_name
FROM on_vacation

... donne le résultat suivant :

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

La clause MINUS a ici très peu d'effet, car vous ne supprimez essentiellement rien (un ensemble de données vide) de la table employees table.

Toutefois, si nous inversons l'ordre des clauses de SELECT, comme suit ...

SELECT employee_id, first_name, last_name
FROM on_vacation
MINUS
SELECT employee_id, first_name, last_name
FROM employees

... nous obtenons un résultat très différent :

employee_idfirst_namelast_name
Smith

Encore un ensemble de données vide ! Ceci est dû au fait que la première clause SELECT récupère les données de la table on_vacation qui, dans ce cas, ne sont rien. Nous demandons ensuite à SQL de retirer les employees données de notre ensemble de données vide. Cela n'a aucun effet, puisque l'ensemble de données est déjà vide !

INTERSECT, MINUS et autres opérateurs d'ensembles SQL

Dans cet article, nous avons traité en détail les clauses SQL INTERSECT et MINUS. Ces opérateurs sont connus sous le nom d'opérateurs d'ensemble SQL, qui comprennent également UNION et UNION ALL. Vous pouvez lire une introduction aux opérateurs d'ensemble SQL ici, ainsi que la façon d'affiner les résultats avec les opérateurs d'ensemble.