Apa perbedaan antara UNION dan UNION ALL?


Jawaban:


1734

UNIONmenghapus rekaman duplikat (di mana semua kolom dalam hasilnya sama), UNION ALLtidak.

Ada hit kinerja saat menggunakan UNIONbukan UNION ALL, karena server database harus melakukan pekerjaan tambahan untuk menghapus baris duplikat, tetapi biasanya Anda tidak ingin duplikat (terutama ketika mengembangkan laporan).

Contoh UNION:

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

Hasil:

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

UNION ALL contoh:

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

Hasil:

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

179
Implikasi dari ini, adalah bahwa serikat pekerja jauh lebih sedikit performans karena harus memindai hasilnya untuk duplikat
Matthew Watson

19
UNION ALL memang akan lebih performant, khususnya karena kurangnya jenis yang berbeda. Praktik umum saya adalah menggunakan UNION ALL kecuali saya secara spesifik menginginkan duplikat.
Adam Caviness

6
Hanya memperhatikan bahwa ada banyak komentar / jawaban yang bagus di sini, jadi saya menyalakan bendera wiki dan menambahkan catatan tentang kinerja ...
Jim Harte

250
UNION ALL bisa lebih lambat daripada UNION dalam kasus dunia nyata di mana jaringan seperti internet, menjadi hambatan. Biaya transfer banyak baris duplikat dapat melebihi manfaat waktu eksekusi permintaan. Ini harus dianalisis berdasarkan kasus per kasus.
Charles Burns

23
@AdamCaviness Komentar Anda tidak masuk akal.
kojow7

285

Baik UNION dan UNION ALL menggabungkan hasil dari dua SQL yang berbeda. Mereka berbeda dalam cara mereka menangani duplikat.

  • UNION melakukan DISTINCT pada set hasil, menghilangkan setiap baris duplikat.

  • UNION ALL tidak menghapus duplikat, dan karena itu lebih cepat daripada UNION.

Catatan: Saat menggunakan perintah ini, semua kolom yang dipilih harus dari tipe data yang sama.

Contoh: Jika kita memiliki dua tabel, 1) Karyawan dan 2) Pelanggan

  1. Data tabel karyawan:

masukkan deskripsi gambar di sini

  1. Data tabel pelanggan:

masukkan deskripsi gambar di sini

  1. Contoh UNION (Ini menghapus semua rekaman duplikat):

masukkan deskripsi gambar di sini

  1. UNION ALL Contoh (Ini hanya menggabungkan catatan, bukan menghilangkan duplikat, sehingga lebih cepat dari UNION):

masukkan deskripsi gambar di sini


3
"semua kolom yang dipilih harus dari tipe data yang sama" - sebenarnya, hal-hal tidak seketat itu (bukan hal yang baik dari sudut pandang model relasional!). Standar SQL mengatakan deskriptor kolom masing-masing harus sama kecuali dalam nama.
onedaywhen

47

UNIONmenghapus duplikat, sedangkan UNION ALLtidak.

Untuk menghapus duplikat, set hasil harus diurutkan, dan ini mungkin berdampak pada kinerja UNION, tergantung pada volume data yang diurutkan, dan pengaturan berbagai parameter RDBMS (Untuk Oracle PGA_AGGREGATE_TARGETdengan WORKAREA_SIZE_POLICY=AUTOatau SORT_AREA_SIZEdan SOR_AREA_RETAINED_SIZEjika WORKAREA_SIZE_POLICY=MANUAL).

Pada dasarnya, pengurutan lebih cepat jika dapat dilakukan dalam memori, tetapi peringatan yang sama tentang volume data berlaku.

Tentu saja, jika Anda membutuhkan data yang dikembalikan tanpa duplikat maka Anda harus menggunakan UNION, tergantung pada sumber data Anda.

Saya akan mengomentari posting pertama untuk memenuhi syarat komentar "jauh lebih sedikit performan", tetapi memiliki reputasi (poin) yang kurang memadai untuk melakukannya.


1
"Untuk menghapus duplikat, set hasil harus diurutkan" - mungkin Anda memiliki vendor tertentu dalam pikiran tetapi tidak ada tag khusus vendor pada pertanyaan. Bahkan jika ada, dapatkah Anda membuktikan bahwa duplikat tidak dapat dihapus tanpa pengurutan?
onedaywhen

2
berbeda akan "secara implisit" mengurutkan hasil, karena menghapus duplikat lebih cepat pada set yang diurutkan. ini tidak berarti resultset yang dikembalikan sebenarnya diurutkan seperti itu, tetapi dalam kebanyakan kasus berbeda (dan karena itu, UNION) akan secara internal mengurutkan set hasil.
DevilSuichiro



