Les opérateurs ensemblistes
Un ensemble est une collection d’éléments distincts
- Un ensemble de lignes ne peut contenir 2 lignes dont les attributs, considérés 2 à 2, ont la même valeur
Une collection de lignes dont les éléments ne sont pas distincts constitue un multi-ensemble
- Une requête dont la liste d’éléments de la clause
SELECT
n’inclut pas tous les éléments d’un identifiant renvoie un multi-ensemble - Un multi-ensemble peut se réduire si nécessaire à un ensemble par le modifieur
DISTINCT
UNION
Si une même ligne apparaît dans chacune des 2 collections de lignes en argument de l’opérateur UNION
, cette ligne n’apparaîtra qu’une seule fois dans l’ensemble résultat
Remarque : Les arguments de l’opérateur UNION peuvent être des multi-ensembles, auxquels cas les doublons sont égalements éliminés
Soit les deux requêtes suivantes :
1SELECT ville2FROM Clients3WHERE categorie = 'A1' ;
Clients |
---|
ville |
Meylan |
1SELECT ville2FROM Clients3WHERE compte < 0 ;
Clients |
---|
ville |
Paris |
Lyon |
Paris |
Paris |
L’union de ces deux requêtes est la suivante :
1SELECT ville2FROM Clients3WHERE categorie = 'A1'4UNION5SELECT ville6FROM Clients7WHERE compte < 0 ;
Clients |
---|
ville |
Lyon |
Meylan |
Paris |
UNION ALL
Si l’on désire empêcher l’élimination des lignes en double, on utilisera l’opérateur UNION ALL
Une même ligne qui apparaît n1 fois dans le premier membre et n2 fois dans le second apparaîtra n1 + n2 dans le résultat, comme le montre la requête suivante :
1SELECT ville2FROM Clients3WHERE categorie = 'A1'4UNION ALL5SELECT ville6FROM Clients7WHERE compte < 0 ;
Clients |
---|
ville |
Meylan |
Paris |
Lyon |
Paris |
Paris |
INTERSECT et EXCEPT
Les opérateurs d’intersection INTERSECT
et de différence EXCEPT
fonctionne de manière similaire à l’opérateur UNION
:
- L’opérateur
INTERSECT
construit l’ensemble des éléments simultanément présents dans deux collections - L’opérateur
EXCEPT
construit l’ensemble des éléments appartenant à la première collection mais pas à la seconde
Remarque : Munis de la clause ALL, ces opérateurs préservent les lignes en doubles. Pour une même ligne respectivement en n1
et n2
exemplaires dans chaque argument :
INTERSECT ALL
produiramin(n1, n2)
exemplaires de cette ligneEXCEPT ALL
produiramax(n1 - n2, 0)
exemplaires de cette ligne
Les opérateurs d’intersection et de différence entre deux ensembles de lignes ne sont pas strictement indispensables dans la mesure ou ils peuvent être exprimés par des requête standards :
- L’intersection ensembliste de 2 tables est obtenue par leur jointure, car celle-ci reprend les éléments qui sont simultanément présents dans ces tables
- La différence ensembliste s’exprimera par le prédicat
NOT IN
dont la sous-requête définit les éléments de la seconde collection