Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
SQL : Join Türleri
Önceki iki yazıda SQL’deki temel join sorguları üzerinde durmuştuk. O yazılarda anlatılan join’in en çok kullanılan türü olan inner join’di. Bu yazıda ise genel olarak inner, outer, left, right, full gibi join türlerinin benzer ve farklı yönlerini örneklerle açıklamaya çalışacağım. Eğer join konusuna tamamen yeni iseniz öncelikle ilk iki makaleyi çalışmanızı öneririm.
Bildiğiniz gibi üzerinde çalıştığımız veritabanları için kullanılan genel isim “ilişkiselveritabanı”dır. Yani tablolar birbiri ile ilişkilidir ve bu ilişki bir tablodaki birincil anahtar (primary key) ile diğer tablodaki yabancı anahtar (foreign key) üzerinden kurulur. Aşağıdaki okul veritabanında bu tablolar arasındaki ilişkiler açıkça görülüyor.
Join türlerini örneklendirmek için yukarıdaki tablolardan Öğrenci ve Bölüm tablolarını kullanalım:
Inner Join
Inner join en çok kullanılan join türüdür ve her iki tablodaki ortak kayıtları döndürür. Bir başka ifade ile iki tablonun kesişimini döndürür. Mesela bölüm ve öğrenci tablolarını birleştirmek istersek
SELECT * FROM bolum b INNER JOIN ogrenci o ON b.bid = o.bid
Sorgunun sonuç kümesi aşağıdaki gibi olacaktır.
Sonuç kümesindeki ilk 4 kolon bölüm tablosunda sonraki 5 kolon ise öğrenci tablosuna aittir. Her iki tablonun bid alanlarına bakarsanız bire-bir eşleştiklerini görürsünüz. Yani sorgu iki tablonun kesişimini döndürmüş oluyor.
Left ve Right Outer join
Eğer bir tablodaki tüm kayıtlar ile diğer tablodaki birleştirme koşulunu sağlayan kayıtları döndürmek istersek right ve veya left outer join kullanırız. Mesela tüm bölümleri (hiç öğrencisi olmayanlar da dahil) ve bir bölüme kayıtlı öğrencileri sorgulamak istersek:
SELECT * FROM bolum b LEFT JOIN ogrenci o ON b.bid = o.bid
Son kayıda dikkat ederseniz hiç öğrencisi olmayan bölüm de sonuç kümesinde mevcut. Yani soldaki tablodan (bölüm) tüm kayıtlar, sağdaki tablodan ise sadece kesişen kayıtlar gelmiş oldu.
Yukarıdaki sorguyuda left (sol) yerine right (sağ) sözcüğünü kullanmış olsaydık, tüm öğrenciler ile en az bir öğrencisi olan bölümler seçilirdi. Yani left ve right tüm kayıtların seçileceği tablonun sağdaki mi yoksa soldaki mi olacağını belirtiyor yalnzıca.
SELECT * FROM bolum b RIGHT JOIN ogrenci o ON b.bid = o.bid
Bu sorguda tabloların yerini değiştirisek tekrar tüm bölümleri ve bir bölüme kayıtlı öğrencileri seçmiş oluruz.
SELECT * FROM ogrenci o RIGHT JOIN bolum b ON b.bid = o.bid
Sadece sonuç kümesinde tabloların yeri değişmiş olur. Aşağıda görüldüğü gibi:
Eğer yalnızca hiç öğrencisi olmayan bölümleri seçmek istersek where ifadesi ile öğrenci tablosundaki tüm kayıtları aşağıdaki gibi eleyebiliriz.
SELECT * FROM bolum b LEFT JOIN ogrenci o ON b.bid = o.bid WHERE o.bid IS NULL
Yaptığımız işlemi Venn şeması ile gösterecek olursak:
Full Outer Join
Tüm öğrencileri ve tüm bölümleri seçmek istersek full outer join kullanırız.
SELECT * FROM bolum b FULL OUTER JOIN ogrenci o ON b.bid = o.bid
Full outer join çok da gerekli olmadığından MySQL’de mevcut değildir. Ancak aşağıdaki gibi bir sorgu ile (union kullanarak) aynı sonuç elde edilebilir.
SELECT * FROM bolum b LEFT JOIN ogrenci o ON b.bid = o.bid
UNION
SELECT * FROM bolum b RIGHT JOIN ogrenci o ON b.bid = o.bid
Yaptığımız işlemi Venn şeması ile gösterecek olursak:
Sintaks
SQL join sintaksı ile ilgili olarak şunları hatırlatmakta yarar var.
– Inner Join yerine sadece Join yazmamız yeterli
– Left Outer Join yerine sadece Left Join yazmamız yeterli
– Right Outer Join yerine sadece Right Join yazmamız yeterli
Natural Join
Bir de natural join var ki yazımda kolaylık sağladığı için öğrenciler tarafından tercih edilebiliyor. Mesela aşağıdaki iki sorgu aynı işi yapar:
SELECT * FROM bolum b NATURAL JOIN ogrenci o
SELECT * FROM bolum b RIGHT JOIN ogrenci o ON b.bid = o.bid
Ancak gerçek hayatta Natural Join kullanımı sakıncalıdır. Çünkü Natural Join iki tablodaki aynı isme sahip tüm alanların (kolonların) eşleşip eşleşmediğine bakar. Öğrenci ve Bölüm tablolarında sadece bid alanları aynı isme sahip olduğundan bir problem çıkarmıyor ancak Bölüm tablosunda bölümün ismini tutan için badi alanı adişeklinde isimlendirilseydi Öğrenci tablosunda da aynı isimli bir alan bulunduğundan sorgu bu kez aşağıdaki sorgu ile eşdeğer olacaktı.
SELECT * FROM bolum b RIGHT JOIN ogrenci o ON b.bid = o.bid AND o.adi=b.adi
Kısacası natural join sorgusunda tam olarak hangi alanların karşılaştırıldığı belli değildir ve bu hata riskini artırtığı için profesyonel programcılar tarafından tercih edilmez.
SQL | Kümeler ile Join İşlemleri | Inner Join – Left Join – Right Join – Full Join
01PazarJan 2012
Posted by mehmetozakan in Matematik, Oracle - PLSQL, SQL - TSQL,Veri Tabanı
≈ 9 Yorum
Etiketler
Full Join, Inner Join, Left Join, PL-SQL, Right Join,SQL, T-SQL
Verilerin birbirleriyle join işlemleri T-Sql de olsunPL-Sql de olsun sıkça yapılan işlemlerdendir. Fakat SQL öğrenmeye yeni başlayanlar için Left olsunRight olsun tam bir kargaşadır. Hangi durumda verinin nasıl geleceğini tahmin edememek aslında ciddi bir tehlikedir. Özellikle left join ile bağlanması gereken bir referans tablosunun yanlışlıkla inner join ile bağlanması sonucu, ana tabloda olan bir kodun referans tablosunda olmamasından dolayı, ana kaydın gelmemesi açıkcası çokça gözlemlediğim bir hatadır. Tabi bu bahsettiğim durum daha çok 1-1 ilişkisi olan tablolar için hassas bir konudur. Diğer durumlar için inner ya da left olması tamamen sizin ihtiyacınıza ve kurgunuza bağlı bir durumdur.
Join işlemlerini kolayca kavrayabilmeniz için durumu kümelerle ımantığıyla simüle ederek size aktarmayı uygun gördüm. Açıkcası zaman içersinde bu konuda sıkıntısı olduğunu hissettiğim arkadaşlara hep bu yolla konuyu anlatmayı tercih etmiştim. Netice bir matematikçiden de başka birşey beklenmek süpriz olurdu…
A ve B şeklinde 2 kümemiz olduğunu varsayalım.
· “A inner join B” kümelerde karşılığı keşişimdir. Yani sadece her iki tabloda da olan veriler gelir.
· “A left join B” kümelerde sol(left) tarafta olan küme demektir. Yani A tablosundaki veriler koşulsuz gelir, B tablosundan eşleştirebildiklerini (ki bu kısımlar kesişim bölümüne karşılık gelir) getirir, eşeşleştiremezse o alanları NULL olarak getirir.
· “A right join B” kümelerde sağ(right ) tarafta olan küme demektir. Yani B tablosundaki veriler koşulsuz gelir, A tablosundan eşleştirebildiklerini (ki bu kısımlar kesişim bölümüne karşılık gelir) getirir, eşeşleştiremezse o alanları NULL olarak getirir.
· “A full join B” kümelerde birleşim karşılık gelir. Her iki kümedeki tüm elemanları getirir. Eşleştirebildiklerine ilgili tablolardaki değerleri, eşleştiremediklerini NULL olarak getirir.
INNER JOIN | KESİŞİM (A∩B)
LEFT JOIN | A KÜMESİ (A/B U A∩B)
RIGHT JOIN | B KÜMESİ (B/A U A∩B)
FULL JOIN | BİRLEŞİM (AUB)