UNIONとUNION ALLの違いは何ですか?


回答:


1734

UNION(結果のすべての列が同じである)重複レコードを削除しますが、削除UNION ALLしません。

UNION代わりにを使用するとUNION ALL、データベースサーバーが重複行を削除するために追加の作業を行う必要があるため、通常は重複が望ましくないため(特にレポートを作成する場合)、パフォーマンスに影響があります。

UNIONの例:

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

結果:

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

UNION ALLの例:

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

結果:

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

179
これの意味するところは、結果の重複をスキャンする必要があるため、unionのパフォーマンスが大幅に低下することです
Matthew Watson

19
UNION ALLは、特に明確なソートが欠けているため、実際により高性能になります。私が一般的に実践しているのは、特に重複が必要でない限り、UNION ALLを使用することです。
アダムキャビネス2011

6
私は...ウィキフラグをオンにし、パフォーマンスに関するメモを追加して、単に、ここで良いコメント/答えがたくさんあることに気づいた
ジム・ハート

250
UNION ALLは、インターネットなどのネットワークがボトルネックとなっている実際のケースでは、UNIONよりも遅くなる可能性があります。多くの重複行を転送するコストは、クエリ実行時間のメリットを超える可能性があります。これはケースバイケースで分析する必要があります。
Charles Burns

23
@AdamCavinessコメントはあまり意味がありません。
kojow7 2017

285

UNIONとUNION ALLはどちらも、2つの異なるSQLの結果を連結します。重複の処理方法が異なります。

  • UNIONは結果セットに対してDISTINCTを実行し、重複する行を排除します。

  • UNION ALLは重複を削除しないため、UNIONよりも高速です。

注:このコマンドを使用している間、選択したすべての列は同じデータ型である必要があります。

例:2つのテーブルがある場合、1)従業員と2)顧客

  1. 従業員テーブルデータ:

ここに画像の説明を入力してください

  1. 顧客テーブルデータ:

ここに画像の説明を入力してください

  1. UNIONの例(重複するレコードをすべて削除します):

ここに画像の説明を入力してください

  1. UNION ALLの例(レコードを連結するだけで、重複を排除しないため、UNIONよりも高速です):

ここに画像の説明を入力してください


3
「選択されたすべての列は同じデータ型である必要があります」-実際には、それほど厳密ではありません(リレーショナルモデルの観点からは良いことではありません!)。SQL標準では、それぞれの列記述子は名前を除いて同じでなければならないと述べています
onedaywhen

47

UNION重複を削除しますが、削除UNION ALLはしません。

除去するためには、結果セットがソートされなければならない複製し、これがでできる UNIONのパフォーマンスに影響を与え、データの量に応じてソートされ、および(Oracleのための様々なRDBMSパラメータの設定PGA_AGGREGATE_TARGETを持つWORKAREA_SIZE_POLICY=AUTO又はSORT_AREA_SIZEおよびSOR_AREA_RETAINED_SIZE場合WORKAREA_SIZE_POLICY=MANUAL)。

基本的に、並べ替えはメモリ内で実行できる場合はより高速ですが、データの量に関する同じ警告が適用されます。

もちろん、データを重複せずに返す必要がある場合は、データのソースに応じてUNIONを使用する必要あります。

私は最初の投稿で「パフォーマンスがはるかに低い」コメントを修飾するためにコメントしましたが、そうするための評判(ポイント)は不十分です。


1
「重複を削除するには、結果セットをソートする必要があります」-特定のベンダーを念頭に置いているかもしれませんが、質問にはベンダー固有のタグがありません。あったとしても、ソートしないと重複を削除できないことを証明できますか?
16

2
重複を削除するとソートセットの方が速くなるため、distinctは「暗黙的に」結果をソートします。これは、返された結果セットが実際にそのように並べ替えられることを意味するものではありませんが、ほとんどの場合、個別(したがってUNION)は結果セットを内部的に並べ替えます。
DevilSuichiro 2017年



13

次のようなクエリを実行することで、重複を避け、UNION DISTINCT(実際にはUNIONと同じ)よりもはるかに高速に実行できます。

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

AND a!=Xパーツに注目してください。これはUNIONよりもはるかに高速です。


4
これにより行が省略されるため、aにNULL値が含まれている場合、予期した結果が生成されません。また、それはまだ同じ結果を返しませんUNION- UNIONあなたのアプローチはしません一方でまた、サブクエリによって返される重複を削除します。
フランクシュミット2017

@FrankSchmitt-この回答をありがとう; サブクエリに関するこのビットは、まさに私が知りたかったものです!
Doradus

11

