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
La requête
SELECT DISTINCT FirstName FROM [AdventureWorks2012].[Person].[Person] WHERE FirstName LIKE '%u'
renvoie
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
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
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
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'
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
Laisser un commentaire