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


Réponses:


1735

UNIONsupprime les enregistrements en double (où toutes les colonnes des résultats sont identiques), UNION ALLne le fait pas.

Il y a un impact sur les performances lors de l'utilisation à la UNIONplace de UNION ALL, car le serveur de base de données doit effectuer un travail supplémentaire pour supprimer les lignes en double, mais vous ne souhaitez généralement pas les doublons (en particulier lors du développement de rapports).

UNION Exemple:

SELECT 'foo' AS bar UNION SELECT 'foo' AS bar

Résultat:

+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)

Exemple UNION ALL:

SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar

Résultat:

+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)

179
L'implication de ceci est que l'union est beaucoup moins performante car elle doit scanner le résultat pour les doublons
Matthew Watson

19
UNION ALL sera en effet plus performant, notamment en raison de l'absence de tri distinct. Ma pratique générale consiste à utiliser UNION ALL sauf si je souhaite spécifiquement des doublons.
Adam Caviness

6
Je viens de remarquer qu'il y a beaucoup de bons commentaires / réponses ici, j'ai donc activé le drapeau wiki et ajouté une note sur les performances ...
Jim Harte

250
UNION ALL peut être plus lent que UNION dans les cas réels où le réseau comme Internet est un goulot d'étranglement. Le coût de transfert de nombreuses lignes en double peut dépasser l'avantage de temps d'exécution de requête. Cela doit être analysé au cas par cas.
Charles Burns

23
@AdamCaviness Votre commentaire n'a pas vraiment de sens.
kojow7

285

UNION et UNION ALL concaténent le résultat de deux SQL différents. Ils diffèrent dans la façon dont ils traitent les doublons.

  • UNION effectue un DISTINCT sur l'ensemble de résultats, éliminant ainsi les lignes en double.

  • UNION ALL ne supprime pas les doublons, et donc plus rapide que UNION.

Remarque: lors de l' utilisation de ces commandes, toutes les colonnes sélectionnées doivent être du même type de données.

Exemple: si nous avons deux tables, 1) Employé et 2) Client

  1. Données de la table des employés:

entrez la description de l'image ici

  1. Données de la table client:

entrez la description de l'image ici

  1. Exemple UNION (Il supprime tous les enregistrements en double):

entrez la description de l'image ici

  1. Exemple UNION ALL (Il ne fait que concaténer des enregistrements, pas éliminer les doublons, il est donc plus rapide que UNION):

entrez la description de l'image ici


