SQL’de UNION Kullanımı: Veri Birleştirmenin Gücü
Giriş: UNION Operatörünün Tanımı ve Önemi
Günümüz veri odaklı dünyasında, veritabanları iş süreçlerinin kalbinde yer alır. Çeşitli kaynaklardan gelen veya farklı tablolara dağılmış verileri anlamlı raporlar ve analizler için bir araya getirmek, veritabanı yönetiminin temel taşlarından biridir. SQL, bu ihtiyacı karşılamak üzere birçok güçlü araç sunar ve UNION operatörü de bu araçlardan biridir. UNION, iki veya daha fazla SELECT sorgusunun sonuç kümelerini dikey olarak birleştirerek tek bir sonuç kümesi oluşturmanızı sağlar. Bu sayede, benzer yapıdaki ancak farklı konumlarda depolanan verileri tek bir görünüm altında toplayabilir, daha kapsamlı raporlar oluşturabilir ve veri analizi süreçlerinizi kolaylaştırabilirsiniz.
UNION operatörü, özellikle aynı türde bilgi içeren ancak farklı zaman dilimlerine veya farklı operasyonel birimlere ait tablolardaki verileri birleştirmek istediğinizde paha biçilmez bir araçtır. Örneğin, bir şirketin 2022 yılı satış verilerini içeren bir tablo ile 2023 yılı satış verilerini içeren başka bir tabloyu tek bir liste halinde görmek istediğinizde UNION devreye girer. Benzer şekilde, farklı müşteri segmentlerini (bireysel müşteriler, kurumsal müşteriler) ayrı tablolarda tutuyor olsanız bile, tüm müşteri iletişim bilgilerini tek bir listede toplamak için UNION kullanabilirsiniz.
Bu makalede, UNION operatörünün temel söz diziminden başlayarak, UNION ALL ile arasındaki farklara, kullanım kurallarına, performans mülahazalarına ve çeşitli pratik senaryolara kadar derinlemesine bir inceleme yapacağız. Amacımız, SQL geliştiricilerinin ve veritabanı yöneticilerinin UNION operatörünü etkin ve doğru bir şekilde kullanarak veri birleştirme işlemlerini optimize etmelerine yardımcı olmaktır.
UNION Operatörünün Temel Söz Dizimi ve Çalışma Prensibi
UNION operatörü, iki veya daha fazla SELECT ifadesinin sonuçlarını tek bir sonuç kümesinde birleştirmek için kullanılır. En temel haliyle, UNION operatörünün söz dizimi aşağıdaki gibidir:
SELECT sütun1, sütun2, ...
FROM tablo1
WHERE koşul1
UNION
SELECT sütun1, sütun2, ...
FROM tablo2
WHERE koşul2;
Burada dikkat edilmesi gereken en önemli nokta, UNION operatörünün varsayılan olarak sonuç kümesindeki yinelenen satırları kaldırmasıdır. Yani, eğer her iki SELECT sorgusunun sonuçlarında tamamen aynı satırlar varsa, UNION bu satırlardan yalnızca birini döndürür. Bu davranış, DISTINCT anahtar kelimesiyle benzerdir ve veri tekilleştirme ihtiyacı olan durumlarda oldukça kullanışlıdır.
UNION Operatörünün Çalışma Kuralları
UNION operatörünü başarılı bir şekilde kullanabilmek için belirli kurallara uymak zorunludur:
1. Sütun Sayısı ve Sırası: Birleştirilen tüm SELECT ifadeleri aynı sayıda sütun içermelidir. Ayrıca, karşılık gelen sütunların sırası da önemlidir, çünkü UNION bu sıraya göre sütunları eşleştirir.
2. Veri Tipleri: Karşılık gelen sütunların veri tipleri uyumlu olmalıdır. Tamamen aynı veri tipi olmak zorunda değildir, ancak veritabanı sistemi tarafından örtük olarak birbirine dönüştürülebilecek (örneğin, INT ile DECIMAL veya VARCHAR ile NVARCHAR) tipler olmalıdır. Aksi takdirde bir hata oluşur.
3. Sütun İsimleri: Sonuç kümesindeki sütun isimleri, UNION ifadesindeki ilk SELECT ifadesinden alınır. Eğer farklı SELECT ifadelerinde aynı mantıksal sütun için farklı isimler kullanılıyorsa, sonuç kümesi ilk sorgudaki ismi kullanacaktır.
4. ORDER BY ve LIMIT/FETCH: ORDER BY veya LIMIT/FETCH (ya da TOP) gibi yan tümceler, UNION ifadesinin tamamına uygulanır. Yani, birleştirilmiş tüm sonuç kümesi üzerinde sıralama veya sınırlama yapılır. Tek tek SELECT ifadelerine ORDER BY uygulamak genellikle anlamsızdır ve bazı veritabanlarında desteklenmez veya parantez içinde alt sorgu olarak kullanılması gerekir.
Örnek:
Diyelim ki bir şirketin Calisanlar2022 ve Calisanlar2023 adında iki ayrı tablosu var. Her iki tablo da CalisanID, Ad, Soyad ve Departman sütunlarını içeriyor. Tüm çalışanları tek bir listede görmek istiyoruz:
SELECT CalisanID, Ad, Soyad, Departman
FROM Calisanlar2022
UNION
SELECT CalisanID, Ad, Soyad, Departman
FROM Calisanlar2023;
Bu sorgu, her iki tablodaki tüm benzersiz çalışanları listeleyecektir. Eğer bir çalışan hem 2022 hem de 2023 tablolarında aynı CalisanID, Ad, Soyad ve Departman ile yer alıyorsa, sonuç kümesinde yalnızca bir kez görünecektir.
UNION ALL: Yinelenen Satırları Dahil Etme
UNION operatörünün varsayılan davranışı, yinelenen satırları sonuç kümesinden çıkarmaktır. Ancak bazı durumlarda, tüm satırları, yinelenenler dahil olmak üzere, birleştirmek isteyebiliriz. İşte bu noktada UNION ALL operatörü devreye girer.
UNION ALL, UNION ile aynı söz dizimine sahiptir, ancak yinelenen satırları kaldırma işlemini yapmaz. Bu, iki önemli sonuca yol açar:
1. Yinelenen Satırlar: UNION ALL, birleştirilen SELECT ifadelerinin sonuçlarında aynı olan tüm satırları sonuç kümesine dahil eder.
2. Performans: Yinelenen satırları kaldırma işlemi (DISTINCT işlemi), veritabanı motoru için ek bir maliyet anlamına gelir. Bu işlem, genellikle sonuç kümesini sıralamayı ve ardından yinelenenleri elemek için taramayı gerektirir. Dolayısıyla, UNION ALL, UNION‘dan genellikle daha hızlı çalışır, çünkü bu ek işlemi yapmaz. Eğer yinelenen satırların varlığı sizin için bir sorun teşkil etmiyorsa veya zaten verilerinizin benzersiz olduğundan eminseniz, performans avantajı nedeniyle UNION ALL kullanmak daha iyi bir seçimdir.
Söz Dizimi:
SELECT sütun1, sütun2, ...
FROM tablo1
WHERE koşul1
UNION ALL
SELECT sütun1, sütun2, ...
FROM tablo2
WHERE koşul2;
Örnek:
Önceki Calisanlar2022 ve Calisanlar2023 örneğini ele alalım. Eğer bir çalışan hem 2022 hem de 2023 tablolarında yer alıyorsa ve biz bu çalışanın her iki kaydını da görmek istiyorsak (örneğin, farklı departmanlarda veya farklı rollerde yer almış olabileceği için), UNION ALL kullanırız:
SELECT CalisanID, Ad, Soyad, Departman
FROM Calisanlar2022
UNION ALL
SELECT CalisanID, Ad, Soyad, Departman
FROM Calisanlar2023;
Bu sorgu, 2022 ve 2023 yıllarındaki tüm çalışan kayıtlarını, yinelenenler dahil olmak üzere, listeleyecektir. Eğer aynı çalışan her iki tabloda da varsa, sonuç kümesinde iki kez görünecektir.
UNION Kullanımında Dikkat Edilmesi Gerekenler ve Kurallar
UNION operatörünü etkin bir şekilde kullanmak için yukarıda bahsedilen temel kuralların ötesinde bazı detaylara dikkat etmek gerekir.
Sütun Sayısı ve Sırası Uyumu
Bu kural UNION‘ın en katı kuralıdır. Birleştirilen her SELECT ifadesi, aynı sayıda sütun döndürmelidir. Aksi takdirde, veritabanı bir hata döndürecektir. Sütunların sırası da aynı derecede önemlidir; ilk sorgudaki ilk sütun, ikinci sorgudaki ilk sütunla eşleşir ve bu böyle devam eder.
Yanlış Kullanım Örneği:
SELECT CalisanID, Ad, Soyad
FROM Calisanlar
UNION
SELECT MusteriID, Ad, Soyad, Adres -- Hata! 4 sütun var
FROM Musteriler;
Veri Tipleri Uyumu
Karşılık gelen sütunların veri tipleri birbiriyle uyumlu olmalıdır. Veritabanı motoru, mümkünse örtük tip dönüşümleri yapmaya çalışır. Örneğin, bir INT sütununu bir DECIMAL sütunuyla veya bir VARCHAR sütununu bir NVARCHAR sütunuyla birleştirmek genellikle sorunsuz çalışır. Ancak, DATE sütununu INT sütunuyla birleştirmek gibi uyumsuz durumlar hataya yol açacaktır.
Örnek:
Eğer bir tabloda Fiyat sütunu DECIMAL olarak tanımlanmışken, diğer tabloda Fiyat sütunu INT olarak tanımlanmışsa, UNION işlemi sırasında INT değeri DECIMAL‘e dönüştürülebilir. Ancak, DATE tipindeki bir sütunu VARCHAR tipindeki bir sütunla birleştirirken, veritabanı motoru DATE değerini VARCHAR‘a dönüştürecektir. Bu durum, sonuç kümesindeki veri tipini ilk sorgudaki sütunun tipine göre belirler.
SELECT UrunAdi, Fiyat DECIMAL(10,2) -- Fiyat ondalıklı
FROM Urunler2022
UNION ALL
SELECT UrunAdi, Fiyat INT -- Fiyat tam sayı
FROM Urunler2023;
Bu durumda, sonuç kümesindeki Fiyat sütunu DECIMAL(10,2) tipinde olacaktır ve 2023 yılındaki INT fiyatlar DECIMAL‘e dönüştürülecektir.
Sütun İsimleri ve Takma Adlar (Aliases)
Sonuç kümesindeki sütun isimleri, UNION ifadesindeki ilk SELECT ifadesinden alınır. Eğer ilk SELECT ifadesinde sütunlara takma ad (alias) verilmişse, bu takma adlar sonuç kümesi için kullanılır.
Örnek:
SELECT CalisanID AS ID, Ad AS Isim, Soyad AS Soyisim
FROM Calisanlar
UNION ALL
SELECT MusteriID, Ad, Soyad
FROM Musteriler;
Bu sorgunun sonuç kümesindeki sütun isimleri ID, Isim ve Soyisim olacaktır, çünkü ilk SELECT ifadesi bu takma adları kullanmıştır.
ORDER BY ve LIMIT/FETCH Kullanımı
ORDER BY yan tümcesi, UNION ifadesinin en sonunda yer almalıdır ve birleştirilmiş tüm sonuç kümesini sıralar. Tek tek SELECT ifadelerine ORDER BY uygulamak, genellikle bir alt sorgu içinde olmadıkça anlamsızdır veya veritabanı tarafından desteklenmez.
Doğru Kullanım:
SELECT CalisanID, Ad, Soyad FROM Calisanlar2022
UNION ALL
SELECT CalisanID, Ad, Soyad FROM Calisanlar2023
ORDER BY Soyad, Ad; -- Tüm birleştirilmiş sonuç kümesini sıralar
Eğer her bir sorgunun kendi içinde sıralanmış olmasını istiyorsanız, bu sorguları parantez içine alıp alt sorgu olarak kullanmanız gerekir. Ancak bu, UNION‘ın nihai sonucunu değil, her bir alt sorgunun ara sonucunu sıralar.
LIMIT (veya TOP, FETCH FIRST) yan tümcesi de benzer şekilde, tüm UNION ifadesinin en sonunda yer almalıdır ve birleştirilmiş sonuç kümesinden belirli sayıda satır döndürür.
SELECT CalisanID, Ad, Soyad FROM Calisanlar2022
UNION ALL
SELECT CalisanID, Ad, Soyad FROM Calisanlar2023
ORDER BY Soyad, Ad
LIMIT 10; -- İlk 10 satırı döndürür
Pratik Kullanım Senaryoları ve Örnekler
UNION operatörünün gücü, çeşitli gerçek dünya senaryolarında kendini gösterir. İşte bazı yaygın kullanım alanları:
Farklı Tablolardan Benzer Yapıdaki Verileri Birleştirme
Bu, UNION‘ın en yaygın kullanım şeklidir. Örneğin, aynı türden veriyi farklı zaman dilimlerine göre ayırarak depoladığınızda (örn. Satislar2020, Satislar2021, Satislar2022) veya farklı bölgelerdeki verileri ayrı tablolarda tuttuğunuzda.
Örnek: Yıllık Satış Verilerini Birleştirme
SELECT SatisID, MusteriID, UrunID, SatisTarihi, Tutar
FROM Satislar2020
UNION ALL
SELECT SatisID, MusteriID, UrunID, SatisTarihi, Tutar
FROM Satislar2021
UNION ALL
SELECT SatisID, MusteriID, UrunID, SatisTarihi, Tutar
FROM Satislar2022
ORDER BY SatisTarihi DESC;
Bu sorgu, üç farklı yıldaki tüm satış işlemlerini tek bir kronolojik listede birleştirir. UNION ALL kullanmak, her satış işleminin (yinelenen olsa bile) listelenmesini sağlar ve DISTINCT işlemi maliyetinden kaçınır.
Farklı Kategorilerdeki Verileri Tek Bir Liste Haline Getirme
Bazen farklı varlık tiplerini (örneğin, çalışanlar, müşteriler, tedarikçiler) tek bir genel “kişi” listesi olarak görmek isteyebilirsiniz. Bu durumda, her bir varlık tipinin ortak özelliklerini (ad, soyad, e-posta) birleştirebilirsiniz.
Örnek: İletişim Listesi Oluşturma
SELECT Ad, Soyad, Eposta, 'Çalışan' AS Rol
FROM Calisanlar
WHERE Durum = 'Aktif'
UNION ALL
SELECT Ad, Soyad, Eposta, 'Müşteri' AS Rol
FROM Musteriler
WHERE AktifMi = TRUE
UNION ALL
SELECT Ad, Soyad, Eposta, 'Tedarikçi' AS Rol
FROM Tedarikciler
WHERE Onayli = TRUE
ORDER BY Rol, Soyad, Ad;
Burada, her SELECT ifadesine ek bir Rol sütunu ekleyerek, birleştirilmiş listedeki her kişinin hangi kategoriye ait olduğunu belirtiyoruz. Bu, raporlama ve analiz için oldukça faydalı bir tekniktir.
Veri Temizliği ve Tekilleştirme
UNION‘ın varsayılan DISTINCT davranışı, veri temizliği ve tekilleştirme işlemlerinde kullanılabilir. Örneğin, farklı kaynaklardan gelen ve potansiyel olarak yinelenen kayıtları içeren tablolarınız varsa, bu kayıtları birleştirip benzersiz olanları elde edebilirsiniz.
Örnek: Yinelenen E-posta Adreslerini Bulma (veya Tekilleştirme)
Diyelim ki PotansiyelMusteriler ve MevcutMusteriler adında iki tablonuz var ve her ikisinde de e-posta adresleri bulunuyor. Ortak e-posta adreslerini bulmak veya tüm benzersiz e-posta adreslerini listelemek isteyebilirsiniz.
SELECT Eposta
FROM PotansiyelMusteriler
UNION
SELECT Eposta
FROM MevcutMusteriler;
Bu sorgu, her iki tablodaki tüm benzersiz e-posta adreslerini listeleyecektir. Eğer bir e-posta adresi her iki tabloda da varsa, sadece bir kez görünecektir. Eğer tüm e-posta adreslerini (yinelenenler dahil) görmek isteseydik UNION ALL kullanırdık.
Dinamik Raporlama ve Koşullu Veri Birleştirme
Bazı durumlarda, raporlama ihtiyaçlarına göre farklı veri kümelerini birleştirmeniz gerekebilir. UNION ile birlikte WHERE koşullarını kullanarak daha esnek raporlar oluşturabilirsiniz.
Örnek: Farklı Durumlardaki Siparişleri Tek Listede Gösterme
SELECT SiparisID, MusteriID, ToplamTutar, 'Tamamlandı' AS Durum
FROM Siparisler
WHERE SiparisDurumu = 'Tamamlandı'
UNION ALL
SELECT SiparisID, MusteriID, ToplamTutar, 'Beklemede' AS Durum
FROM Siparisler
WHERE SiparisDurumu = 'Beklemede'
UNION ALL
SELECT SiparisID, MusteriID, ToplamTutar, 'İptal Edildi' AS Durum
FROM Siparisler
WHERE SiparisDurumu = 'İptal Edildi';
Bu sorgu, aynı tablodan farklı filtreleme koşullarıyla üç ayrı veri kümesi çekip, her birine durum etiketi ekleyerek tek bir rapor haline getirir.
UNION ve JOIN Arasındaki Farklar
SQL’de veri birleştirme denince akla gelen diğer bir önemli operatör de JOIN‘dır. UNION ve JOIN her ikisi de veri birleştirme amacıyla kullanılır, ancak bunu farklı şekillerde yaparlar ve farklı senaryolar için uygundurlar. Aralarındaki temel farkları anlamak, doğru aracı doğru zamanda kullanmak için kritik öneme sahiptir.
* UNION (Dikey Birleştirme):
* İki veya daha fazla SELECT sorgusunun sonuç kümelerini dikey olarak birleştirir. Yani, bir sorgunun satırları diğer sorgunun satırlarının altına eklenir.
* Birleştirilen sorguların aynı sayıda ve uyumlu veri tiplerine sahip sütunları olmalıdır.
* Genellikle benzer yapıdaki, ancak farklı tablolarda (veya aynı tablonun farklı bölümlerinde) bulunan verileri tek bir liste halinde toplamak için kullanılır.
* UNION varsayılan olarak yinelenen satırları kaldırır (DISTINCT), UNION ALL ise tüm satırları dahil eder.
* JOIN (Yatay Birleştirme):
* İki veya daha fazla tablodaki satırları, aralarındaki ilişkili sütunlara (anahtar sütunlar) dayanarak yatay olarak birleştirir. Yani, bir tablonun sütunları diğer tablonun sütunlarına eklenir.
* Birleştirilen tabloların ortak bir anahtar sütunu (örneğin, MusteriID) olması gerekir.
* Genellikle ilişkisel veritabanı tasarımında, farklı varlıklar hakkındaki bilgileri (örneğin, Müşteriler tablosu ile Siparişler tablosu) birleştirmek için kullanılır.
* INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN gibi farklı JOIN tipleri bulunur ve bunlar eşleşen veya eşleşmeyen satırların nasıl dahil edileceğini belirler.
Özetle:
* UNION satırları birleştirir, JOIN ise sütunları birleştirir.
* UNION, benzer yapıdaki verileri farklı kaynaklardan bir araya getirirken, JOIN ilişkili verileri farklı tablolardan bir araya getirir.
Örnek:
Müşteriler tablosu (MusteriID, Ad, Soyad) ve Siparişler tablosu (SiparisID, MusteriID, Tutar) olsun.
* JOIN Kullanımı (Müşterilerin Siparişlerini Görmek İçin):
SELECT M.Ad, M.Soyad, S.SiparisID, S.Tutar
FROM Musteriler M
INNER JOIN Siparisler S ON M.MusteriID = S.MusteriID;
Bu, her bir müşterinin siparişlerini (Müşteri bilgileri + Sipariş bilgileri) yatay olarak birleştirir.
* UNION Kullanımı (Farklı Müşteri Gruplarını Birleştirmek İçin):
Diyelim ki BireyselMusteriler ve KurumsalMusteriler tabloları var.
SELECT MusteriID, Ad, Soyad FROM BireyselMusteriler
UNION ALL
SELECT MusteriID, Ad, Soyad FROM KurumsalMusteriler;
Bu, tüm müşteri kayıtlarını dikey olarak birleştirir.
Performans Mülahazaları
UNION operatörünün performansı, kullanılan veri kümelerinin boyutu, veritabanı sistemi ve UNION ALL yerine UNION kullanılıp kullanılmadığı gibi faktörlere bağlıdır.
1. UNION vs. UNION ALL: Daha önce de belirtildiği gibi, UNION varsayılan olarak DISTINCT işlemi yapar. Bu, sonuç kümesini sıralamayı ve yinelenenleri kaldırmayı gerektirir, bu da özellikle büyük veri kümeleri için önemli bir performans maliyeti oluşturur. Eğer yinelenen satırları kaldırmanıza gerek yoksa veya verilerinizin zaten benzersiz olduğundan eminseniz, her zaman UNION ALL kullanmayı tercih edin. Bu, gereksiz bir işlemi atlayarak sorgu performansını önemli ölçüde artırabilir.
2. İndekslerin Rolü: Birleştirilen SELECT ifadelerindeki WHERE koşullarında kullanılan sütunlar üzerinde indekslerin bulunması, sorguların daha hızlı çalışmasına yardımcı olur. İndeksler, veritabanının belirli satırları daha hızlı bulmasını sağlar. Ancak, UNION‘ın kendisi üzerinde (yani birleştirme işlemi sırasında) indekslerin doğrudan bir etkisi yoktur; etkisi, her bir alt sorgunun veriyi ne kadar hızlı getirdiğine bağlıdır.
3. Büyük Veri Kümeleri: Çok büyük veri kümelerini UNION ile birleştirmek, özellikle UNION kullanılıyorsa, önemli miktarda geçici depolama alanı ve işlem gücü gerektirebilir. Veritabanı, yinelenenleri kaldırmak için sonuç kümesini bellekte veya geçici disk alanında saklamak zorunda kalabilir. Bu tür durumlarda, sorgunun parçalarını optimize etmek, gereksiz sütunları seçmekten kaçınmak ve WHERE koşullarını mümkün olduğunca daraltmak önemlidir.
4. Sorgu Optimizasyonu: Veritabanı optimizasyon araçları (örneğin, EXPLAIN veya ANALYZE komutları), UNION sorgularının nasıl çalıştığını ve performans darboğazlarının nerede olduğunu anlamanıza yardımcı olabilir. Bu araçları kullanarak, sorgunuzun yürütme planını inceleyebilir ve iyileştirmeler yapabilirsiniz.
Gelişmiş UNION Kullanımları
UNION operatörü, daha karmaşık SQL yapılarıyla birleştirildiğinde daha da güçlü hale gelebilir.
CTE (Common Table Expressions) ile Birlikte Kullanım
CTE’ler (WITH ifadesi), karmaşık sorguları daha okunabilir ve yönetilebilir parçalara ayırmak için kullanılır. UNION ile birlikte CTE’ler, birden fazla kaynaktan gelen verileri birleştirip, bu birleştirilmiş sonuç üzerinde daha fazla işlem yapmak için idealdir.
Örnek:
WITH TumCalisanlar AS (
SELECT CalisanID, Ad, Soyad, 'Aktif' AS Durum
FROM Calisanlar
WHERE AktifMi = TRUE
UNION ALL
SELECT CalisanID, Ad, Soyad, 'Pasif' AS Durum
FROM Calisanlar
WHERE AktifMi = FALSE
),
TumKullanicilar AS (
SELECT KullaniciID AS ID, KullaniciAdi AS Ad, Soyadi AS Soyad, 'Kullanıcı' AS Tip
FROM SistemKullanicilari
)
SELECT ID, Ad, Soyad, Durum AS Tip
FROM TumCalisanlar
UNION ALL
SELECT ID, Ad, Soyad, Tip
FROM TumKullanicilar
ORDER BY Soyad, Ad;
Bu örnekte, önce Calisanlar tablosundan aktif ve pasif çalışanları bir CTE içinde birleştiriyoruz. Ardından SistemKullanicilari tablosundan kullanıcıları başka bir CTE’ye alıyoruz. Son olarak, bu iki CTE’yi UNION ALL ile birleştirerek tüm çalışan ve sistem kullanıcılarını tek bir listede topluyoruz. Bu yaklaşım, sorgunun mantığını daha net hale getirir.
Alt Sorgular (Subqueries) ile Birlikte Kullanım
UNION operatörü, alt sorguların sonuçlarını birleştirmek için de kullanılabilir. Bu, her bir SELECT ifadesinin kendi içinde karmaşık filtreleme veya gruplama işlemleri yaptığı durumlarda faydalıdır.
Örnek:
SELECT MusteriID, ToplamSiparisTutari
FROM (
SELECT MusteriID, SUM(Tutar) AS ToplamSiparisTutari
FROM Siparisler
WHERE SatisTarihi BETWEEN '2022-01-01' AND '2022-12-31'
GROUP BY MusteriID
) AS Yil2022Satislar
UNION ALL
SELECT MusteriID, ToplamSiparisTutari
FROM (
SELECT MusteriID, SUM(Tutar) AS ToplamSiparisTutari
FROM Siparisler
WHERE SatisTarihi BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY MusteriID
) AS Yil2023Satislar
ORDER BY MusteriID;
Bu sorgu, 2022 ve 2023 yıllarındaki müşteri bazında toplam satış tutarlarını ayrı ayrı hesaplayan iki alt sorgunun sonuçlarını birleştirir. Her alt sorgu kendi içinde gruplama ve filtreleme yapar, ardından UNION ALL bu iki sonuç kümesini birleştirir.
Farklı Veritabanı Sistemlerinde UNION
UNION operatörü, ANSI SQL standardının bir parçasıdır ve bu nedenle çoğu ilişkisel veritabanı yönetim sisteminde (RDBMS) (PostgreSQL, MySQL, SQL Server, Oracle vb.) benzer şekilde çalışır. Ancak, bazı küçük sentaks farklılıkları veya özellikler olabilir:
* LIMIT yerine TOP (SQL Server) veya FETCH FIRST (Oracle) kullanılması.
* Veri tipi dönüşümlerinin nasıl ele alındığına dair ince farklılıklar.
Genel olarak, UNION‘ın temel kuralları ve söz dizimi evrenseldir.
Sonuç ve Özet
SQL’deki UNION operatörü, farklı kaynaklardan gelen veya mantıksal olarak ayrılmış benzer yapıdaki verileri tek bir sonuç kümesinde birleştirmek için vazgeçilmez bir araçtır. UNION‘ın varsayılan DISTINCT davranışı, veri tekilleştirme için kullanışlıyken, UNION ALL yinelenenleri dahil ederek daha iyi performans sunar.
Bu makalede, UNION‘ın temel söz dizimi, sütun sayısı ve veri tipleri gibi kritik kullanım kuralları, ORDER BY ve LIMIT gibi yan tümcelerle etkileşimi ayrıntılı olarak incelenmiştir. Ayrıca, yıllık satış verilerini birleştirme, iletişim listeleri oluşturma ve veri temizliği gibi pratik kullanım senaryolarıyla UNION‘ın gerçek dünya uygulamaları gösterilmiştir. UNION ile JOIN arasındaki temel farkları anlamak, doğru veri birleştirme stratejisini seçmek için hayati öneme sahiptir. Performans mülahazaları, özellikle büyük veri kümeleriyle çalışırken UNION ALL‘ın avantajlarını vurgulamıştır. Son olarak, CTE’ler ve alt sorgularla UNION‘ın gelişmiş kullanımları, karmaşık veri birleştirme görevlerini daha yönetilebilir ve okunabilir hale getirmenin yollarını göstermiştir.
UNION operatörünü doğru ve etkin bir şekilde kullanmak, SQL geliştiricilerinin ve veritabanı profesyonellerinin daha güçlü, esnek ve kapsamlı raporlar ve analizler oluşturmasına olanak tanır. Veritabanı yeteneklerinizin kilidini açmak için bu güçlü aracı ustaca kullanmayı öğrenmek, veri yönetimi becerilerinizi bir üst seviyeye taşıyacaktır.