SQL de join islemlerini daha önceki makalelerimizde anlatmistik. Bu seferki makalemde join islemini resimlerle daha anlasilir hale getirmeye çalisacagim.
Join ile ilgili önceki makalelerimiz:
- Makale 1 : Join Islemi – Inner Join
- Makele 2 : Join Islemi – Outer Join (Left Outer Join, Right Outer Join ve Full Outer Join)
Önceki makalelerde bahsettigimiz gibi join islemi iki veya daha fazla tablodan veri getirme islemi için kullanilir. Veritabanimiz daki her bir tabloyu matematik dersinde gördügümüz kümelere benzetmek yanlis olmaz. Kümeler üzerinde kesisim, birlesim, fark gibi islemleri hatirliyoruzdur. Join islemlerini de matematikteki bu ifadelerle anlatmanin daha anlasilir olacagini düsünüyorum.
INNER JOIN
Inner join her tabloda da ayni olan kayitlari verir. SQL de varsayilan join sekli inner joindir.
select * from Tablo1 t1 inner join Tablo2 t2 on t1.kol1 = t2.kol1
Resimde gördügümüz gibi iner join iki kümenin kesisimini verir. Küme sayisi ikiden büyük olabilir.
OUTER JOIN
Outer join iki tablodaki iliskili olmayan kayitlari da döndürmemizi saglar. Outer join isleminin 3 farkli çesidi vardir.
Left Outer Join
select * from Tablo1 t1 left outer Tablo2 t2 on t1.kol1 = t2.kol1
Birinci tablodaki tüm kayitlar getirilir, buna karsin ikinci tabloda bu kayitlarla uyusan kayitlarda gelir.
.
Right Outer Join
Ikinci tablodaki tüm kayitlar getirilir, buna karsin birinci tabloda bu kayitlarla uyusan kayitlarda gelir.
select * from Tablo1 t1 right outer Tablo2 t2 on t1.kol1 = t2.kol1
Full Outer Join
Full outer joinde iki tablodaki tüm kayitlar uyussun yada uyusmasin getirilir.
select * from Tablo1 t1 full outer Tablo2 t2 on t1.kol1 = t2.kol1
Ek bilgiler
Outer join kullanarak kolayca yapabilecegiz bazi yöntemleri burada anlatacagim.
a – Iki tablomuz var ve biz birinci tablonun ikinci tablodan farkini almak istiyoruz, yani birinci tabloda olan ama ikinci tabloda olmayan kayitlari alacagiz.
Bunu iki sekilde yapabiliriz.
SELECT t1.* FROM Table1 t1 WHERE t1.ID NOT IN (SELECT t2.ID FROM Table2 t2)
Yukaridaki klasik sorgu kullanimi yerine ayni islemi asagidaki gibi left join ilede yapabiliriz.
SELECT t1.*,t2.* FROM Table1 t1 LEFT OUTER JOIN Table2 t2 ON t1.ID = t2.ID WHERE t2.ID IS NULL
Left outer join ile yazdigimiz sorgunun ilk sorguya göre çok daha hizli çalisacagina emin olabilirsiniz.
Yukaridaki resmi incelersek yazdigimiz sorgunu Tablo1 fark Tablo2 aldigini kolayca görebiliriz.
b – Inner join ile iki kümenin kesisen kismini aldigimiz söylemistik peki iki kümenin kesisen kismi disinda kalan kismi nasil alabiliriz.
SELECT t1.*,t2.* FROM Table1 t1 FULL OUTER JOIN Table2 t2 ON t1.ID = t2.ID WHERE t1.ID is NULL or t2.ID IS NULL.
Sorgu sonucunca asagidaki resimde gösterildigi gibi sonuç döner.
Umarim join isleminin mantigini kafanizda oturtmanizda yardimci olabilmisimdir.
cevap
arkada?lar join server nasyll yapcam sayylar ne? yardym edin
çunku hosting firmalari mssql destekleyen paketlerini pahaliya veriyorlar ve cok az bir alan veriyorlar. ayrica mssql için islemci ve ram kisitini abartiyorlar. buda sorunlara yol aciyor.
kavga etmeyin arkadaslar 🙂
betül hanim, oracle tabiki maliyetlidir. ben projenin büyüklügü ve amacina göre farkli sistemler seçmelisin dyorum. Büyük veriler ve çok fazla transaction gerekli ise SQL Server veya Oracle seçmelisin, tabiki teradata, exadata vb alternatiflerde var. ama genel olarak piyasada sql server veya oracle kullanilir. maliyetten kaçanlar genelde sql servera yönelir. Biz yaklasik 20 tb veriyi sql server 2008 r2 da tutuyor ve yönetiyoruz, o yuzden oracle veya sql server ikiside olur. ama su bir gerçekki, piyasada oracle ci olmak sql ci olmaktan malesef daha degerli.
sen projen hakkinda biraz bahsedersen hangi veritabanini kullanman gerektigi hakkinda konusabiliriz.
mesela ben bu sitede sql server kullaniyorum. ama son zamanlar mysql kullanmadigima pisman oldum, çunku hosting firmalari mssql destekleyen paketlerini pahaliya veriyorlar ve co
Gezgin ‘ bu isi bn 8 senedir yapiyorumm ‘ espiri yapmaya çalistiysan ‘ güLüym boSa gitmesin ‘ faceni ver ‘ ordan anlat derdini ‘ özeLe geL 😀
madem bu kadar biliyosun neden mssql mi yoksa mysql mi diye soruyosun betül hanim ?
kaç senedir bu isiyapiyorsun bnm ofisim var ‘ homeofis ‘
??? msk ordamsn??
oracle mi dalga geçiyon heralde .d maliyeti çok yüksek onun .d msk adin ne ?
veritabanini ne amaçla kullanacagin ve ne kadar boyutta bir veri tutacagina göre degisir. eger bir web sitesi yapacaksan ve ziyaretçi sayisi az olacak ise access kullanabilirsin. fazla ise ama ucuz bir hosting bulmak istiyorsan mysql daha avantajli olur.
Eger bir windows app yazacaksan yine kriterlerine göre bunlardan birini seçebilirsin. fakat proje yaparken kendinide veritabaninda gelistirmek istiyorsan, yarin is hayatinda lazim olacak bir veritabani seçmen senin için daha iyi. bu yüzden sql sever veya oracle seçmeni tavsiye ederim
SELECT Kisiler.adi, Kisiler.soyadi, Telefon.telefonNo, TelefonTuru.adi, Eposta.adi
FROM (TelefonTuru INNER JOIN (Kisiler INNER JOIN Telefon ON Kisiler.id = Telefon.kisiId) ON TelefonTuru.id = Telefon.telefonTuruId) INNER JOIN Eposta ON Kisiler.id = Eposta.kisiId;
Facebook adresimi yaziyorumm ekleyn yardimcii olun ya .(
ya bisey sorcam veri tabanimiçin Mssql mi kullansam yoksa mysqL çok kararsizim 🙁
Ellerine saglik Ustad
Tesekkürler eline saglik gercekten cok güzel anlatilmis 🙂
bu sorgu tum kategorileri getirir yanlarina urun varsa onlari getirir.
onceki sorgu ise tersini yapiyordu. biz demekki yanlis anlasmisiz 🙂
sorun sql cümlesindeymis bazi düzenlemeler yaptim düzeldi
SELECT *, kategori.baslik AS kat_baslik,
kategori.icerik AS kat_icerik
FROM kategori LEFT JOIN urun ON kategori.id=urun.ana_id AND
kategori.lisan="’.ayarlar::L_ID.’" where kategori.id="’.$_GET[‘id’].’"
su sekilde düzenledim
gerekli olan kisima suradan bakabilirsen eger
liste2() fonksiyonu
kategorilerde ürün varsa getiriyor ürün yoksa kategori baslik ve içerigini bos basiyor
mesela orada ürünlere ait test kategorisinin ürün tablosunda kaydi yok ona bakarak anlasilir
liste fonksiyonu düzgün çalisiyor dogru çalisan diye üstte gösterdim
sorunu çözduyseniz problem yok. ama bir yerde yanlis anliyorum ben sanirim. istersen sen bana iki tablonun create ve insert scriptlerini gönder. almak istedigin bilgiyide tam olarak yaz ben deneyeyim.
kodu denedim dedigim gibi çalismiyor, dün geceden beri ugrasiyorum union, full ile ilgili 100 200 tane filan örnek denedim olmadi mecburen iki farkli sorgu ve döngü kullanarak yaptim çok tesekkürler MSK vaktinizi aldim
sorgunda bos gelmesi normal. where kriterinde bos gelenleri eliyorsun cunku
SELECT *, kategori.baslik AS ana_baslik,
kategori.icerik AS ana_icerik
FROM urun
left outer join kategori ON urun.ana_id=kategori.id and kategori.id = $yy$
where urun.lisan=$xx$
seklinde yaz
herhalde ben yanlis yapiyorum a tablosu 2. idi gelmedi bos basiyor
kategori tablosu
->id<- alt_id baslik icerik lisan
urun tablosu
id ->ana_id<- baslik icerik dosya etiket tarih
SELECT *, kategori.baslik AS ana_baslik,
ahmet merhaba
a tablosunu left outer joinle b tablosuna baglarsan a daki 1 ve 2 gelir. ayrica b deki 1 de gelir..
sen sonuc olarak almak istedigin tabloyuda yazarsan onun sorgusunu yazayim ben sana
soruyu düzenledim tekrar gönderdim spam yapiyormusum gibi oldu ama kusura bakmayin textarea da karakter sinirlamasi var sanirim o fazla mesajlari siliverirseniz sevinirim iyi çalismalar
full outer joinle veri almam gerekli asagidaki a tablosunun 2 nolu id in karsiligi eslesmedigi için 2 nolu idi left ve right joinle hiç basmiyor o yüzden full outer join kullanmam gerek yukaridaki kod ve baska kodlar da denedim çalismiyor mysql 5.5 versiyonla ilgisi olabilirmi yada asagidaki tabloya göre düzenlenmis örnek sql cümlesini yazabilirmisiniz
a tablosu
id baslik icerik
1 a b
2 c d
b tablosu
id baslik icerik
1 a b
null
ahmet soruyu yazmamissin.
benim söyle bir sorunum var ama yardimci olabilirseniz sevinirim
Çok çok çok mantikli açiklamalarla anlatilmis, bravo
1. tablona t1 2 tablona t2 takma adini ver, yani, spnra t1.id_baslik ve t2.id_baslik oalrak kullan
yani,
select t1.idbaslik as id_baslik_1, t2.id_baslik as idbaslik_2 from tablo1 as t1,tablo2 as t2
tesekkürler çok faydali bir yazi fakat benim bir sorum var
farkli iki tabloda ayni isme sahip sutun var bunlari birbirinden ayiramadim
a tablosu id baslik b tablosu a_id baslik
bu iki ayni sutunu birbirinden ayirip nasil alabilirim yani bir çok sekil denedim fakat ya a tablosundaki basligi aliyorum yada b tablosunun basligini ikisini ayni anda alamiyorum
Valla eyvallah dostum ellerine saglik tek seferde anladim.Gayet sade ve anlasilir olmus eline koluna saglik…
Çok anlasilir olmus. Elinize kolunuza emeginize saglik. Çok basarili..
Çok güzel anlatmisniniz tesekkürler
Gece kod yazarken bir noktada takili kaldim. Ve sikinti basti biraktim gitttim. Ama ne çare.. Bu sefer uyku tutmadi.. Sabri abinin bu makalesi yetisti imdadima.. Tesekkürler Abi
yazilan en iyi türkçe join makalesidir bu
Bravo Tebrik Ederim Çok Iyi Bir Anlatim….
hmm. anladim abi, çok sagol.
bu durumda önce bir join yapip ilk iki tablonu baglayacaksin sonra ardindan 3. tabloyu yine join ile baglayacasin.
select * from Tablo1
left join Tablo2 on tablo1.X = Tablo2.X
left join Tablo3 on tablo2.Y = Tablo3.Y
gibi
Sabri abi yine her zaman ki gibi çok güzel anlatmissin, çok tesekkür ederim.
Bir sorum var:
Left ve Right Outer Join islemleri birinci ve ikinci tablodaki kayitlari getiriyordu. bu iki tane tablo bulunan bir veritabaninda kullaniliyor.
Peki ya benim 2 den fazla tablom varsa ne olcak ? 🙂
Çok tesekkür ederim.
karmasa yasadigim bir konu çok iyi bir sekilde kafamda çözüldü.
Süper, Tebrikler,,
Ancak bukadar açik ve anlasilir olur tesekkürler
gürkan bey mantik olarak zorlandigim bir konuydu çok açik anlatmissiniz çok tesekkürler
Anlatim gayet basarili, tebrikler…