Yanıtlar:
UNIONyinelenen kayıtları kaldırır (sonuçlardaki tüm sütunlar aynı olduğunda) UNION ALL.
Kullanırken UNIONyerine bir performans isabeti varUNION ALLVeritabanı sunucusunun yinelenen satırları kaldırmak için ek iş yapması gerektiğinden, , ancak genellikle yinelenenleri (özellikle raporlar geliştirirken) istemezsiniz.
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
Sonuç:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
Sonuç:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
Hem UNION hem de UNION ALL, iki farklı SQL'in sonucunu birleştirir. Kopyaları ele alma biçimleri farklıdır.
UNION, sonuç kümesinde yinelenen satırları ortadan kaldırarak bir DISTINCT gerçekleştirir.
UNION ALL kopyaları kaldırmaz ve bu nedenle UNION'dan daha hızlıdır.
Not: Bu komutları kullanırken, seçilen tüm sütunların aynı veri türünde olması gerekir.
Örnek: İki tablomuz varsa, 1) Çalışan ve 2) Müşteri




UNIONyinelemeleri kaldırır, oysa kaldırmaz UNION ALL.
Çıkartmak için sonuç kümesi sıralanmış gerekir kopyalar ve bu ise edebilir BİRLİĞİ performansı üzerinde etkisi olan, verilerin hacmine bağlı olarak sıralanmakta olan ve (Oracle için çeşitli RDBMS parametrelerinin ayarları PGA_AGGREGATE_TARGETile WORKAREA_SIZE_POLICY=AUTOya SORT_AREA_SIZEve SOR_AREA_RETAINED_SIZEeğer WORKAREA_SIZE_POLICY=MANUAL).
Temel olarak, bellekte gerçekleştirilebiliyorsa sıralama daha hızlıdır, ancak veri hacmi hakkında aynı uyarı geçerlidir.
Eğer yineleme olmadan iade veriye ihtiyaç Tabii ki, o zaman gerekir verilerinizin kaynağına bağlı olarak, UNION.
Ben "çok daha az performans" yorum hak kazanmak için ilk yazı yorum olurdu, ama bunu yapmak için (itibar) yetersiz var.
ORACLE: UNION, BLOB (veya CLOB) sütun türlerini desteklemez, UNION ALL.
UNION ve UNION ALL arasındaki temel fark, birleşim işleminin yinelenen satırları sonuç kümesinden kaldırmasıdır, ancak birleşim birleştirildikten sonra tüm satırları döndürür.
dan http://zengin.wordpress.com/2007/07/31/union-vs-union-all/
Aşağıdaki gibi bir sorgu çalıştırarak yinelemeleri önleyebilir ve yine de UNION DISTINCT'den (aslında UNION ile aynıdır) çok daha hızlı çalışabilirsiniz:
SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X
Parçaya dikkat edin AND a!=X. Bu sendikadan çok daha hızlı.
UNION- UNIONayrıca alt sorguların döndürdüğü yinelemeleri kaldırır, oysa yaklaşımınız bunu yapmaz.
Buradaki tartışmaya iki sentimi eklemek için: UNION operatörü saf, SET odaklı bir UNION olarak - örneğin set A = {2,4,6,8}, set B = {1,2,3,4 }, BİRLİK B = {1,2,3,4,6,8}
Setleri ile uğraşırken, sayıların 2 ve 4 bir unsuru ya kadar iki kez görünen istemem olduğu veya olmadığı bir sette.
Bununla birlikte, SQL dünyasında, iki setteki tüm öğeleri bir "torbada" birlikte görmek isteyebilirsiniz {2,4,6,8,1,2,3,4}. Ve bu amaçla T-SQL operatöre teklif verir UNION ALL.
UNION ALLT-SQL tarafından " sunulmuyor ". UNION ALLANSI SQL standardının bir parçasıdır ve MS SQL Server'a özgü değildir.
UNION komut çok gibi, iki tablo ilgili bilgi seçmek için kullanılır komutu. Ancak, komutu kullanırken, seçilen tüm sütunların aynı veri türünde olması gerekir. İle yalnızca farklı değerler seçilir.UNIONJOINUNIONUNION
UNION ALL komut eşittir olması dışında, komutaUNION ALLUNIONUNION ALL seçer tüm değerler.
Arasındaki fark UnionveUnion all olmasıdır Union allyerine bu sadece bir tabloya sorgu özelliklerini ve biçerdöverler onları uydurma tüm tablolardan tüm satırları çeker, yinelenen satırları ortadan kaldırmaz.
Bir UNIONdeyim SELECT DISTINCT, sonuç kümesinde etkin bir şekilde a yapar . Döndürülen tüm kayıtların birliğinizden benzersiz olduğunu biliyorsanız UNION ALL, bunun yerine kullanın, daha hızlı sonuç verir.
Hangi veritabanının önemli olduğundan emin değilim
UNIONve UNION ALLtüm SQL sunucularında çalışmalıdır.
UNIONBüyük performans sızıntısı olan gereksizlerden kaçınmalısınız . Temel kural olarak UNION ALLhangisini kullanacağınızdan emin değilseniz kullanın.
UNION - ayrı kayıtlara neden
olurken
UNION ALL - kopyalar dahil tüm kayıtlarla sonuçlanır.
Her ikisi de engelleme operatörleri ve bu yüzden şahsen JOINS'i Engelleme Operatörleri (UNION, INTERSECT, UNION ALL vb.)
Sendika işleminin Birlik işlemine kıyasla neden düşük performans gösterdiğini göstermek için aşağıdaki örnek.
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 ve UNION operasyonlarının sonuçları aşağıdadır.
Bir UNION ifadesi, sonuç kümesinde etkili bir SELECT DISTINCT yapar. Döndürülen tüm kayıtların birliğinizden benzersiz olduğunu biliyorsanız, bunun yerine UNION ALL'u kullanın, daha hızlı sonuç verir.
UNION kullanılması , Yürütme Planında Farklı Sıralama işlemleriyle sonuçlanır . Bu beyanı ispatlayan kanıt aşağıda gösterilmiştir:
UNION/ ' UNION ALL).
unionolarak joins ve bazı gerçekten kötü cases kombinasyonunu kullanarak sonuçları üretebilirsiniz , ancak bu darn-near sorgusunu okumak ve korumak imkansız hale getirir ve benim deneyimime göre de performans için korkunç. Karşılaştır: select foo.bar from foo union select fizz.buzz from fizzkarşı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
birleşim iki tablodan farklı değerler seçmek için kullanılır, burada birleşim tümü tablolardan yinelemeler dahil tüm değerleri seçmek için kullanılır
()ikinci kez gösterilmelidir. Aslında, ikinci düşüncede, union allsonuç bir küme olmadığından, bir Venn diyagramı kullanarak bunu çizmeye çalışmamalısınız!
(Microsoft SQL Server Book Online'dan)
BİRLİĞİ [TÜMÜ]
Birden çok sonuç kümesinin tek bir sonuç kümesi olarak birleştirileceğini ve döndürüleceğini belirtir.
HERŞEY
Tüm satırları sonuçlara dahil eder. Buna kopyalar da dahildir. Belirtilmezse, yinelenen satırlar kaldırılır.
UNIONDISTINCTsonuçlara benzer bir yinelenen satır uygulandığında çok uzun sürecektir .
SELECT * FROM Table1
UNION
SELECT * FROM Table2
şuna eşdeğerdir:
SELECT DISTINCT * FROM (
SELECT * FROM Table1
UNION ALL
SELECT * FROM Table2) DT
DISTINCTSonuçların uygulanmasının bir yan etkisi, sonuçlar üzerinde bir sıralama işlemidir .
UNION ALLsonuçlar sonuçlarda keyfi sıra ile gösterilir, ancak UNIONsonuçlar sonuçlara ORDER BY 1, 2, 3, ..., n (n = column number of Tables)uygulanmış olarak gösterilir . Yinelenen bir satırınız olmadığında bu yan etkiyi görebilirsiniz.
Bir örnek ekliyorum,
BİRLİĞİ , farklı -> yavaşla birleşiyor, çünkü karşılaştırması gerekiyor (Oracle SQL geliştiricisinde, sorgu seçin, maliyet analizini görmek için F10 tuşuna basın).
BİRLİĞİ TÜMÜ , belirgin bir şekilde birleşmeden -> daha hızlı.
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
ve
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;
UNION iki yapısal olarak uyumlu tablonun içeriğini tek bir kombine tabloda birleştirir.
Arasındaki fark UNIONve UNION ALLolmasıdır UNION willoysa omit yinelenen kayıtları UNION ALLyinelenen kayıtları içerecektir.
UnionSonuç kümesi artan sırada sıralanırken UNION ALLSonuç kümesi sıralanmaz
UNIONDISTINCTSonuç kümesinde a gerçekleştirir, böylece yinelenen satırları ortadan kaldırır. Oysa UNION ALLyinelenenleri kaldırmaz ve bu nedenle daha hızlıdır UNION. *
Not : performansı UNION ALLgenellikle daha iyi olacak UNIONçünkü, UNIONyinelemeleri kaldırma ek işi yapmak için sunucu gerektirir. Bu nedenle, kopyaların olmayacağından emin olunan veya kopyaların sorun olmadığı UNION ALLdurumlarda, performans nedenleriyle kullanılması önerilir.
ORDER BY, sıralanan sonuçlar garanti edilmez. Belki aklınızda belirli bir SQL satıcısı var (o zaman bile, tam olarak ne oluyor ...?) Ama bu sorunun hiçbir satıcısı = belirli etiketi yok.
Diyelim ki iki masanız var Öğretmen ve Öğrenci
Her ikisinde de böyle farklı bir Ad ile 4 Sütun var
Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))
Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)
Aynı sayıda sütuna sahip bu iki tabloya UNION veya UNION ALL uygulayabilirsiniz. Ancak farklı ad veya veri türlerine sahiptirler.
UNION2 tabloya işlem uyguladığınızda , tüm yinelenen girdileri ihmal eder (tablodaki satırın tüm sütun değerleri başka bir tablo ile aynıdır). Bunun gibi
SELECT * FROM Student
UNION
SELECT * FROM Teacher
sonuç olacak
Başvurduğunuzda UNION ALL 2 tabloya , yinelenen tüm girdileri döndürür (2 tabloda bir satırın herhangi bir sütun değeri arasında herhangi bir fark varsa). Bunun gibi
SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher
Verim:
Açıkçası UNION ALL performansı, yinelenen değerleri kaldırmak için ek görev yaptıkları için UNION'dan daha iyidir . Sen o kontrol edebilirsiniz Zaman Tahmini Yürütme basın tarafından ctrl + L at MSSQL
UNIONniyet vermek için kullanmak istediğiniz bir senaryo olduğunu düşünürüm (örneğin, kopya yok) çünkü UNION ALLmutlak olarak herhangi bir gerçek yaşam performansı kazancı vermesi olası değildir.
Çok basit bir ifadeyle, UNION ve UNION ALL arasındaki fark, UNION'un yinelenen kayıtları atlaması ve UNION ALL'un yinelenen kayıtları içermesidir.
Eklemek istediğim bir şey daha var.
Birlik : - Sonuç kümesi artan düzende sıralanır.
Tümünü Birleştir: - Sonuç kümesi sıralanmamış. iki Sorgu çıktısı eklenir.
UNIONirade DEĞİL artan düzende sıralamak sonucu. Bir sonuçta kullanmadan gördüğünüz herhangi bir sipariş order bysaf tesadüf. DBMS, kopyaları kaldırmak için etkili olduğunu düşündüğü herhangi bir stratejiyi kullanmakta serbesttir. Bu sıralama olabilir , ancak bir karma algoritma veya tamamen farklı bir şey olabilir - ve strateji satır sayısı ile değişecektir. Bir uniono görünür 100 satırlarla sıralanmış 100.000 satırlarla olmayabilir
ORDER BYcümle ekleyin .
Union Vs Union ALL In Sql Arasındaki Fark
SQL'de Birlik Nedir?
UNION operatörü, iki veya daha fazla veri kümesinin sonuç kümesini birleştirmek için kullanılır.
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
Önemli! Oracle ve Mysql arasındaki fark: diyelim ki t1 t2 aralarında yinelenen satırlar yok, ancak tek tek yinelenen satırlar var. Örnek: t1'in 2017'den satışları ve 2018'den t2'si var
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION ALL
SELECT T2.YEAR, T2.PRODUCT FROM T2
ORACLE UNION TÜMÜNDE her iki tablodaki tüm satırları getirir. Aynı şey MySQL'de de gerçekleşecek.
Ancak:
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION
SELECT T2.YEAR, T2.PRODUCT FROM T2
In ORACLE t1 ve t2 arasında yinelenen değerler olduğundan, UNION iki tablodan tüm satırları getirir. Diğer taraftan MySQL tablo t2 içinde orada da tablo t1 içinde yinelenen satırlar olabilir ve çünkü resultset az satır olacak!
UNION diğer yandan yinelenen kayıtları kaldırır. Ancak, işlenecek veri yığınını kontrol etmek gerekir ve sütun ile veri türü aynı olmalıdır.
sendika, satırları seçmek için dahili olarak "farklı" davranış kullandığından, zaman ve performans açısından daha maliyetlidir. sevmek
select project_id from t_project
union
select project_id from t_project_contact
bu bana 2020 kayıtları veriyor
diğer yandan
select project_id from t_project
union all
select project_id from t_project_contact
bana 17402'den fazla satır veriyor
öncelik perspektifinde her ikisi de aynı önceliğe sahiptir.
Eğer yoksa ORDER BY, a UNION ALLsatırları gittikçe geri getirebilir, oysa bir UNIONkerede tüm sonucu vermeden önce sorgunun sonuna kadar beklemenizi sağlar. Bu, zaman aşımı durumunda bir fark yaratabilir - a UNION ALL, bağlantıyı olduğu gibi canlı tutar.
Bu nedenle, bir mola sorununuz varsa ve sıralama yoksa ve kopyalar bir sorun değilse, UNION ALLoldukça yararlı olabilir.
Alışkanlık olarak, daima UNION ALL kullanın . Son derece dağınık olabilecek kopyaları ortadan kaldırmanız gerektiğinde ve burada diğer yorumlarda okuyabileceğiniz özel durumlarda yalnızca UNION kullanın.
UNION ALLayrıca daha fazla veri türü üzerinde de çalışır. Örneğin, uzamsal veri türlerini birleştirmeye çalışırken. Örneğin:
select a.SHAPE from tableA a
union
select b.SHAPE from tableB b
fırlatacak
The data type geometry cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.
Ancak union allolmayacak.
Tek fark şudur:
"UNION" yinelenen satırları kaldırır.
"UNION ALL" yinelenen satırları kaldırmaz.