13

Anda dapat menghindari duplikat dan masih berjalan lebih cepat daripada UNION DISTINCT (yang sebenarnya sama dengan UNION) dengan menjalankan kueri seperti ini:

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

Perhatikan AND a!=Xbagian itu. Ini jauh lebih cepat daripada UNION.


4
Ini akan menghilangkan baris dan karena itu gagal menghasilkan hasil yang diharapkan jika a berisi nilai NULL. Selain itu, masih tidak mengembalikan hasil yang sama dengan a UNION- UNIONjuga menghapus duplikat yang dikembalikan oleh subqueries, sedangkan pendekatan Anda tidak akan.
Frank Schmitt

@ FrankSchmitt - terima kasih atas jawaban ini; sedikit tentang subqueries ini adalah apa yang ingin saya ketahui!
Doradus

11

Hanya dengan menambahkan dua sen saya ke diskusi di sini: orang dapat memahami UNIONoperator sebagai UNION murni yang berorientasi pada SET - mis. Set A = {2,4,6,8}, set B = {1,2,3,4 }, A UNION B = {1,2,3,4,6,8}

Saat berhadapan dengan set, Anda tidak ingin angka 2 dan 4 muncul dua kali, karena elemennya ada atau tidak dalam satu set.

Dalam dunia SQL, Anda mungkin ingin melihat semua elemen dari dua set bersama dalam satu "tas" {2,4,6,8,1,2,3,4}. Dan untuk tujuan ini T-SQL menawarkan operator UNION ALL.


2
Nitpick: UNION ALLtidak "ditawarkan" oleh T-SQL. UNION ALLadalah bagian dari standar SQL ANSI dan tidak khusus untuk MS SQL Server.
Frank Schmitt

1
Komentar 'Nitpick' dapat menyiratkan bahwa Anda tidak dapat menggunakan "Union All" di TSQL, tetapi Anda bisa. Tentu saja, komentar itu tidak mengatakan itu, tetapi seseorang yang membacanya mungkin menyimpulkannya.
JosephDoggie

10

UNION
The UNIONPerintah ini digunakan untuk memilih informasi terkait dari dua tabel, mirip dengan JOINperintah. Namun, saat menggunakan UNIONperintah, semua kolom yang dipilih harus dari tipe data yang sama. Dengan UNION, hanya nilai berbeda yang dipilih.

UNION ALL
The UNION ALLperintah sama dengan UNIONperintah, kecuali bahwa UNION ALLmenyeleksi semua nilai.

Perbedaan antara Uniondan Union allitu Union alltidak akan menghilangkan baris duplikat, melainkan hanya menarik semua baris dari semua tabel yang sesuai dengan kueri spesifik Anda dan menggabungkannya ke dalam tabel.

Sebuah UNIONpernyataan efektif melakukan SELECT DISTINCThasil set. Jika Anda tahu bahwa semua catatan yang dikembalikan unik dari serikat Anda, gunakan UNION ALLsebagai gantinya, itu memberikan hasil yang lebih cepat.


8

Tidak yakin bahwa itu penting basis data mana

UNIONdan UNION ALLharus bekerja pada semua Server SQL.

Anda harus menghindari hal-hal yang tidak perlu UNIONkarena ini adalah kebocoran kinerja yang sangat besar. Sebagai aturan praktis gunakan UNION ALLjika Anda tidak yakin mana yang akan digunakan.


Tidak ada tag SQL Server untuk pertanyaan ini. Saya pikir opsi yang mengembalikan duplikat hanya karena biasanya melakukan yang terbaik adalah saran yang salah.
onedaywhen

1
@oneday ketika saya kira OP menggunakan frasa "SQL Server" sebagai sinonim untuk semua RDBMS (misalnya MySQL, PostGreSQL, Oracle, SQL Server). Namun, kata-katanya sangat disayangkan (dan tentu saja, saya mungkin salah).
Frank Schmitt

@FrankSchmitt: tidak ada produk yang Anda daftarkan yang benar-benar RDBMS :)
onedaywhen

1
@oneday kapan peduli untuk menguraikan? Setidaknya en.wikipedia.org/wiki/Relational_database_management_system tampaknya setuju dengan saya - itu secara eksplisit menyebutkan Microsoft SQL Server, Oracle Database, dan MySQL. Atau apakah Anda bingung tentang perbedaan antara Oracle dan Oracle Database misalnya?
Frank Schmitt

8

UNION - menghasilkan catatan yang berbeda

sementara

UNION ALL - menghasilkan semua catatan termasuk duplikat.

