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 |
+-------+