ここでの議論に私の2セントを追加するだけです。UNION演算子を純粋なSET指向のUNIONとして理解できます。たとえば、set A = {2,4,6,8}、set B = {1,2,3,4 }、A UNION B = {1,2,3,4,6,8}

セットを扱う場合、あなたは数字2と4は、要素のいずれかのように、二回登場たくないですか、ではありませんセットで。

ただし、SQLの世界では、2つのセットのすべての要素を1つの「バッグ」{2,4,6,8,1,2,3,4}にまとめて表示したい場合があります。この目的のために、T-SQLは演算子を提供しますUNION ALL


2
Nitpick:UNION ALLT-SQLでは「提供」されません。UNION ALLANSI SQL標準の一部であり、MS SQL Serverに固有ではありません。
フランクシュミット2017年

1
'Nitpick'コメントは、TSQLで "Union All"を使用できないことを意味する可能性がありますが、使用できます。もちろん、コメントはそれを言っていませが、それを読んでいる誰かがそれを推論するかもしれません。
JosephDoggie

10

UNIONコマンドは多くのように、2つのテーブルの関連情報を選択するために使用されるコマンド。ただし、コマンドを使用するときは、選択したすべての列が同じデータ型である必要があります。では、個別の値のみが選択されます。
UNIONJOINUNIONUNION

UNION ALLコマンドがに等しいことを除いて、コマンドのすべての値を選択します。
UNION ALLUNIONUNION ALL

違いUnionUnion allつまりUnion all、重複する行を排除しませんが代わりに、それはちょうどあなたのクエリの詳細をフィッティングすべてのテーブルからすべての行を取り出してテーブルにそれらを兼ね備えています。

UNION声明は、効果的に行いSELECT DISTINCT、結果セットに。返されたすべてのレコードがユニオンから一意であることを知っている場合は、UNION ALL代わりに使用すると、結果が速くなります。


8

どのデータベースが重要かわからない

UNIONそしてUNION ALL、すべてのSQL Serverで動作するはずです。

不要なUNIONs は避けてください。これらは大きなパフォーマンスリークです。経験則として、UNION ALLどちらを使用するかわからない場合は使用してください。


この質問にはSQL Serverタグがありません。いつも最高のパフォーマンスを発揮するだけで重複を返すオプションは間違ったアドバイスだと思います。
16

1
@oneday when OPが「SQL Servers」という句をすべてのRDBMS(MySQL、PostGreSQL、Oracle、SQL Serverなど)の同義語として使用したと思います。言葉遣いは残念ですが(そしてもちろん、私は間違っているかもしれません)。
フランクシュミット2017年

@FrankSchmitt:あなたがリストしたどの製品も本当にRDBMSではありません:)
onedaywhen '

1
@onedaywhen詳しく説明する気に?少なくともen.wikipedia.org/wiki/Relational_database_management_systemは私に同意しているようです。MicrosoftSQL Server、Oracle Database、MySQLについて明示的に言及しています。または、OracleとOracle Databaseの違いについて細心の注意を払っていますか?
フランクシュミット2017

8

UNION- 異なるレコードになりますが



UNION ALL-重複を含むすべてのレコードになります。

どちらもブロッキングオペレーターなので、個人的にはいつでもブロッキングオペレーター(UNION、INTERSECT、UNION ALLなど)よりもJOINSを使用することを好みます。

Union Allチェックアウトと比較して、Union操作のパフォーマンスが低い理由を説明するために、次の例を示します。

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'

ここに画像の説明を入力してください

UNION ALLおよびUNION操作の結果は次のとおりです。

ここに画像の説明を入力してください

UNIONステートメントは、結果セットに対してSELECT DISTINCTを効果的に実行します。返されたすべてのレコードがユニオンから一意であることを知っている場合は、代わりにUNION ALLを使用すると、結果が速くなります。

UNIONを使用すると、実行プランで個別の並べ替え操作が行われます。この声明を証明する証拠を以下に示します。

ここに画像の説明を入力してください


3
この回答のすべてはすでに述べられていますが、あまりにも混乱しており、有用ではありません(組合が異なることを行う場合は、結合を推奨し、「ブロッキング」を理由として、それが何を意味するか、またはどのデータベースサーバーに適用するかを説明せずに)、または誤解を招く恐れがあります(スクリーンショットのパーセンテージはUNION/の実際の実際の使用には適用されませんUNION ALL)。

ブロッキング演算子は、TSQLでよく知られている演算子です。ブロッキングオペレーターが行うことはすべて、Joinによって実現できますが、その逆はできません。明確な並べ替え操作は、図で丸で囲まれており、ユニオンがすべてユニオンよりもパフォーマンスが高い理由を示し、実行計画のどこに存在するかを正確に示しています。テーブルT1およびT2にデータを追加して、パーセンテージをいじってみてください。
DBA 2016年

あなたは技術的にといくつかの本当に厄介なsのunion組み合わせを使用し て結果を生成することができますが、クエリを読み、維持することはほとんど不可能であり、私の経験ではパフォーマンスひどいものです。比較:対joincaseselect foo.bar from foo union select fizz.buzz from fizzselect 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あなたの答えは、MS SQL Serverのユーザーにのみ関係します。OPは、彼らが使用しているRDBMSを述べたことはありません-彼らは、MySQL、PostgreSQLのは、Oracle、SQLiteの、...使用している場合があります
フランク・シュミット

6

unionは2つのテーブルから異なる値を選択するために使用され、union allはテーブルからの重複を含むすべての値を選択するために使用されます


6

ベン図で理解するのは良いことです。

ここにソースへのリンクがあります。良い説明があります。

ここに画像の説明を入力してください


5
2番目の画像は、2つが相互に排他的でない場合に相互に排他的であることを示しています。画像は最初のものと同じように見えるはずですが、「交差楕円」()が2回目に表示されます。実際、考え直してunion allみると、結果はセットではないので、ベン図を使用してそれを描くことはしないでください。
onedaywhen

5

(Microsoft SQL Server Book Onlineから)

UNION [すべて]

複数の結果セットを組み合わせて単一の結果セットとして返すことを指定します。

すべて

すべての行を結果に組み込みます。これには重複が含まれます。指定しない場合、重複する行が削除されます。

UNION結果にlike DISTINCTが適用されるような重複行の検索が行われると、時間がかかりすぎます。

SELECT * FROM Table1
UNION
SELECT * FROM Table2

同等です:

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

DISTINCT結果に適用することの副作用は、結果に対するソート操作です。

UNION ALL結果は結果の任意の順序で表示されますが、UNION結果はORDER BY 1, 2, 3, ..., n (n = column number of Tables)結果に適用されたものとして表示されます。重複する行がない場合、この副作用を確認できます。


5

例を追加します

UNIONは、比較が必要なため、明確にマージされます->遅くなります(Oracle SQL開発者は、クエリを選択し、F10を押してコスト分析を表示します)。

UNION ALL、明確にマージせずに->より速く。

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

そして

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

2

UNION 2つの構造的に互換性のあるテーブルの内容を1つの結合されたテーブルにマージします。

  • 差:

違いUNIONとは、UNION ALLということであるUNION willのに対し、オミット重複レコードがUNION ALL重複したレコードが含まれます。

Union結果セットは昇順でソートされますが、結果セットはソートされUNION ALLません

UNIONDISTINCT結果セットに対してを実行するので、重複する行がなくなります。一方UNION ALL、重複は削除されないため、UNION。* より高速です。

のパフォーマンスはUNION ALL、通常よりも良くなるUNIONことから、UNION任意の重複を除去する追加作業を行うためのサーバが必要です。したがって、重複がないことが確実な場合、または重複が問題にならないUNION ALL場合は、パフォーマンス上の理由からの使用をお勧めします。


1
「ユニオン結果セットは昇順でソートされます」-がない限りORDER BY、ソートされた結果は保証されません。多分あなたは特定のSQLベンダーを念頭に置いています(それでも、昇順で正確に何ですか...?)が、この質問にはvendor =固有のタグがありません。
16

「2つの構造と互換性のあるテーブルの内容をマージ」 -私はあなたが本当によくこの部分を述べたと思う:)
onedaywhen

2

2つのテーブルTeacherStudentがあるとします。

どちらもこのように異なる名前の4列があります

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

同じ数の列を持つ2つのテーブルにUNIONまたはUNION ALLを適用できます。ただし、名前やデータ型が異なります。

UNION2つのテーブルに操作を適用すると、重複するエントリはすべて無視されます(テーブルの行のすべての列の値は別のテーブルと同じです)。このような

SELECT * FROM Student
UNION
SELECT * FROM Teacher

結果は

ここに画像の説明を入力してください

UNION ALL2つのテーブルに操作を適用すると、重複してすべてのエントリが返されます(2つのテーブルの行の列の値に違いがある場合)。このような

SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher

出力 ここに画像の説明を入力してください

パフォーマンス:

UNION ALLのパフォーマンスは、重複する値を削除する追加のタスクを実行するため、UNIONよりも明らかに優れています。MSSQLでctrl + Lを押して、実行推定時間から確認できます。


本当に?4行の結果ですか?これはあなたが使いたいシナリオだと思いますUNIONUNION ALL実際のパフォーマンスを絶対的に向上させる可能性が低いため、意図を伝えるためする(つまり、重複がない)。
16

