Logo de kxs.frCours d'informatique pour le lycée et la prépa

Opérateurs ensemblistes

Il est possible d'effectuer des opérations ensemblistes sur les résultats de deux requêtes. Nous utiliserons uniquement les trois opérateurs suivants : UNION, INTERSECT et EXCEPT. Ces opérateurs ont un intérêt lorsque les résultats viennent de deux tables différentes car dans le cas d'une même table il est plus simple d'utiliser un opérateur logique dans la clause WHERE. Néanmoins nous utiliserons ici la même table pour illustrer le fonctionnement de ces opérateurs. Les résultats doivent avoir les même colonnes pour que ces opérateurs fonctionnent.

Pour comparaison, voici le résultat d'une requête renvoyant les années des films dans l'ordree croissant :

SELECT DISTINCT annee FROM films WHERE annee IS NOT NULL ORDER BY annee;
+-------+
| annee |
+-------+
|  1963 |
|  1986 |
|  1989 |
|  1993 |
|  1994 |
|  1995 |
|  1999 |
|  2000 |
|  2001 |
|  2002 |
|  2004 |
|  2008 |
|  2019 |
+-------+

Et voici les deux requêtes sur lesquelles nous allons travailler :

SELECT DISTINCT annee FROM films WHERE annee IS NOT NULL and annee < 2004 ORDER BY annee;
+-------+
| annee |
+-------+
|  1963 |
|  1986 |
|  1989 |
|  1993 |
|  1994 |
|  1995 |
|  1999 |
|  2000 |
|  2001 |
|  2002 |
+-------+
SELECT DISTINCT annee FROM films WHERE annee IS NOT NULL and annee > 1994 ORDER BY annee;
+-------+
| annee |
+-------+
|  1995 |
|  1999 |
|  2000 |
|  2001 |
|  2002 |
|  2004 |
|  2008 |
|  2019 |
+-------+

UNION

UNION calcule donc l'union des deux résultats :

SELECT DISTINCT annee FROM films WHERE annee IS NOT NULL and annee < 2004
UNION
SELECT DISTINCT annee FROM films WHERE annee IS NOT NULL AND annee > 1994
ORDER BY annee;
+-------+
| annee |
+-------+
|  1963 |
|  1986 |
|  1989 |
|  1993 |
|  1994 |
|  1995 |
|  1999 |
|  2000 |
|  2001 |
|  2002 |
|  2004 |
|  2008 |
|  2019 |
+-------+

INTERSECT

INTERSECT calcule donc l'intersection des deux résultats :

SELECT DISTINCT annee FROM films WHERE annee IS NOT NULL and annee < 2004
INTERSECT
SELECT DISTINCT annee FROM films WHERE annee IS NOT NULL AND annee > 1994
ORDER BY annee;
+-------+
| annee |
+-------+
|  1995 |
|  1999 |
|  2000 |
|  2001 |
|  2002 |
+-------+

EXCEPT

EXCEPT renvoie les éléments du premier résultat et retire ceux du deuxième

14) Donner le résultat de la requête suivante :

SELECT DISTINCT annee FROM films WHERE annee IS NOT NULL and annee < 2004
EXCEPT
SELECT DISTINCT annee FROM films WHERE annee IS NOT NULL AND annee > 1994
ORDER BY annee;
+-------+
| annee |
+-------+
|  1963 |
|  1986 |
|  1989 |
|  1993 |
|  1994 |
+-------+