Retour à la liste des articles Articles
7 minutes de lecture

UNION et UNION ALL en SQL : Ce qu'ils font et en quoi ils sont différents

Dans cet article, nous allons explorer les clauses SQL UNION et UNION ALL. Apprenez ce qu'elles font et quand utiliser chacune d'elles.

J'étais analyste depuis probablement quatre ans avant de connaître la clause SQL UNION ALL. J'utilisais régulièrement UNION, mais je n'avais jamais entendu parler de son homologue. Puis un jour, quand j'ai entendu un collègue en parler. Je me suis dit : "De quoi parle-t-il ? C'est quelque chose de nouveau ? " J'ai donc fait ce que tout bon analyste aurait fait et j'ai cherché sur Google. J'ai eu le cœur brisé. J'avais probablement, à plus d'une reprise, utilisé la mauvaise clause dans mes analyses.

Après l'université, j'ai appris le SQL en autodidacte. Le résultat était une compréhension incomplète de la syntaxe que j'utilisais. Au cours de votre apprentissage, je vous recommande vivement de suivre des cours formels afin d'être sûr de bien comprendre les requêtes que vous écrivez. Un excellent moyen d'y parvenir est de suivre la formation SQL pour les débutants cours. Ne commettez pas les mêmes erreurs que moi au début de ma carrière. Suivez les cours de professionnels et acquérez une solide connaissance de base de SQL.

Je m'avance un peu. Prenons un peu de recul et parlons de ce que font UNION et UNION ALL en SQL.

UNION

Il arrive qu'un analyste ait besoin de combiner les résultats de plusieurs requêtes. Cela peut être dû au fait que les données se trouvent dans des tables différentes ou que vous avez des requêtes existantes que vous devez maintenant transformer en une seule. Quelle que soit la raison, la solution la plus simple est d'utiliser UNION. Illustrons cela par un exemple.

Exemple 1 - UNION

Dans cet exemple, nous imaginons que nous travaillons à l'analyse des données d'un site Web. La table sur laquelle nous allons travailler s'appelle button_clicks. Cette table contient tous les événements de clics que nous suivons sur notre site Web. Elle ressemble à ceci :

user_idtimestamplabel
1364782022-12-01 09:15:34continue
1364782022-12-01 09:15:34continue
1827362022-12-01 09:17:03submit
2736472022-12-01 09:18:00back
3475892022-12-01 09:21:48continue

Nous allons également travailler avec une table appelée : navigation_clicks. Ce tableau contient tous les événements de clics qui se produisent dans le menu de navigation du site Web. Elle se présente comme suit :

user_idtimestampnavigation_link
1364782022-12-01 09:10:15home
1364782022-12-01 09:12:12about_us
1827362022-12-01 09:17:59store
2736472022-12-01 09:21:30home
3475892022-12-01 09:18:17blog

Imaginons que notre responsable vienne nous voir et nous dise qu'il a besoin d'une liste de tous les clics de bouton sur le site Web. C'est assez facile. Nous allons simplement nous exécuter :

SELECT *
FROM button_clicks

Cependant, il revient vers nous quelques minutes plus tard et nous demande d'inclure les clics de navigation dans notre rapport. Cela semble assez simple, mais comment faire ? En utilisant la clause UNION. Pour combiner les résultats de ces deux requêtes ensemble, nous allons exécuter :

SELECT *
FROM button_clicks
	
	UNION

SELECT *
FROM navigation_clicks

Comme vous pouvez le voir, la clause UNION se place entre les deux requêtes SELECT. La requête située de part et d'autre de la clause UNION doit être exécutée comme une requête autonome. Cette requête renverra le résultat suivant :

user_idtimestamplabel
1364782022-12-01 09:15:34continue
1827362022-12-01 09:17:03submit
2736472022-12-01 09:18:00back
3475892022-12-01 09:21:48continue
1364782022-12-01 09:10:15home
1364782022-12-01 09:12:12about_us
1827362022-12-01 09:17:59store
2736472022-12-01 09:21:30home
3475892022-12-01 09:18:17blog

Nous avons pris les résultats de deux requêtes distinctes et les avons placés l'un au-dessus de l'autre. Nous voyons que les 4 premières lignes contiennent les résultats de la première requête et que les 5 lignes suivantes contiennent les résultats de la seconde requête.

Mais attendez... nos tables combinées contiennent 10 lignes, alors pourquoi n'avons-nous retourné que 9 lignes ? C'est parce que UNION supprime les doublons des résultats. Les deux premières lignes de la table button_clicks sont exactement les mêmes, donc notre UNION n'en a retourné qu'une seule.

Renommer les colonnes dans UNION

Dans l'ensemble de résultats ci-dessus, remarquez les noms des colonnes. Dans le tableau button_clicks, la troisième colonne est label, mais dans le tableau navigation_clicks la troisième colonne est navigation_label. Lorsque nous utilisons UNION, les noms des colonnes proviennent des noms des colonnes de la première requête, ce que nous voyons ci-dessus. Si vous le souhaitez, vous pouvez toujours ajouter des alias aux colonnes pour les renommer à votre guise.

Par exemple, si nous voulons changer le nom de la troisième colonne en button_or_navigation_label, nous devons l'exécuter :

SELECT user_id, 
	 timestamp,
       label AS button_or_navigation_label
FROM button_clicks
	
	UNION

