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 UNIONSELECT'foo'AS bar
Résultat:
+-----+| bar |+-----+| foo |+-----+1rowinset(0.00 sec)
Exemple UNION ALL:
SELECT'foo'AS bar UNIONALLSELECT'foo'AS bar
Résultat:
+-----+| bar |+-----+| foo || foo |+-----+2rowsinset(0.00 sec)
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
Données de la table des employés:
Données de la table client:
Exemple UNION (Il supprime tous les enregistrements en double):
Exemple UNION ALL (Il ne fait que concaténer des enregistrements, pas éliminer les doublons, il est donc plus rapide que UNION):
"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.
"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.
La différence fondamentale entre UNION et UNION ALL est que l'opération d'union élimine les lignes dupliquées de l'ensemble de résultats, mais union all renvoie toutes les lignes après la jointure.
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.
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.
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.
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.
Voici les résultats des opérations UNION ALL et UNION.
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:
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
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.
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.
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.
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.
"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
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
UNIONSELECT*FROM Teacher
le résultat sera
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
UNIONALLSELECT*FROM Teacher
Production
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.
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 withinUNION 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
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
UNIONALLSELECT 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
UNIONSELECT 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!
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
unionselect project_id from t_project_contact
cela me donne 2020 records
d'autre part
select project_id from t_project
unionallselect project_id from t_project_contact
me donne plus de 17402 lignes
sur la perspective de priorité, les deux ont la même priorité.
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.
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.
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.
Réponses:
UNION
supprime les enregistrements en double (où toutes les colonnes des résultats sont identiques),UNION ALL
ne le fait pas.Il y a un impact sur les performances lors de l'utilisation à la
UNION
place deUNION 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:
Résultat:
Exemple UNION ALL:
Résultat:
la source
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.
Exemple: si nous avons deux tables, 1) Employé et 2) Client
la source
UNION
supprime les doublons, alorsUNION ALL
que 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_TARGET
avecWORKAREA_SIZE_POLICY=AUTO
ouSORT_AREA_SIZE
etSOR_AREA_RETAINED_SIZE
siWORKAREA_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.
la source
Dans ORACLE: UNION ne prend pas en charge les types de colonne BLOB (ou CLOB), UNION ALL le fait.
la source
depuis http://zengin.wordpress.com/2007/07/31/union-vs-union-all/
la source
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!=X
pièce. C'est beaucoup plus rapide que UNION.la source
UNION
-UNION
supprime également les doublons renvoyés par les sous-requêtes, contrairement à votre approche.Juste pour ajouter mes deux cents à la discussion ici: on pourrait comprendre l'
UNION
opé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
.la source
UNION ALL
n'est pas "proposé" par T-SQL.UNION ALL
fait partie de la norme ANSI SQL et n'est pas spécifique à MS SQL Server.UNION
La
UNION
commande est utilisée pour sélectionner les informations associées dans deux tables, tout comme laJOIN
commande. Cependant, lorsque vous utilisez laUNION
commande, toutes les colonnes sélectionnées doivent être du même type de données. AvecUNION
, seules des valeurs distinctes sont sélectionnées.UNION ALL
La
UNION ALL
commande est égale à laUNION
commande, sauf qu'elleUNION ALL
sélectionne toutes les valeurs.La différence entre
Union
etUnion all
est queUnion all
cela 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
UNION
déclaration fait effectivement unSELECT DISTINCT
sur l'ensemble de résultats. Si vous savez que tous les enregistrements retournés sont uniques de votre union, utilisezUNION ALL
plutôt, cela donne des résultats plus rapides.la source
UNION
etUNION ALL
devrait fonctionner sur tous les serveurs SQL.Vous devez éviter les pertes inutiles,
UNION
ce sont d'énormes pertes de performances. En règle générale, utilisezUNION ALL
si vous ne savez pas lequel utiliser.la source
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.
Voici les résultats des opérations UNION ALL et UNION.
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:
la source
UNION
/UNION ALL
).union
utilisation d'une combinaison dejoin
s et de certains vraiment désagréablescase
, 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 fizz
contreselect 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
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
la source
Il est bon de comprendre avec un diagramme de Venn.
voici le lien vers la source. Il y a une bonne description.
la source
()
montrée une deuxième fois. En fait, après réflexion, car leunion all
résultat n'est pas un ensemble, vous ne devriez pas essayer de le dessiner en utilisant un diagramme de Venn!(À partir de Microsoft SQL Server Book Online)
UNION [TOUS]
TOUT
UNION
prendra trop de temps lorsqu’une ligne en double trouvant semblableDISTINCT
est appliquée aux résultats.est équivalent à:
UNION ALL
les résultats seront affichés comme un ordre arbitraire sur les résultats Mais lesUNION
résultats seront affichés commeORDER 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.la source
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.
et
la source
UNION
fusionne le contenu de deux tables structurellement compatibles en une seule table combinée.La différence entre
UNION
etUNION ALL
est queUNION will
les enregistrements en double sont omis tandis queUNION ALL
les enregistrements en double sont inclus.Union
L'ensemble de résultats est trié par ordre croissant, tandis que l'UNION ALL
ensemble de résultats n'est pas triéUNION
effectue unDISTINCT
sur son jeu de résultats afin d'éliminer toutes les lignes en double. AlorsUNION ALL
qu'il ne supprimera pas les doublons, il est donc plus rapide queUNION
. *Remarque : Les performances de
UNION ALL
seront généralement meilleures queUNION
, carUNION
le 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 deUNION ALL
serait recommandée pour des raisons de performances.la source
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.Supposons que vous ayez deux enseignants et étudiants de table
Les deux ont 4 colonnes avec un nom différent comme celui-ci
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
UNION
opé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 çale résultat sera
Lorsque vous appliquez l'
UNION ALL
opé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 çaProduction
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
la source
UNION
pour transmettre l'intention (c.-à-d. Pas de doublons) car ilUNION ALL
est peu probable de donner un gain de performance dans la vie réelle en termes absolus.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.
la source
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.
la source
UNION
ne triera PAS le résultat dans l'ordre croissant. Tout ordre que vous voyez dans un résultat sans utiliserorder by
est 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. Ununion
qui apparaît trié avec 100 lignes peut ne pas l'être avec 100.000 lignesORDER BY
clause appropriée .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.
Union Vs Union All With Example
la source
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
Dans ORACLE UNION ALL récupère toutes les lignes des deux tables. La même chose se produira dans MySQL.
Toutefois:
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!
la source
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
cela me donne 2020 records
d'autre part
me donne plus de 17402 lignes
sur la perspective de priorité, les deux ont la même priorité.
la source
S'il n'y en a pas
ORDER BY
, aUNION ALL
peut ramener les lignes au fur et à mesure, tandis que aUNION
vous 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 - aUNION ALL
maintient 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 ALL
peut être plutôt utile.la source
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.
la source
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.
la source
UNION ALL
fonctionne également sur plusieurs types de données. Par exemple, lors de la tentative d'union des types de données spatiales. Par exemple: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 all
ce ne sera pas le cas.la source
La seule différence est:
"UNION" supprime les lignes en double.
"UNION ALL" ne supprime pas les lignes en double.
la source