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 UNIONSELECT'foo'AS bar
Hasil:
+-----+| bar |+-----+| foo |+-----+1rowinset(0.00 sec)
UNION ALL contoh:
SELECT'foo'AS bar UNIONALLSELECT'foo'AS bar
Hasil:
+-----+| bar |+-----+| foo || foo |+-----+2rowsinset(0.00 sec)
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
Data tabel karyawan:
Data tabel pelanggan:
Contoh UNION (Ini menghapus semua rekaman duplikat):
UNION ALL Contoh (Ini hanya menggabungkan catatan, bukan menghilangkan duplikat, sehingga lebih cepat dari UNION):
"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.
"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
30
Di ORACLE: UNION tidak mendukung jenis kolom BLOB (atau CLOB), UNION ALL tidak.
Perbedaan mendasar antara UNION dan UNION ALL adalah operasi serikat menghapuskan duplikat baris dari hasil yang ditetapkan tetapi serikat semua mengembalikan semua baris setelah bergabung.
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.
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.
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.
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.
Berikut ini adalah hasil dari operasi UNION ALL dan UNION.
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:
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
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.
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.
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.
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.
"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
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
UNIONSELECT*FROM Teacher
hasilnya akan
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
UNIONALLSELECT*FROM Teacher
Keluaran
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.
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 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
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
UNIONALLSELECT 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
UNIONSELECT 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!
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
unionselect project_id from t_project_contact
ini memberi saya catatan 2020
di sisi lain
select project_id from t_project
unionallselect project_id from t_project_contact
memberi saya lebih dari 17402 baris
pada presedensi perspektif keduanya memiliki presedensi yang sama.
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.
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.
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.
Jawaban:
UNION
menghapus rekaman duplikat (di mana semua kolom dalam hasilnya sama),UNION ALL
tidak.Ada hit kinerja saat menggunakan
UNION
bukanUNION ALL
, karena server database harus melakukan pekerjaan tambahan untuk menghapus baris duplikat, tetapi biasanya Anda tidak ingin duplikat (terutama ketika mengembangkan laporan).Contoh UNION:
Hasil:
UNION ALL contoh:
Hasil:
sumber
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.
Contoh: Jika kita memiliki dua tabel, 1) Karyawan dan 2) Pelanggan
sumber
UNION
menghapus duplikat, sedangkanUNION ALL
tidak.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_TARGET
denganWORKAREA_SIZE_POLICY=AUTO
atauSORT_AREA_SIZE
danSOR_AREA_RETAINED_SIZE
jikaWORKAREA_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.
sumber
Di ORACLE: UNION tidak mendukung jenis kolom BLOB (atau CLOB), UNION ALL tidak.
sumber
dari http://zengin.wordpress.com/2007/07/31/union-vs-union-all/
sumber
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!=X
bagian itu. Ini jauh lebih cepat daripada UNION.sumber
UNION
-UNION
juga menghapus duplikat yang dikembalikan oleh subqueries, sedangkan pendekatan Anda tidak akan.Hanya dengan menambahkan dua sen saya ke diskusi di sini: orang dapat memahami
UNION
operator 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
.sumber
UNION ALL
tidak "ditawarkan" oleh T-SQL.UNION ALL
adalah bagian dari standar SQL ANSI dan tidak khusus untuk MS SQL Server.UNION
The
UNION
Perintah ini digunakan untuk memilih informasi terkait dari dua tabel, mirip denganJOIN
perintah. Namun, saat menggunakanUNION
perintah, semua kolom yang dipilih harus dari tipe data yang sama. DenganUNION
, hanya nilai berbeda yang dipilih.UNION ALL
The
UNION ALL
perintah sama denganUNION
perintah, kecuali bahwaUNION ALL
menyeleksi semua nilai.Perbedaan antara
Union
danUnion all
ituUnion all
tidak akan menghilangkan baris duplikat, melainkan hanya menarik semua baris dari semua tabel yang sesuai dengan kueri spesifik Anda dan menggabungkannya ke dalam tabel.Sebuah
UNION
pernyataan efektif melakukanSELECT DISTINCT
hasil set. Jika Anda tahu bahwa semua catatan yang dikembalikan unik dari serikat Anda, gunakanUNION ALL
sebagai gantinya, itu memberikan hasil yang lebih cepat.sumber
UNION
danUNION ALL
harus bekerja pada semua Server SQL.Anda harus menghindari hal-hal yang tidak perlu
UNION
karena ini adalah kebocoran kinerja yang sangat besar. Sebagai aturan praktis gunakanUNION ALL
jika Anda tidak yakin mana yang akan digunakan.sumber
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.
Berikut ini adalah hasil dari operasi UNION ALL dan UNION.
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:
sumber
UNION
/UNION ALL
).union
menggunakan kombinasijoin
s dan beberapa s benar-benar burukcase
, 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 fizz
melawanselect 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 digunakan untuk memilih nilai yang berbeda dari dua tabel di mana sebagai union semua digunakan untuk memilih semua nilai termasuk duplikat dari tabel
sumber
Adalah baik untuk memahami dengan diagram Venn.
di sini adalah tautan ke sumber. Ada deskripsi yang bagus.
sumber
()
ditampilkan untuk kedua kalinya. Sebenarnya, pada pemikiran kedua, karenaunion all
hasilnya bukan satu set, Anda tidak perlu berusaha menggambarnya menggunakan diagram Venn!(Dari Microsoft SQL Server Book Online)
UNION [SEMUA]
SEMUA
UNION
akan memakan waktu terlalu lama karena duplikat baris temuan sepertiDISTINCT
diterapkan pada hasil.setara dengan:
UNION ALL
hasil akan ditampilkan sebagai urutan sewenang - wenang pada hasil TetapiUNION
hasil akan ditampilkan sebagaimanaORDER 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.sumber
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.
dan
sumber
UNION
menggabungkan konten dari dua tabel yang kompatibel secara struktural ke dalam tabel gabungan tunggal.Perbedaan antara
UNION
danUNION ALL
adalah bahwaUNION will
omit duplikat catatan sedangkanUNION ALL
akan mencakup catatan duplikat.Union
Himpunan hasil diurutkan dalam urutan naik sedangkanUNION ALL
himpunan Hasil tidak diurutkanUNION
melakukan aDISTINCT
pada set Hasil sehingga akan menghilangkan setiap baris duplikat. SedangkanUNION ALL
tidak akan menghapus duplikat dan karena itu lebih cepat daripadaUNION
. *Catatan : Kinerja
UNION ALL
biasanya akan lebih baik daripadaUNION
, karenaUNION
mengharuskan 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, penggunaanUNION ALL
akan direkomendasikan untuk alasan kinerja.sumber
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.Misalkan Anda memiliki dua meja Guru & Siswa
Keduanya memiliki 4 Kolom dengan Nama yang berbeda seperti ini
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
UNION
operasi pada 2 tabel, itu mengabaikan semua entri duplikat (semua nilai kolom baris dalam tabel sama dengan tabel lain). Seperti inihasilnya akan
Ketika Anda menerapkan
UNION ALL
operasi pada 2 tabel, itu mengembalikan semua entri dengan duplikat (jika ada perbedaan antara nilai kolom baris dalam 2 tabel). Seperti iniKeluaran
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
sumber
UNION
untuk menyampaikan maksud (yaitu, tidak ada duplikat) karenaUNION ALL
tidak mungkin memberikan keuntungan kinerja kehidupan nyata dalam hal absolut.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.
sumber
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.
sumber
UNION
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 by
union
ORDER BY
klausa yang sesuai .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.
Union Vs Union Semua Dengan Contoh
sumber
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
Dalam ORACLE UNION ALL mengambil semua baris dari kedua tabel. Hal yang sama akan terjadi di MySQL.
Namun:
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!
sumber
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
ini memberi saya catatan 2020
di sisi lain
memberi saya lebih dari 17402 baris
pada presedensi perspektif keduanya memiliki presedensi yang sama.
sumber
Jika tidak ada
ORDER BY
, aUNION ALL
dapat mengembalikan baris saat berjalan, sedangkan aUNION
akan 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 ALL
mungkin agak membantu.sumber
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.
sumber
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.
sumber
UNION ALL
juga bekerja pada lebih banyak tipe data juga. Misalnya ketika mencoba untuk menyatukan tipe data spasial. Sebagai contoh: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 all
tidak akan.sumber
Satu-satunya perbedaan adalah:
"UNION" menghapus baris duplikat.
"UNION ALL" tidak menghapus baris duplikat.
sumber