Yazan : Şadi Evren ŞEKER

Bilgisayar bilimlerinde özellikle veri tabanı (databases) konusunda geçen bu kavramlar, iki tablonun birleşmesi sırasında bir tabloda bulunmayan kayıtlar için nasıl bir yol izleneceğini anlatırlar.

Bilindiği üzere iki tablonun birleşmesi (join) aslında iki tabloda bulunan kayıtlar için bir kartezyen çarpım (cartesian product) alınması işlemidir. Bir işlemin sadece Kartezyen çarpımının alınması ile birleşmesine çapraz birleştirme (cross join) ismi verilir. Bu işlem sırasında herhangi bir koşul bulunursa bu tip birleştirmelere de şartlı birleştirme (koşullu birleştirme, conditional join) ismi verilir. Şayet iki tabloda da bulunan ve tercihen bir tabloda birincil anahtar (primary key) olup diğer tabloda yabancı anahtar (foreign key) olan bir kolonun eşitliği birleşme sırasında koşul olarak veriliyorsa bu tip birleşmelere de eşit birleşme (equijoin veya doğal birleşme, natural join) ismi verilir.

İç birleştirme (inner join) veya dış birleştirme (outer join) işlemi ise bu birleştirme koşulunun üzerinde, iki taraf için taşıyıp taşımamasına göre belirlenir.

Şayet iki tabloda da aynı koşulun sağlanması isteniyorsa bu tip birleştirmelere (join) iç birleştirme (inner join) ismi verilir.

Şayet iki tablodan birisinin koşulu sağlanması isteniyorsa bu tip birleştirmelere de dış birleştirme (outer join) ismi verilir.

Birleştirme işlemi sırasında, işlemin (operator) sol veya sağ tarafının koşulu sağlamasına göre, birleştirme işlemine sol dış birleştirme (left outer join) veya sağ dış birleştirme (right outer join) ismi verilebilir.

Yukarıdaki bu tanımları örnekler üzerinden anlamaya çalışalım.

Örneğin birleştirme (join) yapmak istediğimiz iki tablo aşağıdaki şekilde verilmiş olsun:

Çalışanlar Tablosu:

Çalışan KısımNo
Ali 1
Veli 2
Ahmet 2
Ayşe 3
Fatma 3
Ömer 5

İki kolonlu bu tabloda her çalışanın hangi kısımda çalıştığını kısım tablosunun birincil anahtarı olarak tutuyor olsun. Dolayısıyla yukarıdaki çalışan tablosunda bulunan kısım kolonu bir yabancı anahtar (foreign key) olmuş olur.

KısımNo Kısım
1 Müdüriyet
2 Mühendislik
3 Satış
4 Finans

Yukarıdaki iki tablonun iç birleştirmesinin sonucu (iner join) aşağıda verilmiştir:

Çalışanlar.Çalışan Çalışanlar.KısımNo Kısımlar.KısınNo Kısımlar.Kısım
Ali 1 1 Müdüriyet
Veli 2 2 Mühendislik
Ahmet 2 2 Mühendislik
Ayşe 3 3 Satış
Fatma 3 3 Satış

Yukarıdaki birleşim sonucunda örneğin finans kısmı ile ilgili veya Ömer için bir satır bulunmamaktadır, çünkü ancak iki tabloda ortak olan satırlar alınmıştır.

İç birleştirme genelde SQL dillerinde herhangi bir şey belirtilmediğinde yapılan birleştirme şeklidir. Örneğin yukarıdaki tablolar için aşağıdaki SQL satırı yazıldığında iç birleştirme kastedilmiş olur:

Select * from çalışanlar , kısımlar
		where çalışanlar.KısımNo = kısımlar.KısımNo;

Yukarıdaki satırı bazı SQL dillerinde özel olarak inner join ibaresi ile belirlemek gerekebilir. Bu durumda yukarıdaki SQL cümlesini aşağıdaki şekilde değiştirebiliriz:

Select * from çalışanlar , kısımlar
		inner join ksımlar
		on  çalışanlar.KısımNo= kısımlar.KısımNo;

