SQL'de JOIN ler (örnekli anlatım)

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

SQL'de JOIN ler (örnekli anlatım)

Mesaj gönderen naile »

Bazen birden fazla tablodan bilgi çekmemiz gerekebilir. Birbirleri ile ilişkisi olan bu tablolar joinlerle birleştirmeler yapılarak gerekli alanlar alınabilir. Joinler:

Kod: Tümünü seç

1. Inner join
2. Outer join
    a. Left join
    b. Rigth join
    c. Full join
3. Cross join
Şimdi örnek ile anlamaya çalışalım. İki tane tablomuz olsun, Bolum ve Ogrenci adında. Bolum tablosunda bir fakültedeki bölümler tutulsun ve alan olarak BolumNo ve BolumAdi olarak iki tane alanı olsun. Diğer tablomuzda ise her bölümde oluyan öğrencilerin listesi tutulsun. Buraya yazılacak BolumNo, Bolum tablosundaki BolumNo ile aynı olur.

Kod: Tümünü seç

Bolum:		
BolumNo	 int              
BolumAdi varchar

Ogrenci:
BolumNo	  int                            
OgrNo	    int
OgrAdi	   varchar

Tablolardaki veriler ise şu şekilde olsun:
BÖLÜM TABLOSU:

Kod: Tümünü seç

BolumNo	BolumAdi
1	     Bilgisayar Mühendisliği
2	     Çevre Mühendisliği
3	     Elektronik Mühendisliği
4	     Mimarlık
5	     Şehir ve Bölge Planlama
OGRENCI TABLOSU:

Kod: Tümünü seç

BolumNo	OgrNo	OgrAdi
1	       1	 Ahmet İnce
1	       2	 Ayhan Güzel
1	       3	 Sevim Coşkun
2	       4	 Gülsüm Sever
2	       5	 Zeki Çalışkan	
3	       6	 Ayşe Toprak
4	       7	 Ahmet Gül
Şimdi gelelim yukarda saydığımız joinlere göre bu iki tabloyu nasıl birleştirebiliriz ve nasılsonuçlar elde edebiliriz:

1.INNER JOIN:
Her iki tabloda da, birleştirdiğimiz alana göre, mevcut olan kayıtları getirir. Yani bu iki tabloda ortak olan alnımız BolumNo olduğu için birleştirme koşulumuz BolumNo’ya göre yapılacak ve her iki tabloda da kayıtlı olan bölümler gelecektir sonuç olarak.

SQL cümlemiz:

Kod: Tümünü seç

SELECT     Bolum.BolumNo,Bolum.BolumAdi,Ogrenci.OgrNo,Ogrenci.OgrAdi
FROM         Bolum INNER JOIN
                      Ogrenci ON Bolum.BolumNo = Ogrenci.BolumNo
Çıkan sonuç:

Kod: Tümünü seç

BolumNo	BolumAdi	      OgrNo	OgrAdi
1	Bilgisayar Mühendisliği	1	Ahmet İnce
1	Bilgisayar Mühendisliği	2	Ayhan Güzel
1	Bilgisayar Mühendisliği	3	Sevim Coşkun
2	Çevre Mühendisliği	     4	Gülsüm Sever
2	Çevre Mühendisliği	     5	Zeki Çalışkan	
3	Elektronik Mühendisliği	6	Ayşe Toprak
4	Mimarlık	               7	Ahmet Gül
Görüldüğü üzere, Ogrenci tablosunda, Bolum tablosunda bulunan 5 numaralı bölüme (Şehir ve Bölge Planlama) ait herhangi bir kayıt bulunmadığından o satır gelmez.

2. OUTER JOIN

a. Left join: İlk tablodaki (yani soldaki) bütün kayıtlar, ikinci tabloda ise ilk tablodaki ortak alana (BolumNo) göre uyuşan kayıtlar gelir. Eğer ikinci tabloda ilk tablodaki BolumNo larının tamamı yoksa,olmayan o satırlar için ikinci Tablodaki alanlar null olarak gelir.


SQL cümlemiz:

Kod: Tümünü seç

SELECT     Bolum.BolumNo, Bolum.BolumAdi, Ogrenci.OgrNo, Ogrenci.OgrAdi
FROM         Bolum LEFT OUTER JOIN
                      Ogrenci ON Bolum.BolumNo = Ogrenci.BolumNo

Çıkan sonuç:

Kod: Tümünü seç

BolumNo	BolumAdi	       OgrNo	OgrAdi
1	Bilgisayar Mühendisliği	1	Ahmet İnce
1	Bilgisayar Mühendisliği	2	Ayhan Güzel
1	Bilgisayar Mühendisliği	3	Sevim Coşkun
2	Çevre Mühendisliği	     4	Gülsüm Sever
2	Çevre Mühendisliği	     5	Zeki Çalışkan	
3	Elektronik Mühendisliği   6	Ayşe Toprak
4	Mimarlık	               7	Ahmet Gül
5	Şehir ve Bölge Planlama	Null	Null

