SQL UNION vs UNION ALL : différences, exemples et performances testées

  1. Accueil
  2. Blog
  3. Bases de données et SQL

Bases de données et SQL

SQL UNION vs UNION ALL : Différences, exemples et performances testées

La différence entre eux est un mot, mais choisir le mauvais peut silencieusement vous donner un mauvais total. Visualisez les deux sur des données réelles, apprenez les règles qu’ils partagent et lisez ce qui s’est passé lorsque nous les avons chronométrés sur un million de lignes.

8 min de lecture
SQL UNION vs UNION ALL : différences, exemples et performances testées

À retenir

  • UNION combine les résultats et supprime les lignes en double. UNION ALL conserve chaque ligne.
  • Les coûts de déduplication fonctionnent, donc UNION ALL est généralement plus rapide à calculer.
  • Utiliser UNION avant un SUM peut supprimer silencieusement les valeurs réelles et donner une mauvaise réponse.
  • La valeur par défaut est UNION ALL, sauf si vous souhaitez spécifiquement supprimer les doublons.

Les deux opérateurs empilent les résultats de deux requêtes les uns sur les autres, donc SQL UNION vs UNION ALL peut ressembler à un choix mineur. Ce n’est pas. Un mot supplémentaire modifie à la fois votre résultat et la difficulté avec laquelle la base de données doit travailler.

Nous avons exécuté chaque requête ici dans SQLite 3.50, et les résultats et les délais affichés proviennent de ces exécutions. Le comportement de base est le SQL standard dans les principales bases de données. Cependant, les délais différeront en fonction de votre propre base de données, de vos données et de votre matériel, alors considérez le nôtre comme une illustration.

La réponse courte

UNION combine deux jeux de résultats et renvoie uniquement des lignes distinctes. UNION ALL les combine et renvoie tout, y compris les doublons. C’est toute la différence, et le reste de cet article explique pourquoi c’est important.

UNION contre UNION TOUS côte à côte

Aspect UNION UNION TOUS
Lignes en double Supprimé Conservé
Travail supplémentaire Doit trouver des doublons Aucun
Vitesse habituelle Plus lent Plus rapide
Lignes renvoyées Idem ou moins Tous
En sécurité avant SUM ou COUNT ? Souvent non Oui
Idéal pour Listes uniques Fusionner des données, des journaux, des totaux

Les exemples de données

Imaginez une boutique qui conserve les commandes en ligne et en magasin dans des tableaux séparés. Notez qu’Asha a deux commandes identiques en ligne, et une commande identique en magasin.

CREATE TABLE online_orders (customer TEXT, total INT);
CREATE TABLE store_orders (customer TEXT, total INT);

INSERT INTO online_orders VALUES ('Asha',100), ('Ben',200), ('Asha',100);
INSERT INTO store_orders VALUES ('Asha',100), ('Dev',300);

Voyez la différence

SELECT customer, total FROM online_orders
UNION
SELECT customer, total FROM store_orders;

-- Asha | 100
-- Ben  | 200
-- Dev  | 300
SELECT customer, total FROM online_orders
UNION ALL
SELECT customer, total FROM store_orders;

-- Asha | 100
-- Ben  | 200
-- Asha | 100
-- Asha | 100
-- Dev  | 300

Cinq lignes d’entrée sont devenues trois avec UNION, et les cinq sont restées avec UNION ALL. Deux choses à remarquer :

  • UNION a supprimé les doublons de l’ensemble du résultat, y compris ceux du premier tableau. Il ne s’agit pas seulement de comparer entre les tableaux.
  • Une ligne compte comme un doublon uniquement lorsque chaque colonne sélectionnée correspond.

Lorsque vous voulez vraiment une liste distincte, UNION est tout à fait exact. Cela donne à chaque client ayant acheté via l’un ou l’autre canal :

SELECT customer FROM online_orders
UNION
SELECT customer FROM store_orders;

-- Asha
-- Ben
-- Dev

Le bug du mauvais total

C’est la raison pour laquelle le choix compte vraiment. Supposons que vous souhaitiez un revenu total. Les commandes ci-dessus totalisent 800. Voyez ce que donne chaque opérateur :

