Yanıtlar:
UNION
yinelenen kayıtları kaldırır (sonuçlardaki tüm sütunlar aynı olduğunda) UNION ALL
.
Kullanırken UNION
yerine bir performans isabeti varUNION ALL
Veritabanı 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
UNION
yinelemeleri 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_TARGET
ile WORKAREA_SIZE_POLICY=AUTO
ya SORT_AREA_SIZE
ve SOR_AREA_RETAINED_SIZE
eğ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
- UNION
ayrı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 ALL
T-SQL tarafından " sunulmuyor ". UNION ALL
ANSI 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.UNION
JOIN
UNION
UNION
UNION ALL komut eşittir olması dışında, komutaUNION ALL
UNION
UNION ALL
seçer tüm değerler.
Arasındaki fark Union
veUnion all
olmasıdır Union all
yerine 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 UNION
deyim 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
UNION
ve UNION ALL
tüm SQL sunucularında çalışmalıdır.
UNION
Büyük performans sızıntısı olan gereksizlerden kaçınmalısınız . Temel kural olarak UNION ALL
hangisini 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
).
union
olarak join
s ve bazı gerçekten kötü case
s 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 fizz
karşı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 all
sonuç 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.
UNION
DISTINCT
sonuç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
DISTINCT
Sonuçların uygulanmasının bir yan etkisi, sonuçlar üzerinde bir sıralama işlemidir .
UNION ALL
sonuçlar sonuçlarda keyfi sıra ile gösterilir, ancak UNION
sonuç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 UNION
ve UNION ALL
olmasıdır UNION will
oysa omit yinelenen kayıtları UNION ALL
yinelenen kayıtları içerecektir.
Union
Sonuç kümesi artan sırada sıralanırken UNION ALL
Sonuç kümesi sıralanmaz
UNION
DISTINCT
Sonuç kümesinde a gerçekleştirir, böylece yinelenen satırları ortadan kaldırır. Oysa UNION ALL
yinelenenleri kaldırmaz ve bu nedenle daha hızlıdır UNION
. *
Not : performansı UNION ALL
genellikle daha iyi olacak UNION
çünkü, UNION
yinelemeleri kaldırma ek işi yapmak için sunucu gerektirir. Bu nedenle, kopyaların olmayacağından emin olunan veya kopyaların sorun olmadığı UNION ALL
durumlarda, 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.
UNION
2 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
UNION
niyet vermek için kullanmak istediğiniz bir senaryo olduğunu düşünürüm (örneğin, kopya yok) çünkü UNION ALL
mutlak 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.
UNION
irade DEĞİL artan düzende sıralamak sonucu. Bir sonuçta kullanmadan gördüğünüz herhangi bir sipariş order by
saf 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 union
o görünür 100 satırlarla sıralanmış 100.000 satırlarla olmayabilir
ORDER BY
cü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 ALL
satırları gittikçe geri getirebilir, oysa bir UNION
kerede 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 ALL
oldukç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 ALL
ayrı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 all
olmayacak.
Tek fark şudur:
"UNION" yinelenen satırları kaldırır.
"UNION ALL" yinelenen satırları kaldırmaz.