Union

SQL possède des opérateurs qui nous permettent de sélectionner des données issues de plusieurs ensembles. Grâce à ceux-ci, on peut réaliser des opérations sur les ensembles équivalentes à celles vues en maths au collège telles que intersection, union… Comment ça fonctionne ?

Généralités

Pour les requêtes de cet article j’utilise la base AdventureWorks de microsoft. La forme générale d’utilisation des opérateurs est:

requete 1
operateur
requete 2
ORDER BY liste

Il y a quelques règles à respecter:

  • le nombre de colonnes entre les deux requêtes doit être le même et de types compatibles
  • les sous requêtes ne peuvent utiliser de ORDER BY. Seule la requête globale le peut.
  • les noms des colonnes du résultat sont déterminés par la première requête

UNION et UNION ALL

En maths, si A et B sont des ensembles, l’union de A et de B correspond à tous les éléments de A et tous les éléments de B.En SQL, cette opération correspond à union. Elle prend la forme:

SELECT ... FROM table1 WHERE ...
UNION
SELECT ... FROM table2 WHERE

La requête

SELECT DISTINCT FirstName FROM [AdventureWorks2012].[Person].[Person] WHERE FirstName LIKE 'O%'

renvoie

Requête 1

Requête 1

La requête

SELECT DISTINCT FirstName FROM [AdventureWorks2012].[Person].[Person] WHERE FirstName LIKE '%u'

renvoie

Requête 2

Requête 2

Enfin

SELECT DISTINCT FirstName FROM [AdventureWorks2012].[Person].[Person] WHERE FirstName LIKE 'O%'
UNION
SELECT DISTINCT FirstName FROM [AdventureWorks2012].[Person].[Person] WHERE FirstName LIKE '%u'
ORDER BY FirstName

renvoie

Select distinct

UNION

La requête 1 renvoie tous les prénoms qui commencent par O. La requête 2 renvoie tous les prénoms qui terminent par u. Les deux requêtes renvoient toutes les deux le prénom Ovidiu, mais il n’apparait qu’une seule fois dans l’UNION.

Cet opérateur ne renvoie pas de doublons. Pour renvoyer les doublons, nous utilisons UNION ALL.

La requête

SELECT DISTINCT FirstName FROM [AdventureWorks2012].[Person].[Person] WHERE FirstName LIKE 'O%'
UNION ALL
SELECT DISTINCT FirstName FROM [AdventureWorks2012].[Person].[Person] WHERE FirstName LIKE '%u'
order by FirstName

renvoie

UNION ALL

UNION ALL

Le résultat contient Ovidiu deux fois car UNION ALL renvoie les doublons.

INTERSECT

INTERSECT correspond à l’intersection. Cet opérateur renvoie les lignes en commun entre les deux requêtes.

SELECT DISTINCT FirstName FROM [AdventureWorks2012].[Person].[Person] WHERE FirstName LIKE 'O%'
INTERSECT
SELECT DISTINCT FirstName FROM [AdventureWorks2012].[Person].[Person] WHERE FirstName LIKE '%u'

renvoie

INTERSECT

INTERSECT

L’intersection de la requête 1 et de la requête 2 renvoie les éléments en commun entre ces deux requêtes. Il s’agit du prénom Ovidiu.

EXCEPT

EXCEPT effectue la différence entre le résultat de la première requête et celui de la seconde. On aura donc les lignes qui apparaissent dans la première requête mais pas dans la seconde.

SELECT DISTINCT FirstName FROM [AdventureWorks2012].[Person].[Person] WHERE FirstName LIKE 'O%'
EXCEPT
SELECT DISTINCT FirstName FROM [AdventureWorks2012].[Person].[Person] WHERE FirstName LIKE '%u'
EXCEPT

EXCEPT

Cette requête renvoie le résultat de la requête 1 moins les résultat de la requête 2.

Photo credit: youkneeon on VisualHunt / CC BY

Auteur : Daniel MINKO FASSINOU