Adem KALIN – Yazılım Mühendisi

UNION – UNION ALL Arasındaki Fark

Bugün, benim kullanırken çoğu zaman karıştırmış olduğum UNION ile UNION ALL ifadelerinin arasındaki fark üzerine kısa bir hasbihalde bulunmak istedim 🙂

UNION mekanizmasını birçok sebeple kullanma ihtiyacı duyabiliriz. Bu bazen performans ihtiyaçlarından, bazen arşivleme politikalarından, bazen kod okunabilirliğini arttırmak için olabilir. Fakat bu yapıyı kullanırken doğru sonucu elde etmek için dikkatli olmamız gerekiyor. Syntax itibariyle birbirine çok yakın olsa da, ve hatta çoğu zaman getirdikleri sonuç aynı olsa da aslında birbirinden gayet farklı çalışmaktadırlar. Bu yazıda konu olarak UNION yapısının kullanımını ele almayı düşünmüyorum, kullanacak olduğunuz ortama göre (Oracele, MS SQL Server, MySQL, Sybase…. vs) onunla ilgili bir ton kaynağa ulaşabilirsiniz zaten. Ben sadece çok karışma ihtimali olan bu iki ifade arasındaki farkı ortaya koymak istiyorum.

Aralarındaki fark nedir peki?

Evet ikisi de birden fazla select ifadesinden gelen sonuçları birleştirerek gösterir. Bu yönden aynı çalışıyorlar denilebilir. Ancak bazı zamanlarda birleştirilmiş select ifadelerinden mükerrer (aynı olan) satırlar gelebilir. Aşağıdaki örnek, bunu daha iyi anlamamızı sağlayacak.

(Not : Örneklerde Oracle syntax ‘ını kullanıyor olacağım ancak anlattıklarım genel kuralları içermektedir.)

Öncelikle 2 tablo create ediyoruz.

1
2
3
4
5
Create Table tmp_table1
(
   Column1 Number,
   Column2 Varchar2(5)
)
1
2
3
4
5
Create Table tmp_table2
(
   Column1 Number,
   Column2 Varchar2(5)
)

Bu tablolara örneğimize uygun kayıtlar insert ediyoruz.

1
2
3
4
5
6
7
Insert Into tmp_table1(Column1, Column2) values (1,'A');
Insert Into tmp_table1(Column1, Column2) values (1,'B');
Insert Into tmp_table1(Column1, Column2) values (1,'A');
 
Insert Into tmp_table2(Column1, Column2) values (1,'A');
Insert Into tmp_table2(Column1, Column2) values (1,'B');
Insert Into tmp_table2(Column1, Column2) values (1,'C');

Şu an tabloların içerikleri aşağıdaki gibi:

1
2
3
4
5
6
select * from tmp_table1;
 
Column1 Column2
1       A
1       B
1       A
1
2
3
4
5
6
select * from tmp_table2;
 
Column1 Column2
1       A
1       B
1       C

Görüldüğü üzere tmp_table1 tablosunda tamamen aynı olan 2 satır mevcut. tmp_table1 ve tmp_table2 arasında da hem A lı hem B li aynı olan kayıtlar mevcut. Bu durumda UNION ifadesini kullanarak select imizi oluşturursak sonuçları aşağıdaki gibi olacaktır.

1
2
3
4
5
6
7
8
Select Column1, Column2 From tmp_table1
Union
Select Column1, Column2 From tmp_table2;
 
Column1 Column2
1       A
1       B
1       C

Aynı ifadeyi, yalnızca UNION ALL kullanarak select ettiğimizde sonuçları aşağıdaki gibi olmaktadır:

1
2
3
4
5
6
7
8
9
10
11
Select Column1, Column2 From tmp_table1
Union All
Select Column1, Column2 From tmp_table2;
 
Column1 Column2
1       A
1       B
1       A
1       A
1       B
1       C

Son iki sonuçtan anlaşılacağı üzere, UNION kullanılan sonuçlarda mükerrer kayıtlar gelmemekte, UNION ALL kullanıldığında ise sonuçlarda her iki select ten gelen bütün satırları görmekteyiz, yani mükerrer kayıtlar da gelmekte.

Özet olarak:

  • UNION ALL bütün sonuçları herhangi bir filtreleme yapmadan getirir
  • UNION ise, UNION ALL ile gelen bütün kayıtları bir tablo olarak düşünürsek, bu tablo üzerinde DISTINCT ile bir select alıyormuşuz gibi sonuç getirmektedir.
  • Ayrımı yapmak için ALL ifadesini “ALL = Bütün kayıtlar” olarak aklımızda tutabiliriz belki karıştırmamak adına 🙂

Bundan sonrasında ise hangisini kullanacağınız artık yapılan işte gerekli olan bilgiye göre değişecektir. Size iyi SELECT ler 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir