回答:
UNION
(結果のすべての列が同じである)重複レコードを削除しますが、削除UNION ALL
しません。
のUNION
代わりにを使用するとUNION ALL
、データベースサーバーが重複行を削除するために追加の作業を行う必要があるため、通常は重複が望ましくないため(特にレポートを作成する場合)、パフォーマンスに影響があります。
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
結果:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
結果:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
UNIONとUNION ALLはどちらも、2つの異なるSQLの結果を連結します。重複の処理方法が異なります。
UNIONは結果セットに対してDISTINCTを実行し、重複する行を排除します。
UNION ALLは重複を削除しないため、UNIONよりも高速です。
注:このコマンドを使用している間、選択したすべての列は同じデータ型である必要があります。
例:2つのテーブルがある場合、1)従業員と2)顧客
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を使用する必要があります。
私は最初の投稿で「パフォーマンスがはるかに低い」コメントを修飾するためにコメントしましたが、そうするための評判(ポイント)は不十分です。
ORACLEでは、UNIONはBLOB(またはCLOB)列タイプをサポートしていませんが、UNION ALLはサポートしています。
UNIONとUNION ALLの基本的な違いは、ユニオン操作は結果セットから重複する行を削除しますが、union allは結合後にすべての行を返します。
http://zengin.wordpress.com/2007/07/31/union-vs-union-all/から
次のようなクエリを実行することで、重複を避け、UNION DISTINCT(実際にはUNIONと同じ)よりもはるかに高速に実行できます。
SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X
AND a!=X
パーツに注目してください。これはUNIONよりもはるかに高速です。
UNION
- UNION
あなたのアプローチはしません一方でまた、サブクエリによって返される重複を削除します。
ここでの議論に私の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
。
UNION ALL
T-SQLでは「提供」されません。UNION ALL
ANSI SQL標準の一部であり、MS SQL Serverに固有ではありません。
UNIONコマンドは多くのように、2つのテーブルの関連情報を選択するために使用されるコマンド。ただし、コマンドを使用するときは、選択したすべての列が同じデータ型である必要があります。では、個別の値のみが選択されます。UNION
JOIN
UNION
UNION
UNION ALLコマンドがに等しいことを除いて、コマンドのすべての値を選択します。UNION ALL
UNION
UNION ALL
違いUnion
とUnion all
つまりUnion all
、重複する行を排除しませんが代わりに、それはちょうどあなたのクエリの詳細をフィッティングすべてのテーブルからすべての行を取り出してテーブルにそれらを兼ね備えています。
UNION
声明は、効果的に行いSELECT DISTINCT
、結果セットに。返されたすべてのレコードがユニオンから一意であることを知っている場合は、UNION ALL
代わりに使用すると、結果が速くなります。
どのデータベースが重要かわからない
UNION
そしてUNION ALL
、すべてのSQL Serverで動作するはずです。
不要なUNION
s は避けてください。これらは大きなパフォーマンスリークです。経験則として、UNION ALL
どちらを使用するかわからない場合は使用してください。
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を使用すると、実行プランで個別の並べ替え操作が行われます。この声明を証明する証拠を以下に示します。
UNION
/の実際の実際の使用には適用されませんUNION ALL
)。
union
組み合わせを使用し て結果を生成することができますが、クエリを読み、維持することはほとんど不可能であり、私の経験ではパフォーマンスもひどいものです。比較:対join
case
select foo.bar from foo union select fizz.buzz from fizz
select 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
unionは2つのテーブルから異なる値を選択するために使用され、union allはテーブルからの重複を含むすべての値を選択するために使用されます
()
が2回目に表示されます。実際、考え直してunion all
みると、結果はセットではないので、ベン図を使用してそれを描くことはしないでください。
(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)
結果に適用されたものとして表示されます。重複する行がない場合、この副作用を確認できます。
例を追加します
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;
UNION
2つの構造的に互換性のあるテーブルの内容を1つの結合されたテーブルにマージします。
違いUNION
とは、UNION ALL
ということであるUNION will
のに対し、オミット重複レコードがUNION ALL
重複したレコードが含まれます。
Union
結果セットは昇順でソートされますが、結果セットはソートされUNION ALL
ません
UNION
DISTINCT
結果セットに対してを実行するので、重複する行がなくなります。一方UNION ALL
、重複は削除されないため、UNION
。* より高速です。
注: のパフォーマンスはUNION ALL
、通常よりも良くなるUNION
ことから、UNION
任意の重複を除去する追加作業を行うためのサーバが必要です。したがって、重複がないことが確実な場合、または重複が問題にならないUNION ALL
場合は、パフォーマンス上の理由からの使用をお勧めします。
ORDER BY
、ソートされた結果は保証されません。多分あなたは特定のSQLベンダーを念頭に置いています(それでも、昇順で正確に何ですか...?)が、この質問にはvendor =固有のタグがありません。
2つのテーブルTeacher&Studentがあるとします。
どちらもこのように異なる名前の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を適用できます。ただし、名前やデータ型が異なります。
UNION
2つのテーブルに操作を適用すると、重複するエントリはすべて無視されます(テーブルの行のすべての列の値は別のテーブルと同じです)。このような
SELECT * FROM Student
UNION
SELECT * FROM Teacher
結果は
UNION ALL
2つのテーブルに操作を適用すると、重複してすべてのエントリが返されます(2つのテーブルの行の列の値に違いがある場合)。このような
SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher
パフォーマンス:
UNION ALLのパフォーマンスは、重複する値を削除する追加のタスクを実行するため、UNIONよりも明らかに優れています。MSSQLでctrl + Lを押して、実行推定時間から確認できます。
UNION
UNION ALL
実際のパフォーマンスを絶対的に向上させる可能性が低いため、意図を伝えるためする(つまり、重複がない)。
もう1つ追加したいこと
連合:-結果セットは昇順でソートされます。
Union All:-結果セットはソートされません。2つのクエリ出力が追加されます。
UNION
は結果を昇順で並べ替えません。使用せずに結果に表示される順序order by
は、まったくの偶然です。DBMSは、重複を削除するのが効率的であると考える任意の戦略を自由に使用できます。これは並べ替えの可能性がありますが、ハッシュアルゴリズムまたはまったく異なるものである可能性もあり、行数によって戦略は変化します。100行でソートされたunion
ように見える A は100.000行ではない可能性があります
ORDER BY
句を追加します。
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
重要!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内にも重複する行があるため、結果セットの行数は少なくなります。
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行を超える
優先度の観点では、どちらにも同じ優先度があります。
唯一の違いは:
「UNION」は重複する行を削除します。
「UNION ALL」は重複行を削除しません。