SELECT SUM(total) FROM (
  SELECT total FROM online_orders
  UNION
  SELECT total FROM store_orders
);
-- 600

SELECT SUM(total) FROM (
  SELECT total FROM online_orders
  UNION ALL
  SELECT total FROM store_orders
);
-- 800

La version UNION est erronée de 200. Comme nous avons sélectionné uniquement la colonne total, trois commandes distinctes de 100 roupies ressemblaient à des doublons et étaient regroupées en une seule. Il n’y a pas de message d’erreur et 600 semble être un nombre parfaitement crédible. Ce type de bug discret peut rester dans un rapport financier pendant des mois.

Conseil : Deux lignes d’apparence identique peuvent être deux véritables événements. Avant d’utiliser UNION, demandez si des lignes identiques signifient le même fait enregistré deux fois, ou deux faits différents. Pour les ventes, les paiements et les entrées de journal, il s’agit généralement du deuxième.

Règles que les deux doivent suivre

Les deux opérateurs ont les mêmes exigences :

  1. Chaque SELECT doit renvoyer le même nombre de colonnes.
  2. Les colonnes correspondent par position, et non par nom, alors conservez-les dans le même ordre.
  3. Les types de données dans chaque position doivent être compatibles.
  4. Les noms des colonnes de résultats proviennent du premier SELECT.
  5. ORDER BY va à la toute fin et s’applique à l’ensemble du résultat.

Enfreindre la première règle donne une erreur. Voici le message de SQLite :

SELECT customer, total FROM online_orders
UNION
SELECT customer FROM store_orders;

-- SELECTs to the left and right of UNION do not have
-- the same number of result columns

La deuxième règle est plus dangereuse, car elle peut échouer sans erreur. Si vous échangez deux colonnes du même type, telles que first_name et last_name, la requête s’exécute et les données sont erronées. SQLite est également plus souple en ce qui concerne les types, tandis que les bases de données telles que PostgreSQL sont plus strictes et peuvent nécessiter un explicite CAST.

Étiquetez la source

Une astuce très pratique consiste à ajouter une colonne constante indiquant la provenance de chaque ligne. Étant donné que l’étiquette diffère, les lignes de différentes tables ne peuvent plus être traitées comme des doublons les unes des autres.

SELECT customer, total, 'online' AS channel FROM online_orders
UNION ALL
SELECT customer, total, 'store' FROM store_orders
ORDER BY customer, channel;

-- Asha | 100 | online
-- Asha | 100 | online
-- Asha | 100 | store
-- Ben  | 200 | online
-- Dev  | 300 | store

Une fois que vos données ont une étiquette, vous pouvez les regrouper pour rapporter les ventes par canal, en utilisant GROUP BY. Si vous devez combiner plusieurs étapes, enveloppez l’union dans un CTE pour la garder lisible.

Performances : ce qui s’est passé lors de notre test

Pour supprimer les doublons, la base de données doit comparer les lignes, généralement en les triant ou en les hachant. UNION ALL peut ignorer cette étape. Nous avons créé deux tableaux de 500 000 lignes chacun, contenant des nombres aléatoires de 0 à 50 000, il y avait donc beaucoup de doublons. Nous avons exécuté chaque requête plusieurs fois et avons conservé le meilleur temps.

Tout d’abord, nous avons compté les résultats, afin que le temps passé à renvoyer les lignes à notre programme n’affecte pas la comparaison :

Requête, enveloppée dans COUNT(*) Lignes Meilleur moment
UNION 50,001 261 ms
UNION TOUS 1,000,000 Moins de 1 ms

L’énorme écart est en partie dû au fait que SQLite peut calculer ce nombre sans lire chaque ligne, alors ne lisez pas cela comme “des milliers de fois plus rapide”. Cela montre cependant l’idée de base : UNION devait faire un vrai travail et UNION ALL ne l’a pas fait.

Ensuite, nous avons récupéré toutes les lignes dans Python, et le résultat a été inversé :

Requête, récupérant toutes les lignes Lignes renvoyées Meilleur moment
UNION 50,001 277 ms
UNION TOUS 1,000,000 392 ms