(Şehir ve bölge planlama ilk tabloda kayıtlı olduğu için sonuç olarak geldi ama ikinci tabloda olmadığı için o tablodaki alanların değeri null olarak geldi.)

b. Rigth join: Left join ile aynı mantıkta çalışır, sadece tersi durum geçerlidir. Yani, ikinci tablodaki (yani sağdaki) bütün kayıtlar, ilk tabloda ise ikinci tablodaki ortak alana (BolumNo) göre uyuşan kayıtlar gelir. Eğer ilk tabloda ikinci tablodaki BolumNo larının tamamı yoksa,olmayan o satırlar için ilk Tablodaki alanlar null olarak gelir.


SQL cümlemiz:

Kod: Tümünü seç

SELECT     Bolum.BolumNo, Bolum.BolumAdi, Ogrenci.OgrNo, Ogrenci.OgrAdi
FROM          Bolum RIGHT OUTER JOIN
                  Ogrenci    ON Bolum.BolumNo = Ogrenci.BolumNo
ORDER BY Bolum.BolumNo
Çıkan sonuç:

Kod: Tümünü seç

BolumNo	BolumAdi	OgrNo	OgrAdi
1	Bilgisayar Mühendisliği	1	Ahmet İnce
1	Bilgisayar Mühendisliği	2	Ayhan Güzel
1	Bilgisayar Mühendisliği	3	Sevim Coşkun
2	Çevre Mühendisliği	     4	Gülsüm Sever
2	Çevre Mühendisliği	     5	Zeki Çalışkan	
3	Elektronik Mühendisliği	6	Ayşe Toprak
4	Mimarlık	               7	Ahmet Gül
(Şehir ve Bölge Planlamada hiç öğrenci kaydı olmadığından (yani ikinci tabloda kayıt olmadığından) sonuç olarak gelmedi.)

c. Full join: Her iki tablodaki bütün kayıtları getirir. Uyuşmayan satırlar için o alanlar null olarak gelir.

4. CROSS JOIN
Her iki tabloyu çapraz olarak birleştirir. Yani, ilk tablodaki her bir satır için ikinci tablodaki her satır sonuç olarak döner.


SQL Cümlesi:

Kod: Tümünü seç

SELECT     Bolum.BolumNo, Bolum.BolumAdi, Ogrenci.OgrNo, Ogrenci.OgrAdi
FROM         Bolum CROSS JOIN
                      Ogrenci
Çıkan Sonuç:

Kod: Tümünü seç

BolumNo	BolumAdi	      OgrNo	OgrAdi
	1	Bilgisayar Mühendisliği	1	Ahmet İnce
	1	Bilgisayar Mühendisliği	2	Ayhan Güzel
	1	Bilgisayar Mühendisliği	3	Sevim Coşkun
	1	Bilgisayar Mühendisliği	4	Gülsüm Sever
	1	Bilgisayar Mühendisliği	5	Zeki Çalışkan
	1	Bilgisayar Mühendisliği	6	Ayşe Toprak
	1	Bilgisayar Mühendisliği	7	Ahmet Gül
	1	Bilgisayar Mühendisliği	8	Şengül Kader
	2	Çevre Mühendisliği	1	Ahmet İnce
	2	Çevre Mühendisliği	2	Ayhan Güzel
	2	Çevre Mühendisliği	3	Sevim Coşkun
	2	Çevre Mühendisliği	4	Gülsüm Sever
	2	Çevre Mühendisliği	5	Zeki Çalışkan
	2	Çevre Mühendisliği	6	Ayşe Toprak
	2	Çevre Mühendisliği	7	Ahmet Gül
	2	Çevre Mühendisliği	8	Şengül Kader
	3	Elektronik Mühendisliği	1	Ahmet İnce
	3	Elektronik Mühendisliği	2	Ayhan Güzel
	3	Elektronik Mühendisliği	3	Sevim Coşkun
	3	Elektronik Mühendisliği	4	Gülsüm Sever
	3	Elektronik Mühendisliği	5	Zeki Çalışkan
	3	Elektronik Mühendisliği	6	Ayşe Toprak
	3	Elektronik Mühendisliği	7	Ahmet Gül
	3	Elektronik Mühendisliği	8	Şengül Kader
	4	Mimarlık	       1	Ahmet İnce
	4	Mimarlık	       2	Ayhan Güzel
	4	Mimarlık	       3	Sevim Coşkun
	4	Mimarlık	       4	Gülsüm Sever
	4	Mimarlık	       5	Zeki Çalışkan
	4	Mimarlık	       6	Ayşe Toprak
	4	Mimarlık	       7	Ahmet Gül
	4	Mimarlık	       8	Şengül Kader
	5	Şehir ve Bölge Planlama	1	Ahmet İnce
	5	Şehir ve Bölge Planlama	2	Ayhan Güzel
	5	Şehir ve Bölge Planlama	3	Sevim Coşkun
	5	Şehir ve Bölge Planlama	4	Gülsüm Sever
	5	Şehir ve Bölge Planlama	5	Zeki Çalışkan
	5	Şehir ve Bölge Planlama	6	Ayşe Toprak
	5	Şehir ve Bölge Planlama	7	Ahmet Gül
	5	Şehir ve Bölge Planlama	8	Şengül Kader