3
"toutes les colonnes sélectionnées doivent être du même type de données" - en fait, les choses ne sont pas si strictes (ce n'est pas une bonne chose du point de vue du modèle relationnel!). La norme SQL indique que leur descripteur de colonne respectif doit être le même, sauf dans le nom.
quand

47

UNIONsupprime les doublons, alors UNION ALLque non.

Afin de supprimer les doublons, le jeu de résultats doit être trié, ce qui peut avoir un impact sur les performances de l'UNION, en fonction du volume de données triées et des paramètres de divers paramètres SGBDR (pour Oracle PGA_AGGREGATE_TARGETavec WORKAREA_SIZE_POLICY=AUTOou SORT_AREA_SIZEet SOR_AREA_RETAINED_SIZEsi WORKAREA_SIZE_POLICY=MANUAL).

Fondamentalement, le tri est plus rapide s'il peut être effectué en mémoire, mais la même mise en garde concernant le volume de données s'applique.

Bien sûr, si vous avez besoin de données renvoyées sans doublons, vous devez utiliser UNION, selon la source de vos données.

J'aurais commenté le premier post pour qualifier le commentaire "est beaucoup moins performant", mais je n'ai pas de réputation (points) insuffisante pour le faire.


1
"Afin de supprimer les doublons, le jeu de résultats doit être trié" - vous avez peut-être un fournisseur particulier en tête, mais il n'y a pas de balises spécifiques au fournisseur sur la question. Même s'il y en avait, pourriez-vous prouver que les doublons ne peuvent pas être supprimés sans tri?
onedaywhen

2
distinct triera «implicitement» les résultats, car la suppression des doublons est plus rapide sur un ensemble trié. cela ne signifie pas que l'ensemble de résultats renvoyé est réellement trié de cette façon, mais dans la plupart des cas, distinct (et donc UNION) triera en interne l'ensemble des résultats.
DevilSuichiro

30

Dans ORACLE: UNION ne prend pas en charge les types de colonne BLOB (ou CLOB), UNION ALL le fait.



13

Vous pouvez éviter les doublons et toujours exécuter beaucoup plus rapidement que UNION DISTINCT (qui est en fait identique à UNION) en exécutant une requête comme celle-ci:

SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X

Remarquez la AND a!=Xpièce. C'est beaucoup plus rapide que UNION.


4
Cela omettra les lignes et ne produira donc pas le résultat attendu si a contient des valeurs NULL. En outre, il ne renvoie toujours pas le même résultat qu'un UNION- UNIONsupprime également les doublons renvoyés par les sous-requêtes, contrairement à votre approche.
Frank Schmitt

@FrankSchmitt - merci pour cette réponse; ce bit sur les sous-requêtes est exactement ce que je voulais savoir!
Doradus

11

Juste pour ajouter mes deux cents à la discussion ici: on pourrait comprendre l' UNIONopérateur comme une UNION pure, orientée SET - par exemple, set A = {2,4,6,8}, set B = {1,2,3,4 }, A UNION B = {1,2,3,4,6,8}

Lorsque vous traitez avec des ensembles, vous ne voudriez pas que les nombres 2 et 4 apparaissent deux fois, car un élément est ou n'est pas dans un ensemble.

Dans le monde de SQL, cependant, vous voudrez peut-être voir tous les éléments des deux ensembles ensemble dans un "sac" {2,4,6,8,1,2,3,4}. Et à cet effet, T-SQL propose à l'opérateur UNION ALL.


2
Nitpick: UNION ALLn'est pas "proposé" par T-SQL. UNION ALLfait partie de la norme ANSI SQL et n'est pas spécifique à MS SQL Server.
Frank Schmitt

1
Le commentaire 'Nitpick' pourrait impliquer que vous ne pouvez pas utiliser "Union All" dans TSQL, mais vous pouvez. Bien sûr, le commentaire ne dit pas cela, mais quelqu'un qui le lit peut le déduire.
JosephDoggie

10

UNION
La UNIONcommande est utilisée pour sélectionner les informations associées dans deux tables, tout comme la JOINcommande. Cependant, lorsque vous utilisez la UNIONcommande, toutes les colonnes sélectionnées doivent être du même type de données. Avec UNION, seules des valeurs distinctes sont sélectionnées.

UNION ALL
La UNION ALLcommande est égale à la UNIONcommande, sauf qu'elle UNION ALLsélectionne toutes les valeurs.

La différence entre Unionet Union allest que Union allcela n'éliminera pas les lignes en double, au lieu de cela, il extrait simplement toutes les lignes de toutes les tables correspondant aux spécificités de votre requête et les combine dans une table.

Une UNIONdéclaration fait effectivement un SELECT DISTINCTsur l'ensemble de résultats. Si vous savez que tous les enregistrements retournés sont uniques de votre union, utilisez UNION ALLplutôt, cela donne des résultats plus rapides.


8

Pas sûr que la base de données soit importante

UNIONet UNION ALLdevrait fonctionner sur tous les serveurs SQL.

Vous devez éviter les pertes inutiles, UNIONce sont d'énormes pertes de performances. En règle générale, utilisez UNION ALLsi vous ne savez pas lequel utiliser.


Il n'y a pas de balise SQL Server sur cette question. Je pense que l'option qui renvoie des doublons simplement parce qu'elle fonctionne le mieux est le mauvais conseil.
onedaywhen

1
@onedaywhen je suppose que l'OP a utilisé l'expression "serveurs SQL" comme synonyme de tous les SGBDR (par exemple MySQL, PostGreSQL, Oracle, SQL Server). Le libellé est cependant regrettable (et bien sûr, je peux me tromper).
Frank Schmitt

@FrankSchmitt: aucun des produits que vous avez énumérés n'est vraiment des SGBDR :)
onedaywhen

1
@onedaywhen soin d'élaborer? Au moins en.wikipedia.org/wiki/Relational_database_management_system semble être d'accord avec moi - il mentionne explicitement Microsoft SQL Server, Oracle Database et MySQL. Ou êtes-vous pointilleux sur la différence entre Oracle et Oracle Database, par exemple?
Frank Schmitt du

8

UNION - entraîne des enregistrements distincts

tandis que

UNION ALL - entraîne tous les enregistrements, y compris les doublons.

Les deux sont des opérateurs de blocage et, par conséquent, je préfère personnellement utiliser JOINS plutôt que les opérateurs de blocage (UNION, INTERSECT, UNION ALL, etc.) à tout moment.

Pour illustrer les raisons du mauvais fonctionnement de l'opération Union par rapport à l'extraction Union Tout, consultez l'exemple suivant.

CREATE TABLE #T1 (data VARCHAR(10))

INSERT INTO #T1
SELECT 'abc'
UNION ALL
SELECT 'bcd'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'def'
UNION ALL
SELECT 'efg'


CREATE TABLE #T2 (data VARCHAR(10))

INSERT INTO #T2
SELECT 'abc'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'efg'

entrez la description de l'image ici

Voici les résultats des opérations UNION ALL et UNION.

entrez la description de l'image ici

Une instruction UNION effectue effectivement un SELECT DISTINCT sur l'ensemble de résultats. Si vous savez que tous les enregistrements retournés sont uniques de votre union, utilisez plutôt UNION ALL, cela donne des résultats plus rapides.

L'utilisation d'UNION entraîne des opérations de tri distinct dans le plan d'exécution. La preuve de cette affirmation est présentée ci-dessous:

entrez la description de l'image ici


3
Tout dans cette réponse a déjà été dit, est trop déroutant pour être utile (suggérer des jointures au-dessus des unions quand elles font des choses différentes, en donnant le "blocage" comme raison sans expliquer ce que vous entendez par là ou à quels serveurs de base de données il s'applique), ou est très trompeur (vos pourcentages dans votre capture d'écran ne s'appliquent pas à l'utilisation réelle réelle de UNION/ UNION ALL).

Les opérateurs de blocage sont des opérateurs bien connus dans TSQL. Tout ce que font les opérateurs bloquants peut être réalisé par Joins mais pas vice versa. L'opération de tri distinct est encerclée dans l'image pour montrer pourquoi l'union fonctionne mieux que l'union et pour montrer exactement où elle existe dans le plan d'exécution. N'hésitez pas à ajouter plus de données aux tableaux T1 et T2 pour jouer avec les pourcentages!
DBA

Techniquement, vous POUVEZ produire les résultats d'une unionutilisation d'une combinaison de joins et de certains vraiment désagréables case, mais cela rend la requête sacrément impossible à lire et à maintenir, et d'après mon expérience, elle est également terrible pour les performances. Comparer: select foo.bar from foo union select fizz.buzz from fizzcontreselect case when foo.bar is null then fizz.buzz else foo.bar end from foo join fizz where foo.bar is null or fizz.buzz is null
Devin Lamothe

@DBA Votre réponse ne concerne que les utilisateurs de MS SQL Server. L'OP n'a jamais mentionné le SGBDR qu'ils utilisent - ils pourraient utiliser MySQL, PostgreSQL, Oracle, SQLite, ...
Frank Schmitt

6

l'union est utilisée pour sélectionner des valeurs distinctes à partir de deux tables alors que comme union tout est utilisé pour sélectionner toutes les valeurs, y compris les doublons dans les tables


6

Il est bon de comprendre avec un diagramme de Venn.

voici le lien vers la source. Il y a une bonne description.

entrez la description de l'image ici


5
Votre deuxième image suggère que les deux s'excluent mutuellement lorsqu'ils ne le sont pas. L'image devrait plutôt montrer la même chose que la première mais avec l'ellipse d'intersection ()montrée une deuxième fois. En fait, après réflexion, car le union allrésultat n'est pas un ensemble, vous ne devriez pas essayer de le dessiner en utilisant un diagramme de Venn!
quand

5

(À partir de Microsoft SQL Server Book Online)

UNION [TOUS]

Spécifie que plusieurs jeux de résultats doivent être combinés et renvoyés en tant que jeu de résultats unique.

TOUT

Incorpore toutes les lignes dans les résultats. Cela inclut les doublons. S'il n'est pas spécifié, les lignes en double sont supprimées.

UNIONprendra trop de temps lorsqu’une ligne en double trouvant semblable DISTINCTest appliquée aux résultats.

SELECT * FROM Table1
UNION
SELECT * FROM Table2

est équivalent à:

SELECT DISTINCT * FROM (
    SELECT * FROM Table1
    UNION ALL
    SELECT * FROM Table2) DT

Un effet secondaire de l'application DISTINCTsur les résultats est une opération de tri sur les résultats.

UNION ALLles résultats seront affichés comme un ordre arbitraire sur les résultats Mais les UNIONrésultats seront affichés comme ORDER BY 1, 2, 3, ..., n (n = column number of Tables)appliqués sur les résultats. Vous pouvez voir cet effet secondaire lorsque vous n'avez pas de ligne en double.


5

J'ajoute un exemple,

UNION , il fusionne avec distinct -> plus lent, car il doit être comparé (dans le développeur Oracle SQL, choisissez la requête, appuyez sur F10 pour voir l'analyse des coûts).

UNION ALL , il fusionne sans distinction -> plus rapide.

SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;

et

SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;

2

UNION fusionne le contenu de deux tables structurellement compatibles en une seule table combinée.

  • Différence:

La différence entre UNIONet UNION ALLest que UNION willles enregistrements en double sont omis tandis que UNION ALLles enregistrements en double sont inclus.

UnionL'ensemble de résultats est trié par ordre croissant, tandis que l' UNION ALLensemble de résultats n'est pas trié

UNIONeffectue un DISTINCTsur son jeu de résultats afin d'éliminer toutes les lignes en double. Alors UNION ALLqu'il ne supprimera pas les doublons, il est donc plus rapide que UNION. *

Remarque : Les performances de UNION ALLseront généralement meilleures que UNION, car UNIONle serveur doit effectuer le travail supplémentaire de suppression des doublons. Ainsi, dans les cas où il est certain qu'il n'y aura pas de doublons, ou lorsque la présence de doublons n'est pas un problème, l'utilisation de UNION ALLserait recommandée pour des raisons de performances.


1
"L'ensemble de résultats de l'Union est trié par ordre croissant" - Sauf s'il y en a un ORDER BY, les résultats triés ne sont pas garantis. Peut-être avez-vous un fournisseur SQL particulier à l'esprit (même dans ce cas, dans l'ordre croissant quoi exactement ...?), Mais cette question n'a pas de balises spécifiques au fournisseur.
quand

"fusionne le contenu de deux tables structurellement compatibles" - je pense que vous avez très bien énoncé cette partie :)
onedaywhen

2

Supposons que vous ayez deux enseignants et étudiants de table

Les deux ont 4 colonnes avec un nom différent comme celui-ci

Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))

