Les opérateurs ensemblistessuivant

Les opérateurs ensemblistes permettent de "joindre" des tables verticalement c'est-à-dire de combiner dans un résultat unique des lignes provenant de deux interrogations. Les lignes peuvent venir de tables différentes mais après projection on doit obtenir des tables ayant même schéma de relation.

Les opérateurs ensemblistes sont les suivants :

  • l'union : UNION 
  • l'intersection : INTERSECT 
  • la différence relationnelle : MINUS 
La syntaxe d'utilisation est la même pour ces trois opérateurs :
SELECT ...   
{UNION | INTERSECT | MINUS } 
SELECT ...
Dans une requête utilisant des opérateurs ensemblistes :
  • Tous les SELECT doivent avoir le même nombre de colonnes sélectionnées, et leur types doivent être un à un identiques. Les conversions éventuelles doivent être faites à l'intérieur du SELECT à l'aide des fonctions de conversion.
  • Les doubles sont éliminés (DISTINCT implicite).
  • Les noms de colonnes (titres) sont ceux du premier SELECT.
  • La largeur des colonnes est la plus grande parmi tous les SELECT.
  • Dans une requête on ne peut trouver qu'un seul ORDER BY. S'il est présent, il doit être mis dans le dernier SELECT et il ne peut faire référence qu'aux numéros des colonnes et non pas à leurs noms (car les noms peuvent être différents dans chacune des interrogations).
L'on peut combiner le résultat de plus de deux SELECT au moyen des opérateurs UNION, INTERSECT, MINUS.
SELECT ... UNION SELECT ... MINUS SELECT ...
Dans ce cas l'expresion est évaluée de gauche à droite, mais on peut modifier l'ordre d'évaluation en utilisant des parenthèses.
SELECT ... 
UNION  (SELECT ... 
        MINUS  
        SELECT ...)

Les requêtes composées permettent de lier différentes requêtes par l'intermédiaire d'opérateurs spéciaux.

SELECT tab1.nom_champ FROM nom_table AS tab1
UNION | UNION ALL | INTERSECT | EXCEPT
SELECT tab2.nom_champ FROM nom_table AS tab2
[ORDER BY];

L'opérateur UNION permet de récupérer l'ensemble des enregistrements retournés par les deux requêtes. Les doublons ne sont pas pris en compte.

SELECT tab1.nom_champ FROM nom_table AS tab1
UNION
SELECT tab2.nom_champ FROM nom_table AS tab2

Evidemment, ce genre de requête composée ne s'applique qu'à des champs sélectionnés identiques.

L'opérateur UNION ALL contrairement à l'opérateur précédent retourne tous les enregistrements y compris les doublons.

SELECT tab1.nom_champ FROM nom_table AS tab1
UNION ALL
SELECT tab2.nom_champ FROM nom_table AS tab2

L'opérateur INTERSECT [ ALL ] retourne uniquement les enregistrements communs de la première requête à ceux de la seconde.

SELECT tab1.nom_champ FROM nom_table AS tab1
INTERSECT
SELECT tab2.nom_champ FROM nom_table AS tab2

L'opérateur EXCEPT ou MINUS retourne seulement les enregistrements différents de la première table à ceux de la seconde table.

SELECT tab1.nom_champ FROM nom_table AS tab1
EXCEPT
SELECT tab2.nom_champ FROM nom_table AS tab2

La clause ORDER BY applicable à l'ensemble des requêtes, permet d'ordonner les réponses selon une des colonnes à sélectionner.

SELECT tab1.nom_champ, tab1.nom_champ2 FROM nom_table AS tab1
EXCEPT
SELECT tab2.nom_champ, tab2.nom_champ2 FROM nom_table AS tab2
ORDER BY 2;
Exemple
SELECT * FROM
  ( SELECT num_cmd FROM tbl_vente_magasin WHERE date = SYSDATE - 7
    UNION
    SELECT num_cmd FROM tbl_vente_internet WHERE date = SYSDATE - 7 );

SELECT * FROM tbl_produit
UNION ALL
SELECT * FROM vue_nouv_prod
  WHERE accord = 'true'

SELECT nom, prenom FROM tbl_employe
INTERSECT
SELECT nom, prenom FROM tbl_client

SELECT *
  FROM
  ( SELECT num_produit, designation, quantite FROM tbl_stock
    MINUS
    SELECT num_produit, designation, quantite
      FROM tbl_commande WHERE date_cmd = SYSDATE - 2 );