SELECT user_id, 
	 timestamp,
       navigation_label AS button_or_navigation_label
FROM navigation_clicks

Exemple #2 - Utiliser le même nombre de colonnes dans UNION

Voyons un autre exemple d'utilisation de UNION. Tout d'abord, nous allons apporter une légère modification à notre table navigation_clicks table. Nous allons ajouter une colonne supplémentaire de sorte que notre tableau ressemble maintenant à ceci :

user_idtimestampnavigation_linknavigation_level
1364782022-12-01 09:10:15homemain
1364782022-12-01 09:12:12about_ussub
1827362022-12-01 09:17:59storesub
2736472022-12-01 09:21:30homemain
3475892022-12-01 09:18:17blogsub

Si nous essayons d'exécuter à nouveau notre requête originale UNION, nous obtiendrons une erreur du type Each UNION query must have the same number of columns. Cela est dû au fait que nous sélectionnons toutes les colonnes de chaque table, mais le nombre de colonnes dans les tables est maintenant différent. Pour résoudre ce problème, nous devrons nommer explicitement les colonnes que nous souhaitons renvoyer. En outre, le nombre de colonnes renvoyées par chaque requête doit être le même et le type doit correspondre. Si la troisième colonne de la première requête est une chaîne, la troisième colonne de l'autre requête doit également être une chaîne.

Pour éviter toute erreur, nous allons exécuter :

SELECT user_id, 
 timestamp,
 label
FROM button_clicks
	
	UNION

SELECT user_id, 
 timestamp,
 	 navigation_label
FROM navigation_clicks

Cela donnera les mêmes résultats que notre premier exemple UNION.

Exemple n° 3 - UNION ALL

Maintenant que nous avons compris UNION, voyons un exemple utilisant UNION ALL. Comme mentionné précédemment, UNION supprime les doublons des résultats de notre requête. UNION ALL ne le fera pas.

Continuons sur la base de notre exemple précédent. Notre responsable est venu nous demander un rapport contenant tous les clics de boutons et de navigation sur le site Web. Nous avons ensuite confirmé que le rapport devait inclure les doublons.

Puisque vous savez déjà comment utiliser UNION, pouvez-vous deviner comment nous allons procéder ? C'est exact - nous allons simplement remplacer UNION par UNION ALL:

SELECT user_id, 
 timestamp,
 label
FROM button_clicks
	
	UNION ALL

SELECT user_id, 
 timestamp,
 	 navigation_label
FROM navigation_clicks
user_idtimestamplabel
1364782022-12-01 09:15:34continue
1364782022-12-01 09:15:34continue
1827362022-12-01 09:17:03submit
2736472022-12-01 09:18:00back
3475892022-12-01 09:21:48continue
1364782022-12-01 09:10:15home
1364782022-12-01 09:12:12about_us
1827362022-12-01 09:17:59store
2736472022-12-01 09:21:30home
3475892022-12-01 09:18:17blog

Il y a les 10 lignes. Comme vous pouvez le voir, UNION ALL a conservé tous les résultats, même s'il y a des doublons.

Nos exemples n'ont inclus qu'une seule déclaration UNION ou UNION ALL, mais il n'y a pas de limite au nombre de requêtes que vous pouvez réunir.

Pour un dernier exemple, supposons que nous voulions également inclure une table appelée form_clicks. Nous ne sommes pas préoccupés par les doublons, nous continuerons donc à utiliser UNION ALL:

SELECT user_id, 
 timestamp,
 label
FROM button_clicks
	
	UNION ALL

SELECT user_id, 
 timestamp,
 	 navigation_label
FROM navigation_clicks

UNION ALL

SELECT user_id, 
 timestamp,
 	 form_label
FROM form_clicks

Comme vous pouvez le constater, il s'agit exactement de la même syntaxe ; nous continuons simplement à compléter notre requête existante. Si vous souhaitez en savoir plus sur UNION ALL, n'hésitez pas à lire notre article SQL Union All!

UNION vs UNION ALL - Choisir laquelle utiliser

Il est important de comprendre qu'une requête utilisant UNION ALL s'exécutera plus rapidement que si vous utilisiez UNION. Cela est dû au fait que la clause UNION trie les données et supprime les doublons. En fonction de la quantité de données que vous interrogez, cela peut ajouter une quantité décente de temps d'exécution à votre requête.

Pour décider de la clause à utiliser, il suffit de se poser la question suivante :

  1. Dois-je supprimer les valeurs en double ?
    1. Si oui, utilisez UNION.
    2. Si non (ou si cela n'a pas d'importance), utilisez UNION ALL.

C'est beaucoup, alors prenons le temps de réviser ! UNION et UNION ALL sont toutes deux des clauses utilisées pour combiner plusieurs requêtes en un seul ensemble de résultats. UNION supprimera les doublons, alors que UNION ALL ne le fera pas. UNION ALL s'exécute plus rapidement pour cette raison. Voici un autre excellent article sur les opérations de set SQL pour vous aider à renforcer et à développer ce que vous venez d'apprendre.

Bon travail ! Vous avez maintenant une bonne compréhension de UNION et UNION ALL et vous pouvez décider en connaissance de cause laquelle utiliser dans vos analyses. Vous avez déjà plusieurs longueurs d'avance sur ce que je faisais lorsque j'apprenais ! N'hésitez pas à consulter notre SQL pour les débutants et poursuivez votre parcours pour devenir un rédacteur SQL expert.