Program
Küme işlemleri, SQL’in temelini oluşturur ve birden fazla kaynaktan gelen verileri birleştirmemize, karşılaştırmamıza ve filtrelememize olanak tanır. Bu işlemler, veri entegrasyonundan ve temizlemeden ileri analitik ve raporlamaya kadar pek çok görev için vazgeçilmezdir.
Bu eğitimde küme işleçlerinin ne olduğunu, SQL’de nasıl kullanıldığını, pratik kullanım alanlarını ve daha fazlasını öğreneceğiz! Kapsamlı bir SQL öğrenme kaynağı arıyorsanız, yedi dersten oluşan SQL Temelleri beceri yoluna göz atın.
Acele edenler için, SQL’de küme işlemlerinin ne olduğuna dair çok kısa bir yanıtla başlayalım.
SQL’de Küme İşlemleri Nedir?
SQL’de küme işlemleri, iki veya daha fazla SELECT ifadesinin sonuçlarını birleştirmek ya da karşılaştırmak için kullanılan tekniklerdir. Matematiksel küme işlemleri gibi çalışırlar; sorgularımızın döndürdüğü satırlar arasında birleşim, kesişim veya fark bulmamızı sağlarlar. Bu da onları, birden fazla kaynaktan ya da bakış açısından veri analiz ederken vazgeçilmez kılar.
İşte temel küme işlemlerinin hızlı bir özeti:
-
UNION: İki veya daha fazlaSELECTifadesinden gelen tüm benzersiz satırları birleştirir, yinelenenleri kaldırır. -
UNION ALL: İki veya daha fazlaSELECTifadesinden gelen tüm satırları, yinelenenler dahil, birleştirir. -
INTERSECT: Her ikiSELECTifadesinde de görünen satırları döndürür. -
EXCEPT: İlkSELECTifadesinde olup ikinci ifadede olmayan satırları döndürür.
İlişkisel cebir işlemleriyle karşılaştırma
İlişkisel cebir, veritabanı sorgularını anlamak için bir temel sağlayan teorik bir çerçevedir. Belirli veritabanı sistemlerinden bağımsız, matematiksel ilkelere dayanan yansıtma (projection), seçim (selection) ve birleştirme (join) gibi soyut işlemler sunar. Bunu, veritabanı etkileşimlerimizi güçlendiren "perde arkası" mantık olarak düşünebilirsiniz.
SQL’deki küme işleçleri, bu kavramların veritabanı ortamındaki pratik uygulamasını sunar. SQL sorgularının sonuç kümeleri üzerinde doğrudan birleşim, kesişim ve fark gibi küme işlemleri yapmamızı sağlarlar.
İlişkisel cebir veritabanı işlemleri için biçimsel bir temel sağlarken, SQL’deki küme işleçleri veri işleme görevleri için standartlaştırılmış, kullanıcı dostu bir arayüz sunar.
Küme işleçleri ile ilişkisel cebir işlemleri arasındaki ilişkiyi anlamak, SQL’in kuramsal dayanaklarına dair içgörüler sağlar. Bu bağlantıyı bilmek, perde arkasında neler olduğuna dair daha net bir zihinsel modelle sorgular yazmanıza yardımcı olur.
SQL’de Küme İşleçlerinin Türleri
SQL’de üç birincil küme işleci vardır:
-
UNION -
INTERSECT -
EXCEPT(bazı lehçelerdeMINUS)
Bu işleçler, matematikteki birleşim, kesişim ve küme farkı kavramlarına karşılık gelir.
Küme İşleçlerini Kullanma Kuralları
Küme işleçleriyle sorguları birleştirmeden önce dört gereksinimin karşılanması gerekir. Bunlardan herhangi biri yanlış olursa sorgunuz hata verir.
-
Aynı sayıda sütun: Her
SELECTaynı sayıda sütun döndürmelidir. Bir sorgu üç, diğeri iki sütun döndürürse veritabanı hata verir. -
Uyumlu veri türleri: Karşılık gelen sütunların türleri eşleşmelidir. Aynı konumda bir
VARCHARad sütununu birINTEGERkimlikle birleştiremezsiniz. -
Aynı sütun sırası: SQL eşleştirmeyi ada göre değil, konuma göre yapar. Birinci sorgunun ilk sütunu, adları ne olursa olsun ikinci sorgunun ilk sütununa eşlenir.
-
Yalnızca sonda
ORDER BY:ORDER BYbirleşik sorgunun en sonunda bir kez yer almalıdır. Bunu tek tekSELECTifadelerinin içinde kullanamazsınız.
Bir ayrıntı daha: Çıktıdaki sütun adları ilk SELECT ifadesinden gelir. Sonraki sorgulardaki takma adlar yok sayılır; özel çıktı adlarına ihtiyacınız varsa takma adları yalnızca ilk sorguya ekleyin.
SQL’de UNION İşleci Nasıl Kullanılır
UNION işleci, iki veya daha fazla SELECT sorgusunun sonuçlarını tek bir sonuç kümesinde birleştirir ve varsayılan olarak yinelenen satırları kaldırır.
Örneğin, her birinde contractors, department ve salary gibi benzer sütunlar bulunan iki tabloya, employees ve contractors’a sahip olduğumuzu varsayalım. Öğrenme amacıyla şu iki örnek tabloyu ele alalım:
employees:
|
name |
department |
salary |
|
Alice |
Marketing |
65000 |
|
Bob |
Sales |
70000 |
|
Carol |
Engineering |
80000 |
|
John |
HR |
55000 |
contractors:
|
name |
department |
salary |
|
David |
Marketing |
60000 |
|
Eva |
Sales |
68000 |
|
Carol |
Engineering |
75000 |
Her iki tablodan gelen sonuçları aşağıdaki komutla birleştirebiliriz:
-- Using UNION to combine all employees and contractors
SELECT name, department, salary FROM employees
UNION
SELECT name, department, salary FROM contractors;
Bu sorgu, employees ve contractors tablolarındaki name, department ve salary sütunlarını seçer ve tek bir sonuç kümesinde birleştirir. UNION işleci, son sonuç kümesindeki yinelenen satırları otomatik olarak kaldırır.
|
name |
department |
salary |
|
Alice |
Marketing |
65000 |
|
Bob |
Sales |
70000 |
|
Carol |
Engineering |
80000 |
|
John |
HR |
55000 |
|
David |
Marketing |
60000 |
|
Eva |
Sales |
68000 |
Her iki tabloda da yer alan Carol’ın sonuçta yalnızca bir kez listelendiğine dikkat edin. Carol’ın her iki örneğini (farklı maaşlarıyla) de tutmak isteseydik UNION ALL kullanırdık.
UNION ve UNION ALL
UNION işleci NULL değerleri kaldırmaz. Bir sonuç kümesindeki bir sütunda NULL değerler, diğer sonuç kümesindeki karşılık gelen sütunda ise NULL olmayan değerler varsa, UNION işleci ürettiği nihai sonuç kümesinde NULL değerler korunur.
Sonuç kümesine NULL değerleri de dahil etmek ve bunların UNION tarafından elenmesini önlemek istiyorsak, bunun yerine UNION ALL işleci kullanılabilir. Bu işleç, yinelenen ya da NULL içermesine bakılmaksızın, birden çok SELECT sorgusunun tüm satırlarını birleştirir.
SQL’de INTERSECT İşleci Nasıl Kullanılır
INTERSECT işleci yalnızca her iki sonuç kümesinde de görünen satırları döndürür. Bunu, her iki gruba da ait olan kişileri bulmak gibi düşünebilirsiniz.
Yukarıdaki tablolarımızı sorgulamak için INTERSECT kullanalım. Örnek olması açısından yalnızca ad ve departman sütunlarını sorgulayalım:
-- Using INTERSECT to find common employees
SELECT name, department FROM employees
INTERSECT
SELECT name, department FROM contractors;
Bu sorgu, employees ve contractors tablolarından name ve department sütunlarını seçer ve seçilen tüm sütunlara göre her iki tabloda da bulunan satırları döndürür.
|
name |
department |
|
Carol |
Engineering |
INTERSECT işleci, NULL değerleri standart karşılaştırma kurallarına göre ele alır ve karşılık gelen sütunlar karşılaştırılırken NULL değerleri eşit kabul eder. Boş sonuç kümeleri söz konusu olduğunda da boş küme döner.
Başka bir deyişle, bir sonuç kümesinde NULL değeri varken diğer sonuç kümesindeki karşılık gelen sütunda NULL olmayan bir değer varsa, bu satırlar eşit kabul edilmez – kesişim sonucuna dahil edilmezler.
Ayrıca, INTERSECT işleçine sağlanan sonuç kümelerinden biri boşsa genel sonuç da boştur. Boş bir küme ile başka herhangi bir şeyin ortak satırı yoktur.
SQL’de UNION İşleci Nasıl Kullanılır
EXCEPT işleci, ilk sonuç kümesinde olup ikinci kümede olmayan satırları döndürür.
Oracle Database’de EXCEPT, MINUS olarak yazılır; diğer büyük lehçelerin (PostgreSQL, SQL Server, MySQL 8.0.31+, SQLite) tümü EXCEPT kullanır.
Örneğin, aşağıdaki sorguyu çalıştırdığımızı varsayalım:
-- Using EXCEPT to find employees who are not contractors
SELECT name, department, salary FROM employees
EXCEPT
SELECT name, department, salary FROM contractors;
employees tablosundan name, department ve salary sütunları seçilir ve contractors tablosunda bulunmayan satırlar döndürülür.
|
name |
department |
salary |
|
Alice |
Marketing |
65000 |
|
Bob |
Sales |
70000 |
|
John |
HR |
55000 |
EXCEPT işleci de NULL değerleri işlerken standart karşılaştırma kurallarını izler. Boş sonuç kümeleriyle olan davranışı ise, ilk sonuç kümesi boşsa boş küme döndürmek, ikinci sonuç kümesi boşsa ise ilk sonuç kümesindeki tüm satırları döndürmektir.
SQL Küme İşleçleri: Performans ve İyileştirme
Küme işleçlerinin SQL’de sorgu performansı üzerindeki etkisi; dahil olan veri kümelerinin boyutu, sorguların karmaşıklığı ve kullanılan veritabanı yönetim sistemi (VTYS) gibi faktörlere bağlı olarak değişebilir.
Temel faktörleri ve iyileştirme stratejilerini parçalara ayıralım.
Veri hacmi ve sorgu karmaşıklığı
Büyük miktarda verilerle çalışırken, birleştirilmesi, kesiştirilmesi veya karşılaştırılması gereken sonuç kümelerinin boyutu arttıkça bu işlemleri gerçekleştirmek için gereken işlem süresi de artacağından, küme işleçleri sorgu performansını önemli ölçüde etkileyebilir.
Birden çok alt sorgu, join veya küme işleci içeren karmaşık sorgular ek işlem yüküne yol açabilir ve performansı etkileyebilir. Zincirleme işlemler veya iç içe küme işlemleri performans sonuçlarını daha da ağırlaştırabilir.
Dizinleme ve iyileştirme teknikleri
Küme işlemlerine dahil olan sütunların uygun şekilde indekslenmesi, sorgu performansını önemli ölçüde iyileştirebilir. Dizinler, veritabanı motorunun ilgili satırları hızlıca bulup getirmesine yardımcı olur; tam tablo taramalarını azaltır ve yürütme sürelerini iyileştirir.
Küme işleçlerini içeren sorguların performansını artırmak için veritabanı yöneticileri ve geliştiriciler; sorgu yeniden yazımı, yürütme planı analizi ve şema iyileştirmesi gibi teknikleri uygulayabilir. Sorgu önbellekleme ve somutlaştırılmış görünümler gibi tekniklerle karmaşık sorguların sonuçları önceden hesaplanıp saklanabilir; bu da küme işlemlerinin hesaplama yükünü azaltır.
Veritabanı motoru ve donanım kaynakları
Küme işlemlerinin performansı, altta yatan veritabanı motoruna ve onun iyileştirme yeteneklerine bağlı olarak değişebilir. Farklı VTYS’ler, küme işlemlerini işlerken farklı iyileştirme stratejileri ve algoritmalar kullanabilir; bu da performansta farklılıklara yol açar.
CPU, bellek ve disk G/Ç gibi donanım kaynaklarının kullanılabilirliği de küme işleçlerini içeren sorguların performansını etkiler. Yeterli donanım kaynakları, darboğazları hafifletmeye ve verimli sorgu yürütmeye yardımcı olabilir.
Pratikte SQL Küme İşleçleri
Küme işleçleri yalnızca teorik araçlar değildir; iş kararlarını ciddi biçimde etkileyebilecek gerçek dünya uygulamaları vardır. Bir şirketin, hedefli pazarlama kampanyaları için müşteri tabanını segmentlere ayırmak üzere küme işleçlerini nasıl kullanabileceğine dair basitleştirilmiş bir örnek üzerinden gidelim.
Senaryo
Hem çevrimiçi hem de fiziksel mağazalarda satış yapan bir şirket hayal edin. İki ayrı veri kümesi vardır:
- Çevrimiçi alışverişler: Çevrimiçi alışveriş yapanlar için müşteri kimliği, satın alma geçmişi, demografi ve konum.
- Mağaza içi işlemler: Birebir alışveriş yapan müşteriler için benzer bilgiler.
Küme işleçlerini kullanma
Tüm müşterilerin eksiksiz bir görünümünü elde etmek için şirket önce UNION kullanarak her iki veri kümesini tek bir tabloda birleştirir ve yinelenenleri kaldırır. Bu, tüm müşteri tabanının birleşik bir görünümünü verir.
Ardından, hem çevrimiçi hem de mağazada alışveriş yapan müşterileri belirlemek için INTERSECT kullanılabilir. Bu segment, markayla birden çok kanalda yüksek düzeyde etkileşim kurdukları için özellikle değerlidir.
Kanallar arası promosyon fırsatlarını bulmak için şirket EXCEPT kullanabilir. Örneğin, SELECT * FROM online_purchases EXCEPT SELECT * FROM in_store_transactions yalnızca çevrimiçi alışveriş yapmış, ancak mağazalarda alışveriş yapmamış müşterileri bulur. Şirket daha sonra bu müşterileri fiziksel bir lokasyonu ziyaret etmeye teşvik eden promosyonlarla hedefleyebilir.
Segmentasyonun ötesinde
Bu segmentler belirlendikten sonra şirket, demografi veya satın alma geçmişi gibi ek faktörlere göre onları daha da rafine edebilir. Müşterilerine dair bu ayrıntılı anlayış, pazarlama kampanyalarını daha hassas şekilde tasarlamalarını sağlar.
Küme İşleçleri ve JOIN’ler
Hem küme işleçleri hem de SQL JOIN’leri birden çok sorgudan veriyi birleştirir, ancak farklı şekilde çalışırlar. Temel soru, satırları mı yoksa sütunları mı birleştirmek istediğinizdir.
| Özellik | Küme İşleçleri | JOIN’ler |
|---|---|---|
| Birleştirir | Satırlar (sorguları dikey olarak yığar) | Sütunlar (satırları yatay genişletir) |
| Gerektirir | Aynı sütun sayısı ve uyumlu veri türleri | Tablolar arasında ortak bir anahtar sütun |
| Şu durumlarda kullanın | Benzer veri kümelerini birleştirme, sonuç kümeleri arasındaki örtüşmeleri veya farkları bulma | Bir satırı başka bir tablodan ilgili verilerle zenginleştirme |
| Yinelemeleri ele alma | UNION yinelenenleri kaldırır; UNION ALL korur |
Join türüne ve verilere bağlıdır |
| Türler | UNION, UNION ALL, INTERSECT, EXCEPT/MINUS |
INNER, LEFT, RIGHT, FULL OUTER, CROSS |
Küme İşleçlerinin Sınırlamaları ve Dikkat Edilecekler
SQL’de küme işleçlerini kullanırken, sorgu performansını, sonuç doğruluğunu ve genel kullanılabilirliği etkileyebilecek çeşitli sınırlamaları ve faktörleri göz önünde bulundurmak gerekir.
Veri türü uyumluluğu ve NULL değerleri
Sonuç kümelerindeki karşılık gelen sütunların uyumlu veri türlerine sahip olması gerekir. Sorguları birleştirmeden önce karşılık gelen sütunların uyumlu veri türlerini paylaştığını kontrol edin. Tür uyumsuzlukları gözden kaçması kolay hatalara yol açar.
Küme işleçleri, NULL değerleri, VTYS’ye ve belirli işlece bağlı olarak farklı şekilde ele alabilir. Hatalardan kaçınmak için geliştiricilerin NULL değerlerin nasıl ele alındığını anlaması gerekir.
Performans etkisi ve yinelenen satırlar
Küme işlemleri, özellikle büyük veya karmaşık veri kümeleriyle çalışırken sorgu performansını önemli ölçüde etkileyebilir. Dizinleme, sorgu iyileştirmesi ve donanım kaynakları gibi faktörler performansı etkileyebilir. Darboğazları hafifletmek için iyileştirme teknikleri ve performans ayarlama stratejileri kritik önemdedir.
Varsayılan olarak küme işleçleri, sonuç kümesinden yinelenen satırları kaldırır. Ancak bazı durumlarda yinelenen satırları korumak gerekebilir. Küme işleçlerinin yinelenenler konusundaki davranışını anlamak ve gerektiğinde uygun teknikleri kullanmak önemlidir.
Sonuçların sıralanması ve bellek kısıtları
Küme işleçleri, nihai çıktıda sonuçların sırasını garanti etmez. Birleşik sonucu sıralamak için, tüm sorgunun en sonuna, son SELECT ifadesinden sonra bir ORDER BY ifadesi ekleyin.
Özellikle büyük veri kümeleriyle çalışırken küme işlemleri önemli miktarda bellek ve kaynak tüketebilir. Performans düşüşü veya sistem kararsızlığını önlemek için bellek kısıtları ve kaynak sınırlamaları dikkate alınmalıdır.
Karmaşıklık, sürdürülebilirlik ve çapraz VTYS uyumluluğu
Birden çok küme işleci, alt sorgu ve join içeren karmaşık sorguların anlaşılması, bakımı ve hata ayıklaması zor olabilir. Okunabilirliği ve sürdürülebilirliği artırmak için sorgular öz, iyi belgelendirilmiş ve modüler olmalıdır.
Küme işleçleri, farklı veritabanı yönetim sistemleri (VTYS’ler) arasında söz dizimi ve davranış açısından farklılıklar gösterebilir. Çapraz platform uyumluluğu için SQL sorguları yazarken bu farklılıkları bilmek hayati önem taşır.
Son düşünceler
Küme işleçleri belirli bir sorunu çözer: Hangi satırların örtüştüğünü önceden bilmeden sonuç kümelerini birleştirmek veya karşılaştırmak.
UNION, INTERSECT ve EXCEPT’i kapsarlar: sonuç kümelerini birleştirme, karşılaştırma ve çıkarma için üç işleç.
Daha fazla bilgi edinmek isterseniz, SQL’de Verileri Birleştirme kursuna göz atın.
SQL İşleçleri SSS
UNION ALL ile UNION arasındaki fark nedir?
UNION ALL, yinelenenler olsa bile her iki sorgudan gelen tüm satırları içerir. UNION yinelenen satırları kaldırır.
SQL'de UNION, JOIN'den nasıl farklıdır?
UNION, sorguların sonuçlarını dikey olarak birleştirir; bir sorgunun satırlarını diğerine ekler. JOIN tabloları yatay olarak birleştirir, ilişkili bir sütuna göre satırları eşleştirir ve daha geniş bir sonuç kümesi oluşturur.
Küme işlemlerini kullanırken performansla ilgili hususlar var mı?
Küme işlemleri, özellikle büyük veri kümeleriyle çalışırken hesaplama açısından maliyetli olabilir. Performansı artırmak için tek tek sorguları optimize etmek ve mümkün olduğunda dizin kullanmak önemlidir.
EXCEPT ile NOT IN arasındaki fark nedir?
EXCEPT ve NOT IN benzer sonuçlar üretebilir, ancak NULL değerlerle farklı davranırlar. EXCEPT, satırları karşılaştırırken NULL değerleri eşit kabul eder; dolayısıyla aynı sütun konumunda iki NULL değeri olması bir satırın hariç tutulmasına yol açar. Buna karşılık NOT IN, alt sorguda herhangi bir NULL varsa hiç satır döndürmez; çünkü SQL’de NULL karşılaştırmaları tanımsızdır. Büyük veri kümeleri için EXCEPT, ilişkili bir NOT IN alt sorgusuna kıyasla daha okunaklı da olabilir.
Küme işleçleriyle ORDER BY kullanabilir miyim?
Evet, ama yalnızca bir kez ve tüm sorgunun en sonunda. Bir küme işlemi içinde tek tek SELECT ifadelerinin içinde ORDER BY kullanamazsınız. Birleşik sonucu sıralamak için, son SELECT ifadesinden sonra tek bir ORDER BY ekleyin.
Örnek:
SELECT name FROM employees
UNION
SELECT name FROM contractors
ORDER BY name ASC;MySQL, INTERSECT ve EXCEPT'i destekliyor mu?
MySQL, INTERSECT ve EXCEPT desteğini 8.0.31 sürümünde ekledi. Daha eski bir sürüm kullanıyorsanız, bunları taklit etmeniz gerekir: INTERSECT için bir INNER JOIN ya da IN içeren alt sorgu; EXCEPT için ise LEFT JOIN ... WHERE IS NULL veya NOT IN alt sorgusu kullanın. Oracle, EXCEPT yerine MINUS kullanır.