Yukarıdaki birleştirme işlemi ayrıca yabancı /birincil (foreign / primary key) anahtar eşitliği olduğu için bir eşit birleştirme (equi join) olarak da kabul edilebilir. Eşit birleştirmelere özel olarak SQL dilinde “using” komutu kullanılabilir. Yukarıdaki SQL cümlesini “using” komutu ile yazacak olursak:

Select * from çalışanlar , kısımlar
		INNER JOIN ksımlar
		using (KısımNo);

Eşit birleştirmenin özel bir hali olan doğal birleştirmede (natural join) ise, eşitliği aranan kolonların isimlerinin birebir aynı olması gerekir. Yukarıdaki örnekte iki tabloda da KısımNo isimli kolonlar eşit olacağı ve iki tabloda da aynı isme sahip olduğu için doğal birleştirme yapılabilir. Şayet tablolardaki kolonlar aynı amaçla aynı bilgileri tutan fakat farklı isimlere sahip olsaydı doğal birleştirme işlemi yapılamazdı.

Select * from çalışanlar
		natural join ksımlar

Doğal birleştirme sırasında, yukarıda görüldüğü üzere “natural join” kelimesi kullanılabilir.

Bu yazı şadi evren şeker tarafından yazılmış ve bilgisayarkavramlari.com sitesinde yayınlanmıştır. Bu içeriğin kopyalanması veya farklı bir sitede yayınlanması hırsızlıktır ve telif hakları yasası gereği suçtur.

Buraya kadar olan birleştirme şekilleri sonuçta birer iç birleştirmedir ve sonuçların hepsinde yukarıdaki örnek tablo gösterilecektir. Dış birleştirme durumunda ise aşağıdaki sonuç çıkacaktır:

Çalışanlar.Çalışan Çalışanlar.KısımNo Kısımlar.KısınNo Kısımlar.Kısım
Ali 1 1 Müdüriyet
Veli 2 2 Mühendislik
Ahmet 2 2 Mühendislik
Ayşe 3 3 Satış
Fatma 3 3 Satış
Ömer 5 Null Null
Null Null 4 Finans

Yukarıdaki tabloda dikkat edilirse, karşılığı olmayan değerler de alınmıştır. Yani Ömer isimli çalışanın, hangi kısımda çalıştığı bilinmemektedir veya Finans kısmında çalışan kimse yoktur ama yine de bu bilgiler karşılığı null (boş) da olsa alınmıştır. Bu birleştirme tipine tam dış birleştirme anlamına gelen full outer join ismi de verilir ve bazı SQL dillerinde bu komut olarak kullanılır.

Sol dış birleştirme (left outer join) için birleştirme sırasındaki tablolardan solda olanı esas kabul edilerek, bu tablodaki bütün değerler karşılığı olsun olmasın yazılır. Buna karşılık soldaki tabloda karşılığı bulunmayan satırlar yazılmaz. Örneğin aşağıdaki SQL cümlesini ele alalım:

Select * from çalışanlar , kısımlar
		Left OUTER join ksımlar
		on  çalışanlar.KısımNo= kısımlar.KısımNo;

Yukarıdaki cümlenin çıktısı aşağıdaki şekildedir:

Çalışanlar.Çalışan Çalışanlar.KısımNo Kısımlar.KısınNo Kısımlar.Kısım
Ali 1 1 Müdüriyet
Veli 2 2 Mühendislik
Ahmet 2 2 Mühendislik
Ayşe 3 3 Satış
Fatma 3 3 Satış
Ömer 5 Null Null

Görüldüğü üzere normal bir dış birleştirmede olması beklenen finans departmanı, sol dış birleştirme sonucunda çıkmamıştır. Şayet cümlemizi aşağıdaki şekilde değiştirecek olursak:

Select * from çalışanlar , kısımlar
		LEFT outer join ksımlar
		on kısımlar.KısımNo = çalışanlar.KısımNo;

Bu durumda da finans kısmı solda olan tabloda olduğu için yazılacak ancak Ömer isimli çalışan sağdaki tabloda olduğu için sonuçta görülmeyecektir.

Çalışanlar.Çalışan Çalışanlar.KısımNo Kısımlar.KısınNo Kısımlar.Kısım
Ali 1 1 Müdüriyet
Veli 2 2 Mühendislik
Ahmet 2 2 Mühendislik
Ayşe 3 3 Satış
Fatma 3 3 Satış
Null Null 4 Finans