Ici, UNION ALL a pris plus de temps car il a livré vingt fois plus de lignes. Ce n’est pas la déduplication qui l’a ralenti. La gestion d’un million de lignes était. La règle honnête est donc que UNION ALL est moins cher à calculer pour la base de données, mais la taille du résultat compte également. De nombreux graphiques en ligne réduisent cela à “UNION ALL est toujours plus rapide”, et notre test montre pourquoi ce n’est pas si simple.

Ne choisissez pas non plus en fonction de la seule vitesse. Choisissez d’abord l’opérateur qui donne la bonne réponse, puis réglez. Si une requête est lente, lisez notre guide sur l’optimisation des requêtes SQL.

Quand utiliser chacun

Utilisez UNION ALL lorsque :

  • Vous fusionnez des données provenant de tables similaires, telles que des partitions mensuelles.
  • Vous calculerez ensuite des totaux ou des décomptes.
  • Vous savez que les entrées ne peuvent pas se chevaucher.
  • Les doublons sont significatifs, comme dans les journaux ou les enregistrements d’audit.

Utilisez UNION lorsque :

  • Vous avez besoin d’une liste unique, telle que chaque adresse e-mail sur deux systèmes.
  • Les sources qui se chevauchent contiennent le même fait plus d’une fois.

Traitez UNION ALL comme valeur par défaut et utilisez UNION délibérément. L’ajout d’une clause WHERE à chaque branche, pour filtrer tôt, aide les deux.

INTERSECT et SAUF

Deux opérateurs d’ensemble liés répondent à des questions différentes. Les deux suivent les mêmes règles de colonne :

SELECT customer FROM online_orders
INTERSECT
SELECT customer FROM store_orders;
-- Asha  (bought in both channels)

SELECT customer FROM online_orders
EXCEPT
SELECT customer FROM store_orders;
-- Ben   (online only)

Oracle utilise traditionnellement MINUS plutôt que EXCEPT, et la prise en charge de ces opérateurs varie légèrement selon la base de données et la version.

UNION vs REJOINDRE

Celles-ci sont souvent confondues, mais elles combinent les données dans des directions différentes :

Fonctionnement Direction Résultat
UNION Verticale Ajoute plus de lignes
REJOINDRE Horizontale Ajoute plus de colonnes

Erreurs courantes

  • Utiliser UNION par habitude. Cela peut vous coûter de la vitesse ou supprimer des lignes valides.
  • Sélection de trop peu de colonnes. L’omission d’un identifiant rend les lignes distinctes identiques.
  • Ordre des colonnes incompatible. Les valeurs peuvent atterrir dans la mauvaise colonne sans aucune erreur.
  • Ajout de ORDER BY à chaque branche. Trier une fois, à la fin.
  • Utiliser UNION pour corriger une mauvaise jointure. Si des doublons apparaissent à cause d’une jointure, corrigez la jointure.
  • En supposant l’ordre des résultats. Sans ORDER BY, l’ordre des lignes n’est garanti pour aucun des deux opérateurs.

Pour conclure

Posez une question à chaque fois : les lignes identiques correspondent-elles au même fait ou à des faits distincts ? S’ils sont séparés ou si le chevauchement est impossible, utilisez UNION ALL. Si vous avez besoin d’une liste unique, utilisez UNION. Pour vérifier vos propres rapports, recherchez votre code UNION à côté d’un SUM ou d’un COUNT et confirmez que ces totaux sont vraiment corrects.

Questions fréquentes

Quelle est la différence entre UNION et UNION TOUS ?

UNION combine deux jeux de résultats et supprime les lignes en double. UNION ALL les combine et conserve chaque ligne, y compris les doublons.

Qu’est-ce qui est le plus rapide, UNION ou UNION ALL ?

UNION ALL est généralement moins cher à calculer, car il ne vérifie pas les doublons. Le retour d’un résultat beaucoup plus important peut encore prendre globalement plus de temps, comme l’a montré notre test.

UNION supprime-t-il les doublons dans une table ?

Oui. Il supprime les doublons dans l’ensemble du résultat combiné, y compris les lignes identiques provenant toutes de la même table.

