4th Jul 2022 9 minutes de lecture Que font les clauses SQL INTERSECT et MINUS ? Andrew Bone sql apprendre sql intersect minus Table des matières INTERSECT SQL SQL MINUS MINUS et INTERSECT : Exemples Autres exemples SQL INTERSECT et MINUS Une table est un sous-ensemble des données de l'autre table Les deux tables contiennent les mêmes données Une table ne contient pas de données INTERSECT, MINUS et autres opérateurs d'ensembles SQL 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 : 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 : 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. Tags: sql apprendre sql intersect minus