2

非常に簡単に言うと、UNIONとUNION ALLの違いは、UNIONでは重複レコードが省略されるのに対し、UNION ALLでは重複レコードが含まれることです。


1

もう1つ追加したいこと

連合:-結果セットは昇順でソートされます。

Union All:-結果セットはソートされません。2つのクエリ出力が追加されます。


ほんとだ!UNIONは、2つのサブ結果の順序を変更する場合があります。
gracchus

6
これは間違っています。A UNIONは結果を昇順で並べ替えません。使用せずに結果に表示される順序order byは、まったくの偶然です。DBMSは、重複を削除するのが効率的であると考える任意の戦略を自由に使用できます。これ並べ替えの可能性がありますが、ハッシュアルゴリズムまたはまったく異なるものである可能性もあり、行数によって戦略は変化します。100行でソートされたunionように見える A は100.000行ではない可能性があります
a_horse_with_no_name

2
クエリにORDER BY句がない場合、RDBMSは任意の順序で行を自由に返すことができます。UNION操作の結果セットが「昇順」で返されるという観察結果は、データベースによって実行される「一意の並べ替え」操作の副産物にすぎません。観察された動作は保証されていません。したがって、それに依存しないでください。特定の順序で行を返すように指定する場合は、適切なORDER BY句を追加します。
spencer7593

1

SQLでのユニオンとユニオンALLの違い

SQLのUnionとは何ですか?

UNION演算子は、2つ以上のデータセットの結果セットを組み合わせるために使用されます。

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

ユニオンとユニオンのすべての例


1

重要!OracleとMysqlの違い:t1 t2にはそれらの間に重複する行はありませんが、個々に重複する行があるとします。例:t1には2017年からの売上、2018年からのt2があります

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION ALL

SELECT T2.YEAR, T2.PRODUCT FROM T2

ORACLE UNION ALLでは、両方のテーブルからすべての行をフェッチします。MySQLでも同じことが起こります。

しかしながら:

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION

SELECT T2.YEAR, T2.PRODUCT FROM T2

ORACLE T1とT2との間には重複する値が存在しないため、UNIONは、両方のテーブルのすべての行をフェッチします。一方、MySQLでは、テーブルt1内およびテーブルt2内にも重複する行があるため、結果セットの行数は少なくなります。


0

UNIONは重複レコードを削除しますが、UNION ALLは削除しません。ただし、処理されるデータの大部分を確認する必要があり、列とデータ型は同じである必要があります。

unionは内部で「個別の」動作を使用して行を選択するため、時間とパフォーマンスの点でコストが高くなります。お気に入り

select project_id from t_project
union
select project_id from t_project_contact  

これは私に2020年の記録を与えます

一方

select project_id from t_project
union all
select project_id from t_project_contact

17402行を超える

優先度の観点では、どちらにも同じ優先度があります。


0

がない場合ORDER BY、a UNION ALLは行を戻す可能性がありますが、a UNIONはクエリの最後まで待機してから、結果セット全体を一度に取得します。これにより、タイムアウトの状況が変わる可能性があります。UNION ALLは、接続をまま維持します。

したがって、タイムアウトの問題があり、並べ替えがなく、重複が問題でUNION ALLない場合は、かなり役立つことがあります。


しかし、最初の結果のチャンクは、1つの行が何度も複製される可能性があります。それはどれほど便利ですか。
16

0

UNIONおよびUNION ALLは、2つ以上のクエリ結果を組み合わせるために使用されます。

UNIONコマンドは、重複する行を排除する2つのテーブルから個別の関連情報を選択します。

一方、UNION ALLコマンドは両方のテーブルからすべての値を選択し、すべての行を表示します。


0

習慣として、常にUNION ALLを使用してください。非常に煩雑になる可能性のある重複を排除する必要があり、他のすべてのコメントをここで読むことができる特殊な場合には、UNIONのみを使用してください。


0

UNION ALLまた、より多くのデータ型でも機能します。たとえば、空間データ型を結合しようとする場合です。例えば:

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

投げます

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

しかししunion allません。


-1

唯一の違いは:

「UNION」は重複する行を削除します。

「UNION ALL」は重複行を削除しません。


13
これは、受け入れられた回答と比較してどのように価値を追加しますか?
Nick

@ニック短い答えです。
モスタファVatanpour

このデータを取得するために、承認された回答の大部分を読む必要がある場合は、短い方が有利な場合があります。しかし、この場合、受け入れられた回答には、最初の文にこのすべての情報が含まれており、その後、違いの影響について詳細に説明します。
dmckee ---元モデレーターの子猫
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.