UNION mı UNION ALL mı? Sorgu Sonuçlarını Birleştirirken Doğru Seçim
Karşılaştırma

UNION mı UNION ALL mı? Sorgu Sonuçlarını Birleştirirken Doğru Seçim

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

UNION sorgu sonuçlarını birleştirip yinelenen satırları atar, UNION ALL hepsini korur. Doğruluk, performans ve doğru seçim için ölçütler.

Ortak zemin: sorgu sonuçlarını alt alta eklemek

UNION ve UNION ALL, SQL'in küme işlemlerindendir. JOIN tabloları yan yana getirip sütun eklerken, UNION ailesi sorgu sonuçlarını alt alta ekler ve satır sayısını büyütür. Tipik kullanım, aynı yapıdaki verinin farklı kaynaklarda durduğu durumlardır: farklı yıllara ait arşiv tabloları, farklı şubelerin satış tabloları, aktif ve pasif müşteri tabloları ya da farklı kanallardan gelen başvurular.

Her ikisi de aynı kurala uyar: birleştirilen sorgular “birleşim uyumlu” olmalıdır. PostgreSQL belgesindeki tanıma göre bu, sorguların aynı sayıda sütun döndürmesi ve karşılık gelen sütunların uyumlu veri tiplerine sahip olması demektir. Sütunlar adlarına göre değil sıralarına göre eşleştirilir ve sonucun sütun adları ilk sorgudan gelir.

UNION yinelenen satırları ayıklar

UNION, sonraki sorgunun sonucunu öncekinin sonucuna ekler ve ardından tıpkı DISTINCT gibi yinelenen satırları kaldırır. Bir satırın yinelenen sayılması için tüm sütun değerlerinin aynı olması gerekir; yalnızca bir sütunun farklı olması satırı benzersiz kılar.

Yinelenenleri bulmak için veritabanı sonucu sıralamak ya da karma (hash) yapısı kurmak zorundadır. Bu ek iş, büyük veri kümelerinde bellek ve zaman maliyeti doğurur. Ayrıca belgede belirtildiği gibi satırların hangi sırayla döneceği belirli değildir; belirli bir sıra istiyorsanız sonuna ORDER BY eklemeniz gerekir.

UNION şu sorularda doğru araçtır: • Farklı tablolarda görünen benzersiz e-posta adreslerinin listesi. • Birden fazla kaynaktan gelen ve yalnızca bir kez listelenmesi gereken ürün kodları. • Aynı kişinin farklı listelerde yer aldığı bir davet listesinin tekilleştirilmesi.

UNION ALL her satırı olduğu gibi korur

UNION ALL, sorgu sonuçlarını ekler ve hiçbir satırı kaldırmaz. Aynı satır birden fazla kaynakta varsa sonuçta da o kadar kez görünür. Tekilleştirme adımı olmadığı için veritabanı ek sıralama ya da karşılaştırma yapmaz; sonuç doğrudan akıtılabilir.

Bu davranış, satırların her birinin ayrı bir olayı temsil ettiği durumlarda doğruluk için gereklidir. Örneğin farklı şubelerin satış hareketlerini birleştirip toplam ciro hesaplıyorsanız, aynı tutarda ve aynı tarihteki ayrı satışlar birbirinin kopyası değildir. UNION kullanırsanız bunlardan biri sessizce silinir ve toplam eksik çıkar.

UNION ALL'ın doğal kullanım alanları: • Bölümlenmiş ya da arşivlenmiş tabloları tek bir görünümde birleştirmek. • Hareket, log, ödeme gibi olay verisini toplamadan önce bir araya getirmek. • Kaynakların birbirini dışladığının bilindiği durumlarda gereksiz tekilleştirme maliyetinden kaçınmak.

Tekilleştirme, maliyet ve toplamlar: farklar

Ölçüt, yinelenen satırlar: UNION tüm sütunları aynı olan satırları tek satıra indirir / UNION ALL tüm satırları korur.

Ölçüt, sonuç satır sayısı: UNION, sorguların toplam satır sayısından az ya da ona eşit sonuç verir / UNION ALL her zaman sorguların satır sayılarının toplamı kadar sonuç verir.

Ölçüt, maliyet: UNION tekilleştirme için ek sıralama ya da karma işlemi yapar / UNION ALL ek işlem yapmaz ve genellikle daha hızlıdır.

Ölçüt, toplama işlemlerine etkisi: UNION üzerine yapılan SUM ve COUNT, kaldırılan satırlar nedeniyle eksik sonuç verebilir / UNION ALL üzerine yapılan toplamalar her satırı hesaba katar.

Ölçüt, NULL değerler: Tekilleştirmede NULL değerleri aynı sayılır, yani yalnızca NULL farkı olmayan satırlar birleştirilir / UNION ALL'da bu soru hiç doğmaz.

Ölçüt, niyet: UNION “benzersiz liste” sorusunu, UNION ALL “tüm kayıtlar” sorusunu cevaplar.

UNION ALL ile başlayıp ne zaman UNION'a geçmeli?