Les noms de colonnes doivent-ils correspondre dans une UNION ?

Non. Les colonnes correspondent par position et le résultat utilise les noms du premier SELECT. Le nombre de colonnes doit correspondre et les types doivent être compatibles.

Puis-je utiliser ORDER BY avec UNION ?

Oui, mais placez un ORDER BY à la toute fin de l’instruction. Il trie l’intégralité du résultat combiné plutôt qu’une seule branche.

Continuez à apprendre

Travailler avec Stack Quora

Besoin d’aide pour les tests, WordPress ou le référencement ?

Nous aidons les équipes à proposer de meilleurs logiciels et à développer leurs sites. Dites-nous sur quoi vous travaillez et nous vous proposerons une prochaine étape claire.

Continuez à lire

Plus de guides sur tests, IA et développement moderne

Vous avez apprécié cet article ? Choisissez un sujet et accédez directement à nos nouveaux didacticiels.

Intelligence artificielle

Les hallucinations de l'IA expliquées : pourquoi les modèles de langage inventent les choses et comment les réduire

Les hallucinations de l'IA ont expliqué : ce qu'elles sont, pourquoi les modèles de langage les produisent, les types courants, comment les réduire …

Lire l'article →
DevOps

Variables d'environnement expliquées : fichiers .env, secrets et configuration correctement effectués

Variables d'environnement expliquées avec des exemples Python que nous avons exécutés : lecture et définition, pourquoi chaque valeur est une chaîne…

Lire l'article →
Développement logiciel

Limitation du débit de l'API expliquée : algorithmes, en-têtes et gestion des erreurs 429

Limitation du débit de l'API expliquée avec une simulation que nous avons exécutée : compartiment de jetons, fenêtre fixe, fenêtre glissante, 429 ré…

Lire l'article →
Automatisation des tests

Se moquer en Python : unittest.mock, patch et les erreurs qui font mentir les tests

Moquerie en Python avec unittest.mock, testée : Mock et return_value, side_effect, correctifs où un nom est utilisé, spec et autospec, dates moqueus…

Lire l'article →
Tests logiciels

Couverture du code expliquée : couverture des lignes par rapport aux branches et ce que signifie réellement 100 %

Couverture du code expliquée avec une véritable exécution de cover.py : couverture des lignes, des branches et des conditions, lecture d'un rapport,…

Lire l'article →
Bases de données et SQL

DELETE vs TRUNCATE vs DROP dans SQL : différences, restauration et quand les utiliser

DELETE vs TRUNCATE vs DROP expliqué avec SQL testé : ce que chacun supprime, restauration, déclencheurs, réinitialisation d'identité, vitesse et en …

Lire l'article →
Bases de données et SQL

Vues SQL expliquées : créez, utilisez et évitez les pièges, avec des exemples

Vues SQL expliquées avec les requêtes que nous avons exécutées : création d'une vue, résultats en direct, masquage des colonnes, performances, vues …

Lire l'article →
Développement logiciel

Interface TypeScript vs Type : différences réelles, testées avec le compilateur

Interface TypeScript vs type, vérifiée avec le vrai compilateur : ce que les deux peuvent faire, ce qu'un seul peut faire, la fusion des déclaration…

Lire l'article →
Développement logiciel

Python *args et **kwargs expliqués : fonctions flexibles avec des exemples clairs

Python *args et **kwargs expliqués avec le code que nous avons exécuté : emballage et déballage, ordre des paramètres, arguments de mot-clé uniqueme…

Lire l'article →
Développement logiciel

Fonctions Python Lambda : syntaxe, utilisations réelles et quand ne pas les utiliser

Fonctions Python lambda expliquées avec le code que nous avons exécuté : syntaxe, tri avec clé, carte et filtre, fermetures, piège de liaison tardiv…

Lire l'article →
Intelligence artificielle

Que sont les agents IA ? Comment ils fonctionnent, avec une simple boucle d'agent que vous pouvez exécuter

Que sont les agents IA ? Un guide simple sur la boucle d'agent, les outils, la mémoire et les garde-fous, avec une petite boucle Python que nous avo…