entrez la description de l'image ici

Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)

entrez la description de l'image ici

Vous pouvez appliquer UNION ou UNION ALL pour ces deux tables qui ont le même nombre de colonnes. Mais ils ont un nom ou un type de données différent.

Lorsque vous appliquez une UNIONopération sur 2 tables, il néglige toutes les entrées en double (la valeur de toutes les colonnes de la ligne d'une table est la même que celle d'une autre table). Comme ça

SELECT * FROM Student
UNION
SELECT * FROM Teacher

le résultat sera

entrez la description de l'image ici

Lorsque vous appliquez l' UNION ALLopération sur 2 tables, il renvoie toutes les entrées avec doublon (s'il existe une différence entre une valeur de colonne d'une ligne dans 2 tables). Comme ça

SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher

Production entrez la description de l'image ici

Performance:

De toute évidence, les performances d' UNION ALL sont meilleures que celles d' UNION car elles effectuent une tâche supplémentaire pour supprimer les valeurs en double. Vous pouvez vérifier cela dans Execution Estimated Time en appuyant sur ctrl + L sur MSSQL


Vraiment? Pour un résultat sur quatre rangées?! Je pense que c'est un scénario où vous voudriez utiliser UNIONpour transmettre l'intention (c.-à-d. Pas de doublons) car il UNION ALLest peu probable de donner un gain de performance dans la vie réelle en termes absolus.
quand

