[]
SQL joinler
Merhaba. Uzun zamandir aktif olmasa da isimde Sql’i kullaniyorum, sorgu revize edebiliyorum ama yeni sorgu yazamam. Simdi join’leri teorik olarak biliyorum ama is pratige gelince o kadar karisiyor ki. Hangi join’i nerede kullanacagim bilemiyorum. Ayrica birden cok join kullanilan ornekleri de goruyorum onu da pratige gelince yapamiyorum.
Mesea cusid ortak kolon olan 2 tablo olsun x ve y diyelim. y tablosundaki sehir bilgisini x’e getirmek istiyorum. Sehir gelsin istedigim icin select * from x right join y on y.cusId=x.cusId olmali? Yoksa left join mi olmali :( pratik yapacagim kaynak ne olabilir. Teorigini istemiyorum cunku o kadar cok kaynaktan calistim ki artik teoriye ihtiyacim yok sadece pratik icin nasil calismaliyim?
Mesea cusid ortak kolon olan 2 tablo olsun x ve y diyelim. y tablosundaki sehir bilgisini x’e getirmek istiyorum. Sehir gelsin istedigim icin select * from x right join y on y.cusId=x.cusId olmali? Yoksa left join mi olmali :( pratik yapacagim kaynak ne olabilir. Teorigini istemiyorum cunku o kadar cok kaynaktan calistim ki artik teoriye ihtiyacim yok sadece pratik icin nasil calismaliyim?
x tablosundan, y tablosuyla cusId değeri üzerinden eşleşemeyecek kayıtların gelmesini istemiyorsan inner join, eşleşmese de data gelsin diyosan left join, özünde bu aslında. ben daha right join'i gerçek hayatta kullanan kimseyi görmedim.
- tepedeki psychedelic adam (22.10.21 20:00:01 ~ 20:00:51)
select
x.*,
y.sehir
from x
left join y on x.cusid=y.cusid
right join kullanılmaz genelde.
x.*,
y.sehir
from x
left join y on x.cusid=y.cusid
right join kullanılmaz genelde.
- makarnavodka (22.10.21 21:52:27)
Valla w3schools da falan pratik yapabilirsin sanirim. Olmadi kendi kendine tablolar yapip onlarla da oynayabilirsin.
- j r r tolkien hayrani (22.10.21 21:56:30)
Yukarıdaki yazarların tamamı olayı doğru olarak anlatmış ben de ayrıntı vererek anlatayım.
INNER JOIN ile iki tabloyu ortak bir key ile birbirine bağladığında, ortak keyin refere ettiği verinin her iki tabloda da bulunması gerekiyor, yani şöyle :
uyeler ve sehirler diye tablomuz var
select * from uyeler INNER JOIN sehirler on sehirler.sehir_id = uye_sehir_id;
yukarıdaki örnekte uyeler tablosundaki sehir_id ile sehirler tablosundaki sehir_id ortak ve sehirler tablosunda o uyenin sehir id'si var ise bir kayıt döner sehir_id sehirler tablosunda yoksa uye olsa bile kayıt döndürmez.
Şimdi başka bir örnek verelim yine bir üyeler tablomuz var bir de kardeşler tablomuz olsun, aynı şekilde INNER JOIN kullanacak olursan kardeşi olmayan üyeler bu sorguda hiç dönmezdi o yüzden ne yapıyoruz INNER JOIN yerine LEFT JOIN kullanıyoruz.
select * from uyeler LEFT JOIN kardesler on kardesler.kardes_uye_id = uye_id;
Gördüğün gibi artık tüm üyeler kardeşi olsun olmasın listelenir, eğer kardeşi yoksa tek satır kayıt gelir 2 kardeşi varsa 2 satır kayıt gelir, bir kardeşi varsa yine tek satır kayıt döner.
RIGHT JOIN'e gelince kullanımı mantıksız olduğundan pek kullanılmaz, RIGHT'da önemli olan refere edilen tablonun kendisi select çekilen değil o yüzden kullanımını gerektirecek bir senaryo neredeyse yoktur.
INNER JOIN ile iki tabloyu ortak bir key ile birbirine bağladığında, ortak keyin refere ettiği verinin her iki tabloda da bulunması gerekiyor, yani şöyle :
uyeler ve sehirler diye tablomuz var
select * from uyeler INNER JOIN sehirler on sehirler.sehir_id = uye_sehir_id;
yukarıdaki örnekte uyeler tablosundaki sehir_id ile sehirler tablosundaki sehir_id ortak ve sehirler tablosunda o uyenin sehir id'si var ise bir kayıt döner sehir_id sehirler tablosunda yoksa uye olsa bile kayıt döndürmez.
Şimdi başka bir örnek verelim yine bir üyeler tablomuz var bir de kardeşler tablomuz olsun, aynı şekilde INNER JOIN kullanacak olursan kardeşi olmayan üyeler bu sorguda hiç dönmezdi o yüzden ne yapıyoruz INNER JOIN yerine LEFT JOIN kullanıyoruz.
select * from uyeler LEFT JOIN kardesler on kardesler.kardes_uye_id = uye_id;
Gördüğün gibi artık tüm üyeler kardeşi olsun olmasın listelenir, eğer kardeşi yoksa tek satır kayıt gelir 2 kardeşi varsa 2 satır kayıt gelir, bir kardeşi varsa yine tek satır kayıt döner.
RIGHT JOIN'e gelince kullanımı mantıksız olduğundan pek kullanılmaz, RIGHT'da önemli olan refere edilen tablonun kendisi select çekilen değil o yüzden kullanımını gerektirecek bir senaryo neredeyse yoktur.
- solo (23.10.21 10:44:14 ~ 10:44:33)
Duyuruda kullanıcılar ve duyurular tablosu olsun.
Sadece en az 1 duyuru açmış kullanıcıları, duyurularıyla beraber getirmek istiyorsan INNER JOIN, "duyurusu varsa duyuruyu da getir, yoksa duyurusuz gelsin" diyorsan da LEFT JOIN kullanıyorsun.
E peki ya duyuruyu açan hesap silinmişse? Kullanıcı silindiği için o duyuruya kullanıcı tablosu üzerinden ulaşamazsın. O zaman RIGHT JOIN, kullanıcısı olmasa bile tüm duyurular gelsin diyor.
Bi de OUTER JOIN var, hem duyuru hem kullanıcı hepsini kombinle getir abi diyorsun.
RIGHT JOIN'in çok kullanılmama sebebi şu, madem duyurunun kullanıcısı yok, o zaman niye kullanıcı tablosu üzerinden ulaşmaya çalışayım ki o duyuruya? Direkt gider duyuru tablosuna sorgu atarım diyor insanlar. Kullanıcı bilgilerini de duyuru üzerinden LEFT JOIN ile kullanıcıya ulaşarak hallediyorlar.
Nasıl oturur bunlar? Valla bence pratikten başka yolu yok. Kendin database tasarla, sorguları yaz. Hackerrank'in SQL şeyi de fena değil: www.hackerrank.com
Sadece en az 1 duyuru açmış kullanıcıları, duyurularıyla beraber getirmek istiyorsan INNER JOIN, "duyurusu varsa duyuruyu da getir, yoksa duyurusuz gelsin" diyorsan da LEFT JOIN kullanıyorsun.
E peki ya duyuruyu açan hesap silinmişse? Kullanıcı silindiği için o duyuruya kullanıcı tablosu üzerinden ulaşamazsın. O zaman RIGHT JOIN, kullanıcısı olmasa bile tüm duyurular gelsin diyor.
Bi de OUTER JOIN var, hem duyuru hem kullanıcı hepsini kombinle getir abi diyorsun.
RIGHT JOIN'in çok kullanılmama sebebi şu, madem duyurunun kullanıcısı yok, o zaman niye kullanıcı tablosu üzerinden ulaşmaya çalışayım ki o duyuruya? Direkt gider duyuru tablosuna sorgu atarım diyor insanlar. Kullanıcı bilgilerini de duyuru üzerinden LEFT JOIN ile kullanıcıya ulaşarak hallediyorlar.
Nasıl oturur bunlar? Valla bence pratikten başka yolu yok. Kendin database tasarla, sorguları yaz. Hackerrank'in SQL şeyi de fena değil: www.hackerrank.com
- plutongezegendegilmi (23.10.21 11:17:12)
1