Keduanya memblokir operator dan karenanya saya pribadi lebih suka menggunakan GABUNGAN daripada Operator Blocking (UNION, INTERSECT, UNION ALL etc.) kapan saja.

Untuk mengilustrasikan mengapa operasi Union berkinerja buruk dibandingkan dengan Union All checkout contoh berikut.

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'

masukkan deskripsi gambar di sini

Berikut ini adalah hasil dari operasi UNION ALL dan UNION.

masukkan deskripsi gambar di sini

Pernyataan UNION secara efektif melakukan SELECT DISTINCT pada hasil yang ditetapkan. Jika Anda tahu bahwa semua catatan yang dikembalikan unik dari serikat Anda, gunakan UNION ALL sebagai gantinya, itu memberikan hasil yang lebih cepat.

Menggunakan hasil UNION dalam operasi Sort Sort dalam Rencana Eksekusi. Bukti untuk membuktikan pernyataan ini ditunjukkan di bawah ini:

masukkan deskripsi gambar di sini


3
Segala sesuatu dalam jawaban ini telah dikatakan sudah, terlalu membingungkan untuk berguna (menyarankan bergabung dengan serikat pekerja ketika mereka melakukan hal-hal yang berbeda, memberikan "pemblokiran" sebagai alasan tanpa menjelaskan apa yang Anda maksudkan dengan itu atau ke server database mana yang berlaku), atau sangat menyesatkan (persentase Anda di tangkapan layar tidak berlaku untuk penggunaan aktual aktual dari UNION/ UNION ALL).

Blocking Operator adalah operator terkenal di TSQL. Segala sesuatu yang dilakukan operator pemblokiran dapat dicapai oleh Bergabung tetapi tidak sebaliknya. Operasi Sorting yang berbeda dilingkari dalam gambar untuk menunjukkan mengapa union semua berkinerja lebih baik daripada union dan juga untuk menunjukkan dengan tepat di mana ia berada dalam rencana eksekusi. Jangan ragu untuk menambahkan lebih banyak data ke tabel T1 dan T2 untuk bermain-main dengan persentase!
DBA

Anda secara teknis BISA menghasilkan hasil unionmenggunakan kombinasi joins dan beberapa s benar-benar buruk case, tetapi itu membuat kueri sangat dekat untuk membaca dan memelihara, dan dalam pengalaman saya itu juga mengerikan untuk kinerja. Bandingkan: select foo.bar from foo union select fizz.buzz from fizzmelawanselect 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 Jawaban Anda hanya relevan untuk pengguna MS SQL Server. OP tidak pernah menyebutkan RDBMS yang mereka gunakan - mereka mungkin menggunakan MySQL, PostgreSQL, Oracle, SQLite, ...
Frank Schmitt

6

union digunakan untuk memilih nilai yang berbeda dari dua tabel di mana sebagai union semua digunakan untuk memilih semua nilai termasuk duplikat dari tabel


6

Adalah baik untuk memahami dengan diagram Venn.

di sini adalah tautan ke sumber. Ada deskripsi yang bagus.

masukkan deskripsi gambar di sini


5
Gambar kedua Anda menunjukkan keduanya saling eksklusif ketika mereka tidak. Gambar sebaiknya menampilkan yang sama dengan yang pertama tetapi dengan 'persimpangan elips' ()ditampilkan untuk kedua kalinya. Sebenarnya, pada pemikiran kedua, karena union allhasilnya bukan satu set, Anda tidak perlu berusaha menggambarnya menggunakan diagram Venn!
onedaywhen

5

(Dari Microsoft SQL Server Book Online)

UNION [SEMUA]

Menentukan bahwa beberapa set hasil harus digabungkan dan dikembalikan sebagai satu set hasil tunggal.

SEMUA

Menggabungkan semua baris ke dalam hasil. Ini termasuk duplikat. Jika tidak ditentukan, baris duplikat dihapus.

UNIONakan memakan waktu terlalu lama karena duplikat baris temuan seperti DISTINCTditerapkan pada hasil.

SELECT * FROM Table1
UNION
SELECT * FROM Table2

setara dengan:

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

Efek samping dari penerapan DISTINCTlebih dari hasil adalah operasi penyortiran pada hasil.

UNION ALLhasil akan ditampilkan sebagai urutan sewenang - wenang pada hasil Tetapi UNIONhasil akan ditampilkan sebagaimana ORDER BY 1, 2, 3, ..., n (n = column number of Tables)diterapkan pada hasil. Anda dapat melihat efek samping ini ketika Anda tidak memiliki baris duplikat.


5

Saya menambahkan contoh,

