Les résultats de deux requêtes peuvent être combinés en utilisant les opérations d'ensemble : union, intersection et différence. La syntaxe est
requete1
UNION [ALL]requete2
requete1
INTERSECT [ALL]requete2
requete1
EXCEPT [ALL]requete2
où requete1
et
requete2
sont les requêtes pouvant utiliser
toutes les fonctionnalités discutées ici.
UNION
ajoute effectivement le résultat de
requete2
au résultat de
requete1
(bien qu'il n'y ait pas de garantie
qu'il s'agisse de l'ordre dans lequel les lignes sont réellement renvoyées). De
plus, il élimine les lignes dupliquées du résultat, de la même façon que
DISTINCT
, sauf si UNION ALL
est utilisée.
INTERSECT
renvoie toutes les lignes qui sont à la fois dans le
résultat de requete1
et dans le résultat de
requete2
. Les lignes dupliquées sont éliminées
sauf si INTERSECT ALL
est utilisé.
EXCEPT
renvoie toutes les lignes qui sont dans le résultat de
requete1
mais pas dans le résultat de
requete2
(ceci est quelquefois appelé la
différence entre deux requêtes). De nouveau, les lignes
dupliquées sont éliminées sauf si EXCEPT ALL
est utilisé.
Pour calculer l'union, l'intersection ou la différence de deux requêtes, les deux requêtes doivent être « compatibles pour une union », ce qui signifie qu'elles doivent renvoyer le même nombre de colonnes et que les colonnes correspondantes doivent avoir des types de données compatibles, comme décrit dans la Section 10.5.
Les opérations sur les ensembles peuvent être combinées, par exemple :
requete1
UNIONrequete2
EXCEPTrequete3
qui est équivalent à :
(requete1
UNIONrequete2
) EXCEPTrequete3
Comme indiqué ici, vous pouvez utiliser les parenthèses pour contrôler
l'ordre d'évaluation. Sans les parenthèses, UNION
et
EXCEPT
font une association de gauche à droite, mais
INTERSECT
a une priorité plus forte que ces deux
opérateurs. De ce fait :
requete1
UNIONrequete2
INTERSECTrequete3
signifie
requete1
UNION (requete2
INTERSECTrequete3
)
Vous pouvez aussi entourer une requête
individuelle avec des parenthèses. C'est important si la
requête
a besoin d'utiliser une des clauses
discutées dans les sections suivantes, telles que
LIMIT
. Sans les parenthèses, vous obtiendrez soit une
erreur de syntaxe soit une interprétation de cette clausse comme
s'appliquant à la sortie de l'opération ensembliste plutôt que sur une de
ses entrées. Par exemple :
SELECT a FROM b UNION SELECT x FROM y LIMIT 10
est acceptée, mais signifie :
(SELECT a FROM b UNION SELECT x FROM y) LIMIT 10
et non pas :
SELECT a FROM b UNION (SELECT x FROM y LIMIT 10)