Lire l'article →
DevOps

Surveillance vs observabilité : la vraie différence, avec les journaux, les métriques et les traces

Surveillance et observabilité expliquées : échecs connus et inconnus, journaux, métriques et traces, présentation pas à pas des incidents de paiemen…

Lire l'article →
DevOps

Volumes Docker vs montages Bind : conserver les données du conteneur de la bonne manière

Volumes Docker et montages de liaison expliqués : pourquoi les données du conteneur disparaissent, volumes nommés, montages de liaison, tmpfs, exemp…

Lire l'article →
Automatisation des tests

TDD vs BDD : principales différences, une fonctionnalité conçue dans les deux sens et quand les utiliser

TDD vs BDD expliqué avec une fonctionnalité de remise construite dans les deux sens : refactor rouge-vert avec le code que nous avons exécuté, scéna…

Lire l'article →
Tests logiciels

Tests d'acceptation utilisateur (UAT) : processus, liste de contrôle et exemples réels

Les tests d'acceptation des utilisateurs sont expliqués : qui les exécute, en quoi ils diffèrent du contrôle qualité, un processus en sept étapes, u…

Lire l'article →
Bases de données et SQL

Explication des valeurs SQL NULL : IS NULL, COALESCE, NULLIF et les pièges à éviter

Les valeurs SQL NULL expliquées avec les requêtes que nous avons exécutées : logique à trois valeurs, IS NULL, COALESCE, NULLIF, comment les agrégat…

Lire l'article →
Bases de données et SQL

Instruction SQL CASE WHEN : syntaxe, exemples réels et erreurs courantes

SQL CASE WHEN expliqué avec les requêtes que nous avons exécutées : formulaires simples et recherchés, ordre des conditions, pivots avec SUM, astuce…

Lire l'article →
Développement logiciel

Qu'est-ce que JWT ? Les jetons Web JSON expliqués avec un exemple fonctionnel

Qu’est-ce que JWT ? JSON Web Tokens expliqué : les trois parties, un jeton construit et falsifié dans le code que nous avons exécuté, JWT vs session…

Lire l'article →
Développement logiciel

Boucle d'événements JavaScript expliquée : pile d'appels, microtâches et minuteries avec des exemples

La boucle d'événements JavaScript expliquée avec le code que nous avons exécuté : pile d'appels, files d'attente de tâches et de microtâches, pourqu…

Lire l'article →
Développement logiciel

Générateurs Python et rendement expliqués : économisez de la mémoire avec des exemples réels

Les générateurs Python et le rendement expliqués avec le code que nous avons exécuté : comment ils s'arrêtent et reprennent, les économies de mémoir…

Lire l'article →
Intelligence artificielle

Que sont les intégrations ? Vecteurs et similarité cosinus expliqués simplement

Que sont les intégrations ? Un guide en langage simple sur les vecteurs, la similarité cosinus et la recherche sémantique, avec un petit exemple que…

Lire l'article →
DevOps

Déploiement Bleu-Vert vs Canary : différences, compromis et comment choisir

Explication du déploiement bleu-vert ou canari : comment chacun fonctionne, coût, risque et restauration, regroupement d'utilisateurs stable que nou…

Lire l'article →
Automatisation des tests

Tests instables : quelles sont leurs causes et comment les corriger définitivement

Des tests irréguliers expliqués avec des démos que nous avons exécutées : les principales causes, comment en confirmer et en diagnostiquer une, les …

Lire l'article →
Tests logiciels

Tests de charge vs tests de contrainte : différences, métriques et exemples k6

Explication des tests de charge et des tests de stress : ce que chacun prouve, les tests de pointe et de trempage, les métriques qui comptent, pourq…

Lire l'article →
Tests logiciels

Scénario de test et scénario de test : principales différences, exemples et quand les utiliser

Scénario de test et scénario de test expliqués : des définitions claires, un tableau côte à côte, une fonctionnalité de réinitialisation de mot de p…

Lire l'article →
Bases de données et SQL

Optimisation des requêtes SQL : lire les plans d'exécution et corriger les requêtes lentes, avec des délais

