Jawaban:
UNION
menghapus rekaman duplikat (di mana semua kolom dalam hasilnya sama), UNION ALL
tidak.
Ada hit kinerja saat menggunakan UNION
bukan UNION ALL
, karena server database harus melakukan pekerjaan tambahan untuk menghapus baris duplikat, tetapi biasanya Anda tidak ingin duplikat (terutama ketika mengembangkan laporan).
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
Hasil:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
Hasil:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
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
UNION
menghapus duplikat, sedangkan UNION 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
dengan WORKAREA_SIZE_POLICY=AUTO
atau SORT_AREA_SIZE
dan SOR_AREA_RETAINED_SIZE
jika 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.
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.
dari http://zengin.wordpress.com/2007/07/31/union-vs-union-all/
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.
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
.
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 dengan JOIN
perintah. Namun, saat menggunakan UNION
perintah, semua kolom yang dipilih harus dari tipe data yang sama. Dengan UNION
, hanya nilai berbeda yang dipilih.
UNION ALL
The UNION ALL
perintah sama dengan UNION
perintah, kecuali bahwa UNION ALL
menyeleksi semua nilai.
Perbedaan antara Union
dan Union all
itu Union 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 melakukan SELECT DISTINCT
hasil set. Jika Anda tahu bahwa semua catatan yang dikembalikan unik dari serikat Anda, gunakan UNION ALL
sebagai gantinya, itu memberikan hasil yang lebih cepat.
Tidak yakin bahwa itu penting basis data mana
UNION
dan UNION 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 gunakan UNION ALL
jika Anda tidak yakin mana yang akan digunakan.
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'
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:
UNION
/ UNION ALL
).
union
menggunakan kombinasi join
s 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 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
Adalah baik untuk memahami dengan diagram Venn.
di sini adalah tautan ke sumber. Ada deskripsi yang bagus.
()
ditampilkan untuk kedua kalinya. Sebenarnya, pada pemikiran kedua, karena union all
hasilnya bukan satu set, Anda tidak perlu berusaha menggambarnya menggunakan diagram Venn!
(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.
UNION
akan memakan waktu terlalu lama karena duplikat baris temuan seperti DISTINCT
diterapkan 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
DISTINCT
lebih dari hasil adalah operasi penyortiran pada hasil.
UNION ALL
hasil akan ditampilkan sebagai urutan sewenang - wenang pada hasil Tetapi UNION
hasil 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.
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;
UNION
menggabungkan konten dari dua tabel yang kompatibel secara struktural ke dalam tabel gabungan tunggal.
Perbedaan antara UNION
dan UNION ALL
adalah bahwa UNION will
omit duplikat catatan sedangkan UNION ALL
akan mencakup catatan duplikat.
Union
Himpunan hasil diurutkan dalam urutan naik sedangkan UNION ALL
himpunan Hasil tidak diurutkan
UNION
melakukan a DISTINCT
pada set Hasil sehingga akan menghilangkan setiap baris duplikat. Sedangkan UNION ALL
tidak akan menghapus duplikat dan karena itu lebih cepat daripada UNION
. *
Catatan : Kinerja UNION ALL
biasanya akan lebih baik daripada UNION
, karena UNION
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, penggunaan UNION ALL
akan direkomendasikan untuk alasan kinerja.
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
Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))
Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)
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 ini
SELECT * FROM Student
UNION
SELECT * FROM Teacher
hasilnya 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 ini
SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher
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
UNION
untuk menyampaikan maksud (yaitu, tidak ada duplikat) karena UNION 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.
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.
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.
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
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!
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.
Jika tidak ada ORDER BY
, a UNION ALL
dapat mengembalikan baris saat berjalan, sedangkan a UNION
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.
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.
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.
UNION ALL
juga 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 all
tidak akan.
Satu-satunya perbedaan adalah:
"UNION" menghapus baris duplikat.
"UNION ALL" tidak menghapus baris duplikat.