UNION , itu bergabung dengan berbeda -> lebih lambat, karena itu perlu membandingkan (Dalam Oracle SQL developer, pilih query, tekan F10 untuk melihat analisis biaya).

UNION ALL , itu menyatu tanpa perbedaan -> lebih cepat.

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

dan

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

2

UNION menggabungkan konten dari dua tabel yang kompatibel secara struktural ke dalam tabel gabungan tunggal.

  • Perbedaan:

Perbedaan antara UNIONdan UNION ALLadalah bahwa UNION willomit duplikat catatan sedangkan UNION ALLakan mencakup catatan duplikat.

UnionHimpunan hasil diurutkan dalam urutan naik sedangkan UNION ALLhimpunan Hasil tidak diurutkan

UNIONmelakukan a DISTINCTpada set Hasil sehingga akan menghilangkan setiap baris duplikat. Sedangkan UNION ALLtidak akan menghapus duplikat dan karena itu lebih cepat daripada UNION. *

Catatan : Kinerja UNION ALLbiasanya akan lebih baik daripada UNION, karena UNIONmengharuskan server untuk melakukan pekerjaan tambahan menghapus duplikat. Jadi, dalam kasus di mana dipastikan tidak akan ada duplikat, atau di mana memiliki duplikat tidak menjadi masalah, penggunaan UNION ALLakan direkomendasikan untuk alasan kinerja.


1
"Kumpulan Hasil Union diurutkan dalam urutan menaik" - Kecuali jika ada ORDER BY, hasil yang diurutkan tidak dijamin. Mungkin Anda memiliki vendor SQL tertentu dalam pikiran (bahkan kemudian, urutan naik apa sebenarnya ...?) Tetapi pertanyaan ini tidak memiliki vendor = tag spesifik.
onedaywhen

"menggabungkan isi dari dua tabel yang kompatibel secara struktural" - Saya pikir Anda telah menyatakan bagian ini dengan sangat baik :)
onedaywhen

2

Misalkan Anda memiliki dua meja Guru & Siswa

Keduanya memiliki 4 Kolom dengan Nama yang berbeda seperti ini

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

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini

Anda dapat menerapkan UNION atau UNION ALL untuk dua tabel yang memiliki jumlah kolom yang sama. Tetapi mereka memiliki nama atau tipe data yang berbeda.

Ketika Anda menerapkan UNIONoperasi pada 2 tabel, itu mengabaikan semua entri duplikat (semua nilai kolom baris dalam tabel sama dengan tabel lain). Seperti ini

SELECT * FROM Student
UNION
SELECT * FROM Teacher

hasilnya akan

masukkan deskripsi gambar di sini

Ketika Anda menerapkan UNION ALLoperasi pada 2 tabel, itu mengembalikan semua entri dengan duplikat (jika ada perbedaan antara nilai kolom baris dalam 2 tabel). Seperti ini

SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher

Keluaran masukkan deskripsi gambar di sini

Kinerja:

Jelas UNION SEMUA kinerja lebih baik daripada UNION karena mereka melakukan tugas tambahan untuk menghapus nilai duplikat. Anda dapat memeriksa itu dari Waktu Perkiraan Eksekusi dengan menekan ctrl + L di MSSQL


Betulkah? Untuk hasil empat baris ?! Saya akan berpikir ini adalah skenario di mana Anda ingin menggunakan UNIONuntuk menyampaikan maksud (yaitu, tidak ada duplikat) karena UNION ALLtidak mungkin memberikan keuntungan kinerja kehidupan nyata dalam hal absolut.
onedaywhen

2

Dengan kata-kata yang sangat sederhana perbedaan antara UNION dan UNION ALL adalah bahwa UNION akan menghilangkan rekaman duplikat sedangkan UNION ALL akan memasukkan rekaman duplikat.


1

Satu hal lagi yang ingin saya tambahkan-

Serikat pekerja : - Hasil ditetapkan diurutkan dalam urutan menaik.

Persatuan Semua : - Kumpulan hasil tidak diurutkan. dua output Query baru saja ditambahkan.


Benar! UNION dapat mengubah urutan kedua sub-hasil.
gracchus

6
Ini salah. A TIDAKUNION akan mengurutkan hasilnya dalam urutan menaik. Setiap pemesanan yang Anda lihat dalam hasil tanpa menggunakan adalah kebetulan murni. DBMS bebas menggunakan strategi apa pun yang dianggapnya efisien untuk menghapus duplikat. Ini mungkin penyortiran, tetapi bisa juga berupa algoritma hashing atau sesuatu yang sama sekali berbeda - dan strateginya akan berubah dengan jumlah baris. A yang muncul diurutkan dengan 100 baris mungkin tidak dengan 100.000 barisorder byunion
a_horse_with_no_name