2

En termes très simples, la différence entre UNION et UNION ALL est que UNION omettra les enregistrements en double tandis que UNION ALL inclura les enregistrements en double.


1

Une dernière chose que je voudrais ajouter-

Union : - L'ensemble de résultats est trié par ordre croissant.

Union Tout : - L'ensemble de résultats n'est pas trié. deux sorties de requête sont simplement ajoutées.


Vrai ! UNION pourrait changer l'ordre des deux sous-résultats.
gracchus

6
C'est faux. A UNIONne triera PAS le résultat dans l'ordre croissant. Tout ordre que vous voyez dans un résultat sans utiliser order byest une pure coïncidence. Le SGBD est libre d'utiliser toute stratégie qu'il juge efficace pour supprimer les doublons. Cela peut être un tri, mais il peut également s'agir d'un algorithme de hachage ou de quelque chose de complètement différent - et la stratégie changera avec le nombre de lignes. Un unionqui apparaît trié avec 100 lignes peut ne pas l'être avec 100.000 lignes
a_horse_with_no_name

2
Sans clause ORDER BY sur la requête, le SGBDR est libre de renvoyer les lignes dans n'importe quelle séquence. L'observation selon laquelle le jeu de résultats d'une opération UNION est renvoyé "dans l'ordre croissant" n'est qu'un sous - produit d'une opération de "tri unique" effectuée par la base de données. Le comportement observé n'est pas garanti. Alors ne vous y fiez pas. Si la spécification doit renvoyer des lignes dans un ordre particulier, ajoutez une ORDER BYclause appropriée .
spencer7593