Optimisation des requêtes SQL testée sur un million de lignes : lire les plans d'exécution, ajouter les bons index, corriger les filtres non Sargabl…

Lire l'article →
Bases de données et SQL

SQL UNION vs UNION ALL : différences, exemples et performances testées

SQL UNION vs UNION ALL expliqué avec les requêtes que nous avons exécutées : des doublons, les règles suivent toutes les deux, un véritable bug de d…

Lire l'article →
Développement logiciel

Tutoriel API JavaScript Fetch : GET, POST, gestion des erreurs et délais d'attente

Un didacticiel de l'API JavaScript Fetch testé sur un serveur local : GET et POST, pourquoi 404 ne lance pas, un assistant réutilisable, des chaînes…

Lire l'article →
Développement logiciel

Gestion des fichiers Python : lecture, écriture, CSV, JSON et pathlib avec exemples

Gestion des fichiers Python expliquée avec le code que nous avons exécuté : modes ouverts, avec lecture de fichiers volumineux, CSV, JSON, pathlib, …

Lire l'article →
Développement logiciel

Classes et objets Python : didacticiel POO avec des exemples réels

Classes et objets Python expliqués avec le code que nous avons exécuté : __init__, méthodes, attributs de classe par rapport à l'instance, héritage,…

Lire l'article →
Intelligence artificielle

Qu'est-ce qu'un grand modèle de langage ? Comment fonctionnent les LLM, expliqués sans battage médiatique

Qu’est-ce qu’un grand modèle de langage ? Les LLM expliqués en langage simple : jetons, intégrations, attention, formation, fenêtres de température …

Lire l'article →
DevOps

Commandes Linux pour les débutants : le guide du terminal essentiel avec des exemples

Commandes Linux pour débutants, regroupées par tâche : navigation, fichiers, affichage des journaux, grep, tuyaux, autorisations, processus et archi…

Lire l'article →
Automatisation des tests

Selenium vs Playwright : principales différences, code comparé et lequel choisir

Comparatif Selenium vs Playwright : architecture, attente, support du navigateur et du langage, débogage, même test dans les deux outils, conseils d…

Lire l'article →
Tests logiciels

Partitionnement d'équivalence : technique de conception de tests expliquée avec des exemples concrets

Le partitionnement d'équivalence expliqué : comment trouver des partitions valides et invalides, des exemples concrets d'âges, de mots de passe et d…

Lire l'article →
Tests logiciels

Gravité vs priorité dans les tests logiciels : différences, matrice et exemples réels

Explication de la gravité et de la priorité dans les tests logiciels : des définitions claires, une matrice à quatre voies avec des exemples, des éc…

Lire l'article →
Bases de données et SQL

Tutoriel sur les sous-requêtes SQL : types, sous-requêtes corrélées et EXISTE avec des exemples

Un didacticiel sur les sous-requêtes SQL avec les requêtes que nous avons exécutées : les sous-requêtes scalaires, IN, FROM et SELECT, les sous-requ…

Lire l'article →
Bases de données et SQL

Transactions SQL et ACID expliquées : COMMIT, ROLLBACK et niveaux d'isolement

Transactions SQL et ACID expliquées avec un virement bancaire que nous avons effectué : COMMIT, ROLLBACK, points de sauvegarde, verrous, niveaux d'i…

Lire l'article →
Développement logiciel

Git merge vs rebase : différences, exemples et quand utiliser chacun

Git merge vs rebase expliqué avec de vraies sorties de log, un tableau comparatif, la règle d'or du rebase et un flux de travail sûr pour les équipes.

Lire l'article →
Développement logiciel

List comprehension Python : syntaxe, exemples et cas à éviter

La list comprehension Python expliquée : syntaxe, filtres, if-else, boucles imbriquées, temps mesurés et cas où une boucle for classique est préféra…

Lire l'article →
Bases de données et SQL

Jointures SQL expliquées avec exemples (Inner, Left, Right, Full)

Comprenez les jointures SQL pas à pas avec des tables et requêtes d'exemple : INNER, LEFT, RIGHT, FULL, CROSS et SELF, plus erreurs courantes et con…

Lire l'article →