Varsayılan seçim olarak UNION ALL ile başlayıp tekilleştirmeye gerçekten ihtiyaç olduğunda UNION'a geçmek, hem doğruluk hem performans açısından güvenli bir alışkanlıktır. Karar için şu soruları sorun: • Satırlar olay mı, varlık mı? Olaylar (satış, ödeme, giriş kaydı) tekilleştirilmemelidir; UNION ALL kullanın. • Kaynaklar birbirini dışlıyor mu? Aynı satırın farklı kaynaklarda bulunması mümkün değilse UNION'ın tekilleştirmesi gereksiz maliyettir. • Benzersiz liste mi gerekiyor? Kampanya listesi ya da kod listesi gibi tekil sonuç gerekiyorsa UNION ya da UNION ALL sonrası açık bir DISTINCT kullanın. • Hangi sütun yinelenmeyi belirliyor? Tekilleştirme yalnızca bir anahtar sütuna göre yapılacaksa UNION yetmez; çünkü diğer sütunlar farklıysa satırlar ayrı kalır. Bu durumda GROUP BY ya da pencere fonksiyonuyla kural tanımlamak gerekir.

Örneğin bir perakende ekibi mağaza ve çevrim içi satış tablolarını aylık raporda birleştiriyor. Ciro için UNION ALL ile tüm hareketleri alıp toplar; aynı ay içinde alışveriş yapan tekil müşteri sayısı için ise birleşik sonuç üzerinde müşteri kimliğine göre COUNT DISTINCT kullanır. Aynı birleşik veri, sorunun türüne göre farklı biçimde özetlenir ve UNION'a gerek kalmaz.

Kaynak etiketlemek de iyi bir pratiktir: her sorguya verinin nereden geldiğini gösteren sabit bir sütun eklemek hata ayıklamayı kolaylaştırır. Ancak bu sütun satırları farklılaştırdığı için UNION'ın tekilleştirme etkisini de ortadan kaldırır.

Sık hatalar ve sözdizimi ayrıntıları

UNION sorgularında sık rastlanan hatalar: • Sütun sırasını karıştırmak: Sütunlar ada göre değil sıraya göre eşleştiği için yer değiştirmiş sütunlar hata vermeden yanlış veri üretebilir. Her sorguda sütunları açıkça ve aynı sırayla yazın. • Tip uyumsuzluğu: Metin ve sayı sütunlarını aynı sırada birleştirmek hata verir ya da örtük dönüşüme yol açar; gerekiyorsa açık dönüşüm (CAST) kullanın. • LIMIT ve ORDER BY konumu: PostgreSQL belgesine göre parantezsiz yazılan bir LIMIT tek bir sorguya değil, birleşik sonucun tamamına uygulanır. Tek bir sorguyu sınırlamak istiyorsanız o sorguyu parantez içine alın. • Performans için UNION'ı DISTINCT yerine kullanmak: Tekilleştirme maliyeti bu yolların hepsinde vardır; asıl kazanç gereksiz tekilleştirmeyi kaldırmaktır. • JOIN ile karıştırmak: Sütun eklemek istiyorsanız JOIN, satır eklemek istiyorsanız UNION ailesi gerekir.

Küme işlemlerini Mindset programlarında pekiştirmek

SQL ile Programlama Eğitimi'nin sorgular, hesaplamalar, toplama ve gruplama ile görüntüleme (views) modülleri, birleşik sonuçları görünüm olarak tanımlayıp üzerine özet almayı çalışmak için uygun bir zemin sunar. SQL ile Veri Sorgulama (Temel) programındaki “Toplulaştırma Fonksiyonları ve Gruplama” ve “Pratik İş Raporları ile Sorgu Geliştirme” modülleri, tekilleştirmenin toplamları nasıl etkilediğini rapor örnekleri üzerinden görmeye yardım eder.

İleri düzeyde SQL ile Veri Sorgulama (İleri) programı ortak tablo ifadeleri, alt sorgular, yürütme planı analizi ve pencere fonksiyonları modülleriyle, büyük birleşik sorguların performansını değerlendirmeyi kapsar.

İlgili Mindset programı

SQL ile Programlama Eğitimi

Sık sorulanlar

Sık sorulan sorular

UNION ALL her zaman UNION'dan hızlı mıdır?

Genellikle evet, çünkü tekilleştirme için gereken sıralama ya da karma adımı yoktur. Fark küçük sonuç kümelerinde hissedilmeyebilir, büyük kümelerde belirgin olur. Yine de hız tek ölçüt değildir: sonuçta yinelenen satır istenmiyorsa UNION ALL hızlı ama yanlış bir sonuç üretir.

UNION ile birleştirilen sorgularda ORDER BY nereye yazılır?

ORDER BY birleşik sonucun tamamını sıralamak için en sona, son sorgudan sonra yazılır. Tek tek sorguları sıralamak genellikle anlamsızdır, çünkü birleşik sonucun sırası belirli değildir. Bir sorguyu sıralayıp sınırlamak istiyorsanız o sorguyu parantez içine alıp ORDER BY ve LIMIT ifadelerini parantezin içine yazın.

INTERSECT ve EXCEPT bu ailenin parçası mı?

Evet. INTERSECT sorguların hepsinde bulunan satırları, EXCEPT ise ilk sorguda olup sonraki sorguda olmayan satırları döndürür. UNION'da olduğu gibi bunlar da varsayılan olarak yinelenenleri ayıklar; yinelenenleri korumak için INTERSECT ALL ve EXCEPT ALL yazılır. Her veritabanı ALL biçimlerini desteklemeyebilir, kullandığınız sistemin belgesine bakın.

Sütun adları farklı olan tablolar birleştirilebilir mi?

Evet. UNION sütunları adlarına göre değil sıralarına göre eşleştirir; yalnızca sütun sayısı ve tipleri uyumlu olmalıdır. Sonuç sütunlarının adı ilk sorgudan alınır. Okunabilirlik için ilk sorguda takma ad (alias) vererek anlamlı sütun adları belirlemek iyi bir alışkanlıktır.

UNION ile UNION ALL Farkı: Yinelenen Satırlar