En son naile tarafından 14 Kas 2005 08:49 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Orti Eline sağlık :) Çok güzel olmuş :D Devamını bekleriz :wink:

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Bildiğin bişeyi anlatması, hele hele yazması çok zor oluyor. Umarım anlaşılır şekilde anlatabilmişimdir :)
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Kolay olsa herkez makale yazardı zaten.
Umarım değil ummalısın anlaşılabilme hususuna :D ;) Tekrar eline sağlık. :)

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Teşekkür ederim

Mesaj gönderen pro_imaj »

Merhaba Naile hanım
Elinize sağlık çok güzel bir makale olmuş.

ben bu işlemi daha önce şöyle yapıyodum join kullanmadan

Kod: Tümünü seç

//Koli içini bulmak için stk katsayı2 vt den alıyorum+++++
STKQuery.Close;
STKQuery.Sql.Clear;
STKQuery.SQL.Text:='SELECT Malkodu,Katsayi2,MalAdi From FINSAT460.STK Where MalKodu like "'+STIQueryMalKodu .Text+'"';
STKQuery.Open;
STIQueryKoliici.Text:=STKQueryKatsayi2.Text;
//Koli içini bulmak için stk katsayı2 den alıyorum-------
bu kodu Quernin OnCalcField alanına yazıyorum.

Yukarıda ki kodda STKQuery ile STIQuery nin Mal kodu alanları aynı.

Artık benimde aşmam gerekiyor bazı şeyleri.

Çalışmalarınızda ki başarının daim olması dileğiyle
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Ali Erdoğan
Kıdemli Üye
Mesajlar: 1026
Kayıt: 11 Şub 2005 02:12
Konum: İstanbul

Mesaj gönderen Ali Erdoğan »

Eline sağlık.
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

Naile hanım çok teşekkür ederim.Joinlerle sorunumuz vardı. :roll:

Elinize sağlık.Devamını bekleriz.. :wink:

iyi günler...
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

Mesaj gönderen oguzozturk74 »

Elinize sağlık , güzel çalışma olmuş... :)
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Basit bir kaç örnekte benden :)

JOIN ler :)
Türleri:
1.inner (iki taraftan ortya kesişim çıkar)
2.outer
a.left (sol tablo olduğu gibi çıkar)
b.right (sağ tablo olduğu gibi çıkar)
c.full (iki tablonun birleşimi çıkar)
3.cross (kartezyen çarpım çıkar şart verilirse inner ile aynı işi daha yavaş yapar)
Açıklamalı Örnek:

tr tablosu: ing tablosu:
id oku id read
--- ----- --- -----
1 Bir 0 Zero
2 İki 1 One
3 Üç 2 Two
__________________________________________________________________________
1.inner:
select * from tr inner join ing on tr.id=ing.id
id oku id read
--- ----- --- -----
1 Bir 1 One
2 İki 2 Two
__________________________________________________________________________
2.outer:
a.left:
select * from tr left outer join ing on tr.id=ing.id
id oku id read
--- ----- --- -----
1 Bir 1 One
2 İki 2 Two
3 Üç <NULL> <NULL>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
b.right:
select * from tr right outer join ing on tr.id=ing.id
id oku id read
--- ----- --- -----
<NULL> <NULL> 0 Zero
1 Bir 1 One
2 İki 2 Two
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
c.full:
select * from tr full outer join ing on tr.id=ing.id
id oku id read
--- ----- --- -----
<NULL> <NULL> 0 Zero
1 Bir 1 One
2 İki 2 Two
3 Üç <NULL> <NULL>
__________________________________________________________________________
3.cross:
select * from tr cross join ing
veya select * from tr,ing
id oku id read
--- ----- --- -----
1 Bir 0 Zero
2 İki 0 Zero
3 Üç 0 Zero
1 Bir 1 One
2 İki 1 One
3 Üç 1 One
1 Bir 2 Two
2 İki 2 Two
3 Üç 2 Two

select * from tr cross join ing where tr.id=ing.id
veya select * from tr,ing where tr.id=ing.id (inner join'e göre yavaş)
--- ----- --- -----
1 Bir 1 One
2 İki 2 Two
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla