SQL join query nasıl çalışır?

Başlatan mir_as82, 30 Mayıs 2018, 04:06:43

mir_as82

Aşağıda verdiğim query nin açıklaması nasıldır? Önce iki tabloyu birleştirir sonra birinci T1 update mi edilir?
Birde neden join yaptık? Bunun where ile çözülebileceğini biliyorum.
Join ile yapılmasının arka plandaki esprisi nedir?

UPDATE
    T1
SET
    T1.Inci = T2.Inci
FROM
    T1
INNER JOIN
    T2
ON
    T1.Brands = T2.Brands
AND
    T1.Category= T2.Category
AND
    T1.Date = T2.Date

tunayk

Evet,  join ile kriterleri sağlayan tablo satırları seçilmiş ve  T1 in ilgili satırları update edilmiş oluyor.

İki ayrı tablodan veri çekip bu verilerden eşleşenleri seçip bu satırlara update yapmak için Where uygun bir komut değil. Where genel olarak aynı tablo üzerindeki işlemlerde kullanışlıdır. İki tablo için yolunuz zaten joine düşecek, bu durumda where in görevini basitçe join şartında tanımlamış oluyorsunuz. Aynı işi where ile yapayım derseniz çok daha fazla uğraşmanız gerekecektir.

mir_as82

Yani şöyle diyebilir miyiz?
ON şartını sağlayan T1 ve T2 satırları işaretlenir, daha sonra bu şartları sağlayan T2 nin Inci kolonunun kayıtları sıralı olarak, T1 in Inci kolonunun kayıtlarına yazılır?


mufitsozen

#3
Alıntı yapılan: mir_as82 - 30 Mayıs 2018, 19:58:27Yani şöyle diyebilir miyiz?

Sayin @mir_as82 , canim kardesim noolur calistigin konularda bir kitap alip TOC'a (icindekiler) bi bak en azindan.

Benim bildigim butun SQL'lerde EXPLAIN diye bir komut vardir, verilen select cumlesinin nasil calisacagini gosteren ve performans ve diger birtakim sikintilari production'a koymadan denemeni saglayan.

Bu ve buna benzer diger araclari biraz ogrenirsen en azindan basit seylerde vakit kaybetmezsin.

Allah kolaylik versin.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

tunayk


mir_as82

Hocam sizin basit dediğiniz şey aslında %90 oranında insanların alıp ezbere yaptığı şeyler bence.
Karenin alanı da basit değil mi? Al en ile boyu çarp sonucu bul söyle : )). Ama neden çarpıyoruz sorusunun cevabını özümsemek zor olan.
Ben syntax derdinde değilim, işin semantiği derdindeyim.

JKramer

https://www.w3schools.com/sql/sql_join_inner.asp

Sitede örneği deneyebiliyorsunuz. Ayrıca statement'ı değiştirip farklı denemeler de yapabiliyorsunuz.

mufitsozen

#7
Alıntı yapılan: mir_as82 - 31 Mayıs 2018, 04:27:46Hocam sizin basit dediğiniz şey aslında %90 oranında insanların alıp ezbere yaptığı şeyler bence.
Karenin alanı da basit değil mi? Al en ile boyu çarp sonucu bul söyle : )). Ama neden çarpıyoruz sorusunun cevabını özümsemek zor olan.
Ben syntax derdinde değilim, işin semantiği derdindeyim.

Bende onu soyluyorum. SQLde zaten iki elin parmaklari kadar komut var. Bu dili icat edenler kullananlara eziyet olsun diye yapmamis. Ustelik Date ve Codd'un 1980lerde RDB kurallarini belirlediginden beri SQL'in calismasi matematiksel olarak anlasilabiliyor.

Simdi senin gibi milyonlarca kullanici bu dile hakim olmayi ogrenmeye calisirken ayni sikintilari yasiyor. O yuzden dile EXAMINE diye bir komut eklemisler RDB sana verecegin ornek query'i database schema (keyler vb) nasil cozecegini soyluyor ki, sende ona gore normalizasyon vb yaparak performansi gelistirebilesin.

Ayrica her RDB engine yapan firma, DBAlere ozel toollar tanimliyor ki, bunlari ayri ekrandan yapip RDB engine SQLi nasil isliyor gosteriyor, boylece senin debug etmeni kolaylastiriyor.

MS SQL Serverda da boyle araclar fazlasi ile var.

Ama ben sana generic olarak SQL EXAMINE komutu ile anlamaya calistigin bir suru seyi anlayabilecegini soyluyorum. Bu komut zaten RDB engine verdigin komutu nasil cozecek onu sana geri soyluyor.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

boreas

Senin sıkıntın anladığım kadarıyla veritabanı, ilişkisel veri saklama konularında bilgi yetersizliğinden. Şöyle düşün bir kayıt yapıyorsun. Adamın adını soyadını adresini telefonunu gireceksin. Adamın 3 farklı adresi var 3 farklıda telefonu. Bu kaydı nasıl yaparsın ? Eski nesillerde böyle bir kayıt ya yapamazdın ya da aynı kaydı tekrarlardın her telefon ve adres için kayıt girerdin ya da rastgele eşleştirirdin buda bilginin güvensiz olmasını sağlardı. İlişkisel veritabanında tekbir veri (field) haricinde her kayıtta tekrar eden bir bilgi varsa bu sakat bir kayıttır. Bu bilgi arttıkça sakatlıkda artar. Yapılması gereken adama bir ID verirsin adını soyadı bir tabloda. Aynı id ile telefonları farklı bir tabloda, aynı id ile adresleri farklı bir tabloda toplarsın. Bilgiyi bölersin tek ortak kısım id olur. Buda sorgunu hızlandırır, kaydını kolaylaştırır. Peki sana bir sorgu geldi ahmet köse'nin telefonları ne ? Telefon tablosunda ahmet köse diye bir isim yok sadece id var. İster istemez isim tablosunda ahmet köseyi aratır id. yi alır bu id yi telefon tablosunda tekrar sorgulatırsın. Bunu ister where içinde select kullanarak yap ister join ile. Fark var mı hemde nasıl :)
Fark şu where içinde sorgu yaparken telefon tablosunun tamamı gelir ve her kayıt için tek tek isim sorgusu yapılır. Join ile yaptığında ise önce join koşullarına bakılır ve ona uyan telefon kayıtları gelir.
10000 numaradaki her numara için isim sorgusu yapmak var birde ismi sorulan kaydın telefonlarını getirmek var.

Bu cambazlıkların tamamı performansla alakalı bazı yerlerde kaçınılmaz olur kullanırsın, bazı yerlerde daha verimlide olur. Ama performans, kodun okunabilirliği bunlar çok önemli. 3 yıl sonra koda bakınca ulan ben bunu neden böyle yaptım dememen lazım.