Yukarıdaki şekilde sol dış birleştirmede, tabloların yerini değiştirmek yerine, sağ dış bağlantı (right outer join) yapılması da mümkündür. Yani şayet tabloların yerini değiştirmek yerine aradaki birleştirme tipini aşağıdaki şekilde değiştirirsek:

Select * from çalışanlar , kısımlar
		Right outer join ksımlar
		on  çalışanlar.KısımNo= kısımlar.KısımNo;

Sonuç yine yukarıda görülen son tablo şeklinde olacaktır.

Anti Join (Zıt Birleştirme)

SQL dilinde kullanılan bir birleştirme tipi de zıt birleştirme’dir (antijoin). Bu tip birleştirmelerde amaç iki küme arasında zıtlık (anti) ilişkisi kurmaktır. SQL dilinde bulunan NOT IN ve NOT EXISTS kelimeleri ile, sorgulanan bilginin, verilen bir kümede olmaması şartı aranır.

SELECT   k.kısım
    FROM kısımlar k
   WHERE NOT EXISTS (SELECT NULL
                       FROM çalışanlar ç
                      WHERE ç.kısımNo = k.kısımNo)

Yukarıdaki sorgu cümlesindeki amaç, çalışanı olmayan departmanları bulmaktır.  Görüldüğü üzere iç içe iki sorgu bulunmaktadır.  Mavi renkle gösterilen iç sorguda, dıştaki sorgu ile bağlantı kurulmaya çalışılmıştır. Burada önemli olan iki küme arasında içermeme ilişkisi kurulmasıdır. Yukarıdaki sorgunun çıktısı aşağıdaki şekildedir.

k.kısım
Finans

Görüldüğü üzere çalışanı bulunmayan tek kısım olan Finans, sonuç kümesinde görülmektedir.

Zıt birleştirme (anti join) işlemleri aslında iki küme arasında fark almaya (set difference) benzetilebilir. Örneğin yukarıdaki sorgu cümlesi, aşağıdaki şekilde de yazılabilir:

SELECT  k.kısım
    FROM kısımlar k
MINUS
SELECT   k.kısım
    FROM kısımlar k, çalışanlar ç
   WHERE k.kısımNo = ç.kısımNo

Yukarıdaki yeni sorgunun, bir önceki sorgudan anlam olarak bir farkı yoktur. Mavi renkle gösterilen sorgunun sonucu, ilk sorgudan çıkarılmıştır (minus). İlk sorguda (siyah renkli olan) bütün kısımlar sorgulanmakta ve sonuç kümesinden, çalışanı olan kısımlar çıkarılmaktadır ( mavi sorgu). Bu işlemi, ilişkisel cebirdeki (Relational Algebra) , fark işlemi (difference) olarak düşünebiliriz.

Semi Joins (Yarı Birleştirmeler)

SQL cümleleri hazırlanırken kullanılan bir birleştirm türü de yarı birleştirmelerdir (semijoins). Bu birleştirme tipleri, bir önceki bölümde anlattığımız zıt birleştirmelerin tersi olarak düşünülebilir. Yani zıt birleştirmelerde kullanılan NOT IN veya NOT EXISTS kelimelerinin tam tersi anlamdaki IN veya EXISTS kelimeleri, yarı birleştirmelerin (semi joins) yazılmasını sağlar.

Örneğin, yukarıdaki zıt birleştirme (ters birleştirme) işleminin tersi anlama gelen ve çalışanı bulunan kısımları görmeyi amaçlayan aşağıdaki sorguyu ele alalım:

SELECT   k.kısım
    FROM kısım k
   WHERE EXISTS (SELECT NULL
                   FROM çalışanlar ç
                  WHERE ç.kısımNo = k.kısımNo)

Yukarıdaki sorguda, mavi renkle gösterilen ikinci sorgu, çalışanlar ile kısımlar arasında bağlantı kurmakta, dışarıdaki sorgu ise bütün kısımları sorgulamaktadır. Bütün kısımlardan çalışanları olan kısımları sorgulamak için “exists” kelimesi kullanılmıştır.

Bir cevap yazın

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