2
Tanpa klausa ORDER BY pada kueri, RDBMS bebas untuk mengembalikan baris dalam urutan apa pun . Pengamatan bahwa hasil yang ditetapkan dari operasi UNION dikembalikan "dalam urutan naik" hanyalah produk sampingan dari operasi "semacam unik" yang dilakukan oleh database. Perilaku yang diamati tidak dijamin. Jadi jangan mengandalkan itu. Jika spesifikasinya adalah mengembalikan baris dalam urutan tertentu, maka tambahkan ORDER BYklausa yang sesuai .
spencer7593

1

Perbedaan Antara Union Vs Union ALL Dalam Sql

Apa itu Union di SQL?

Operator UNION digunakan untuk menggabungkan set hasil dari dua atau lebih set data.

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 Semua Dengan Contoh


1

Penting! Perbedaan antara Oracle dan Mysql: Misalkan t1 t2 tidak memiliki baris duplikat di antara mereka tetapi mereka memiliki baris duplikat individual. Contoh: t1 memiliki penjualan dari 2017 dan t2 dari 2018

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION ALL

SELECT T2.YEAR, T2.PRODUCT FROM T2

Dalam ORACLE UNION ALL mengambil semua baris dari kedua tabel. Hal yang sama akan terjadi di MySQL.

Namun:

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION

SELECT T2.YEAR, T2.PRODUCT FROM T2

Di ORACLE , UNION mengambil semua baris dari kedua tabel karena tidak ada nilai duplikat antara t1 dan t2. Di sisi lain di MySQL resultset akan memiliki lebih sedikit baris karena akan ada baris duplikat dalam tabel t1 dan juga dalam tabel t2!


0

UNION menghapus catatan duplikat di sisi lain UNION ALL tidak. Tetapi orang perlu memeriksa sebagian besar data yang akan diproses dan kolom dan tipe data harus sama.

karena serikat pekerja secara internal menggunakan perilaku "berbeda" untuk memilih baris maka lebih mahal dalam hal waktu dan kinerja. Suka

select project_id from t_project
union
select project_id from t_project_contact  

ini memberi saya catatan 2020

di sisi lain

select project_id from t_project
union all
select project_id from t_project_contact

memberi saya lebih dari 17402 baris

pada presedensi perspektif keduanya memiliki presedensi yang sama.


0

Jika tidak ada ORDER BY, a UNION ALLdapat mengembalikan baris saat berjalan, sedangkan a UNIONakan membuat Anda menunggu hingga akhir kueri sebelum memberikan Anda seluruh hasil yang ditetapkan sekaligus. Ini dapat membuat perbedaan dalam situasi time-out - aUNION ALL seolah membuat koneksi tetap hidup.

Jadi, jika Anda memiliki masalah time-out, dan tidak ada penyortiran, dan duplikat bukan masalah, UNION ALLmungkin agak membantu.


Tetapi hasil pertama Anda dapat digandakan satu baris berkali-kali: seberapa bermanfaatkah itu ?!
onedaywhen

0

UNION dan UNION ALL digunakan untuk menggabungkan dua atau lebih hasil kueri.

Perintah UNION memilih informasi yang berbeda dan terkait dari dua tabel yang akan menghilangkan baris duplikat.

Di sisi lain, perintah UNION ALL memilih semua nilai dari kedua tabel, yang menampilkan semua baris.


0

Sebagai kebiasaan, Selalu gunakan UNION ALL . Gunakan hanya UNION dalam kasus khusus ketika Anda perlu menghilangkan duplikat yang bisa sangat berantakan dan Anda dapat membaca semua tentang di komentar lain di sini.


0

UNION ALLjuga bekerja pada lebih banyak tipe data juga. Misalnya ketika mencoba untuk menyatukan tipe data spasial. Sebagai contoh:

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

akan melempar

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

Namun union alltidak akan.


-1

Satu-satunya perbedaan adalah:

"UNION" menghapus baris duplikat.

"UNION ALL" tidak menghapus baris duplikat.


13
Bagaimana ini menambahkan nilai apa pun dibandingkan dengan jawaban yang diterima?
Nick

@Nick Ini adalah jawaban yang lebih pendek.
Mostafa Vatanpour

Lebih pendek mungkin menjadi keuntungan jika Anda harus membaca bagian penting dari jawaban yang diterima untuk mendapatkan data ini. Tetapi dalam hal ini jawaban yang diterima berisi semua informasi ini dalam kalimat pertama setelah itu membahas implikasi perbedaan secara rinci.
dmckee --- ex-moderator kitten
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.