1

Différence entre Union Vs Union ALL In Sql

Qu'est-ce que l'Union In SQL?

L'opérateur UNION est utilisé pour combiner l'ensemble de résultats de deux ou plusieurs ensembles de données.

Each SELECT statement within UNION must have the same number of columns
The columns must also have similar data types
The columns in each SELECT statement must also be in the same order

Union Vs Union All With Example


1

Important! Différence entre Oracle et Mysql: Disons que t1 t2 n'ont pas de lignes en double entre eux mais qu'ils ont des lignes en double individuelles. Exemple: t1 a des ventes à partir de 2017 et t2 à partir de 2018

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION ALL

SELECT T2.YEAR, T2.PRODUCT FROM T2

Dans ORACLE UNION ALL récupère toutes les lignes des deux tables. La même chose se produira dans MySQL.

Toutefois:

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION

SELECT T2.YEAR, T2.PRODUCT FROM T2

Dans ORACLE , UNION récupère toutes les lignes des deux tables car il n'y a pas de valeurs en double entre t1 et t2. D'un autre côté, dans MySQL, le jeu de résultats aura moins de lignes car il y aura des lignes en double dans la table t1 et également dans la table t2!


0

UNION supprime les enregistrements en double en revanche UNION ALL ne le fait pas. Mais il faut vérifier la masse des données qui vont être traitées et la colonne et le type de données doivent être identiques.

étant donné que l'union utilise en interne un comportement "distinct" pour sélectionner les lignes, il est donc plus coûteux en termes de temps et de performances. comme

select project_id from t_project
union
select project_id from t_project_contact  

cela me donne 2020 records

d'autre part

select project_id from t_project
union all
select project_id from t_project_contact

me donne plus de 17402 lignes

sur la perspective de priorité, les deux ont la même priorité.


0

S'il n'y en a pas ORDER BY, a UNION ALLpeut ramener les lignes au fur et à mesure, tandis que a UNIONvous ferait attendre jusqu'à la fin de la requête avant de vous donner tout le jeu de résultats à la fois. Cela peut faire une différence dans une situation de temporisation - a UNION ALLmaintient la connexion en vie, pour ainsi dire.

Donc, si vous avez un problème de délai d'attente et qu'il n'y a pas de tri et que les doublons ne sont pas un problème, cela UNION ALLpeut être plutôt utile.


Mais votre premier bloc de résultats pourrait être dupliqué plusieurs fois: quelle est l'utilité?!
quand

0

UNION et UNION ALL combinaient au moins deux résultats de requête.

La commande UNION sélectionne des informations distinctes et connexes dans deux tables, ce qui élimine les lignes en double.

D'un autre côté, la commande UNION ALL sélectionne toutes les valeurs des deux tables, qui affiche toutes les lignes.


0

Comme d'habitude, utilisez toujours UNION ALL . Utilisez uniquement UNION dans des cas particuliers lorsque vous devez éliminer les doublons qui peuvent être extrêmement compliqués et vous pouvez tout lire ici dans les autres commentaires.


0

UNION ALLfonctionne également sur plusieurs types de données. Par exemple, lors de la tentative d'union des types de données spatiales. Par exemple:

select a.SHAPE from tableA a
union
select b.SHAPE from tableB b

jettera

The data type geometry cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.

Mais union allce ne sera pas le cas.


-1

La seule différence est:

"UNION" supprime les lignes en double.

"UNION ALL" ne supprime pas les lignes en double.


13
Comment cela ajoute-t-il une valeur par rapport à la réponse acceptée?
Nick

@ Nick C'est une réponse plus courte.
Mostafa Vatanpour

Plus court pourrait être un avantage si vous deviez lire une partie importante de la réponse acceptée pour obtenir ces données. Mais dans ce cas, la réponse acceptée contient toutes ces informations dans la toute première phrase, après quoi elle discute en détail des implications de la différence.
dmckee --- chaton ex-modérateur
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.