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 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).
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
Résultat:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
Résultat:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
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
UNION
supprime les doublons, alors UNION 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
avec WORKAREA_SIZE_POLICY=AUTO
ou SORT_AREA_SIZE
et SOR_AREA_RETAINED_SIZE
si 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.
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.
depuis http://zengin.wordpress.com/2007/07/31/union-vs-union-all/
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.
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
.
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 la JOIN
commande. Cependant, lorsque vous utilisez la UNION
commande, 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 ALL
commande est égale à la UNION
commande, sauf qu'elle UNION ALL
sélectionne toutes les valeurs.
La différence entre Union
et Union all
est que Union 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 un SELECT DISTINCT
sur l'ensemble de résultats. Si vous savez que tous les enregistrements retournés sont uniques de votre union, utilisez UNION ALL
plutôt, cela donne des résultats plus rapides.
Pas sûr que la base de données soit importante
UNION
et UNION 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, utilisez UNION ALL
si vous ne savez pas lequel utiliser.
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'
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:
UNION
/ UNION ALL
).
union
utilisation d'une combinaison de join
s 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 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
Il est bon de comprendre avec un diagramme de Venn.
voici le lien vers la source. Il y a une bonne description.
()
montrée une deuxième fois. En fait, après réflexion, car le union 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]
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.
UNION
prendra trop de temps lorsqu’une ligne en double trouvant semblable DISTINCT
est 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
DISTINCT
sur les résultats est une opération de tri sur les résultats.
UNION ALL
les résultats seront affichés comme un ordre arbitraire sur les résultats Mais les UNION
ré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.
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;
UNION
fusionne le contenu de deux tables structurellement compatibles en une seule table combinée.
La différence entre UNION
et UNION ALL
est que UNION will
les enregistrements en double sont omis tandis que UNION 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 un DISTINCT
sur son jeu de résultats afin d'éliminer toutes les lignes en double. Alors UNION ALL
qu'il ne supprimera pas les doublons, il est donc plus rapide que UNION
. *
Remarque : Les performances de UNION ALL
seront généralement meilleures que UNION
, car UNION
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 de UNION ALL
serait recommandée pour des raisons de performances.
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
Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))
Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)
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 ça
SELECT * FROM Student
UNION
SELECT * FROM Teacher
le 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 ça
SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher
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
UNION
pour transmettre l'intention (c.-à-d. Pas de doublons) car il UNION 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.
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.
UNION
ne triera PAS le résultat dans l'ordre croissant. Tout ordre que vous voyez dans un résultat sans utiliser order 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. Un union
qui apparaît trié avec 100 lignes peut ne pas l'être avec 100.000 lignes
ORDER 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.
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
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!
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é.
S'il n'y en a pas ORDER BY
, a UNION ALL
peut ramener les lignes au fur et à mesure, tandis que a UNION
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 - a UNION 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.
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.
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.
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:
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 all
ce ne sera pas le cas.
La seule différence est:
"UNION" supprime les lignes en double.
"UNION ALL" ne supprime pas les lignes en double.