{"id":33844,"date":"2025-11-07T21:40:50","date_gmt":"2025-11-07T18:40:50","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33844"},"modified":"2025-11-07T21:40:50","modified_gmt":"2025-11-07T18:40:50","slug":"sqlde-join-kullanimi-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/","title":{"rendered":"SQL&#8217;de JOIN Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>SQL&#8217;de JOIN Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber<\/h2>\n<p>\u0130li\u015fkisel veritaban\u0131 y\u00f6netim sistemlerinin (RDBMS) temel ta\u015flar\u0131ndan biri olan SQL (Structured Query Language), verileri depolamak, y\u00f6netmek ve sorgulamak i\u00e7in kullan\u0131l\u0131r. Ancak ger\u00e7ek d\u00fcnya senaryolar\u0131nda veriler genellikle tek bir b\u00fcy\u00fck tabloda de\u011fil, birbirleriyle ili\u015fkili birden fazla k\u00fc\u00e7\u00fck tabloda saklan\u0131r. \u00d6rne\u011fin, bir e-ticaret uygulamas\u0131nda m\u00fc\u015fteri bilgileri bir tabloda, sipari\u015f bilgileri ba\u015fka bir tabloda ve \u00fcr\u00fcn bilgileri bamba\u015fka bir tabloda tutulabilir. Bu tablolar aras\u0131ndaki ili\u015fkiler, veritaban\u0131n\u0131n b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flar ve veri tekrar\u0131n\u0131 \u00f6nler. \u0130\u015fte bu noktada, farkl\u0131 tablolarda saklanan verileri bir araya getirerek anlaml\u0131 sonu\u00e7lar elde etmemizi sa\u011flayan SQL JOIN i\u015flemleri devreye girer.<\/p>\n<p>JOIN&#8217;ler, ili\u015fkisel veritabanlar\u0131n\u0131n g\u00fcc\u00fcn\u00fc tam anlam\u0131yla ortaya koyan, en s\u0131k kullan\u0131lan ve en kritik SQL komutlar\u0131ndan biridir. \u0130ki veya daha fazla tablodaki sat\u0131rlar\u0131, aralar\u0131ndaki ilgili s\u00fctunlardaki de\u011ferlere g\u00f6re birle\u015ftirmek i\u00e7in kullan\u0131l\u0131rlar. Do\u011fru JOIN t\u00fcr\u00fcn\u00fc ve ko\u015fullar\u0131n\u0131 se\u00e7mek, hem do\u011fru sonu\u00e7lar\u0131 elde etmek hem de sorgu performans\u0131n\u0131 optimize etmek a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir. Bu kapsaml\u0131 rehberde, SQL JOIN&#8217;lar\u0131n ne oldu\u011funu, farkl\u0131 JOIN t\u00fcrlerini, her birinin ne zaman ve nas\u0131l kullan\u0131laca\u011f\u0131n\u0131, s\u00f6zdizimini, performans ipu\u00e7lar\u0131n\u0131 ve s\u0131k yap\u0131lan hatalar\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>JOIN Nedir ve Neden Kullan\u0131l\u0131r?<\/h3>\n<p>Bir veritaban\u0131nda, veriler genellikle &#8220;normalizasyon&#8221; ad\u0131 verilen bir s\u00fcre\u00e7le d\u00fczenlenir. Normalizasyon, veri tekrar\u0131n\u0131 en aza indirmeyi, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamay\u0131 ve veritaban\u0131n\u0131n esnekli\u011fini art\u0131rmay\u0131 hedefler. Bu s\u00fcre\u00e7 sonucunda, birbiriyle ili\u015fkili veriler farkl\u0131 tablolara da\u011f\u0131t\u0131l\u0131r. \u00d6rne\u011fin, bir &#8220;M\u00fc\u015fteriler&#8221; tablosu (M\u00fc\u015fteriID, Ad, Soyad, Adres) ve bir &#8220;Sipari\u015fler&#8221; tablosu (Sipari\u015fID, M\u00fc\u015fteriID, Sipari\u015fTarihi, ToplamTutar) olabilir. Bu iki tablo, &#8220;M\u00fc\u015fteriID&#8221; s\u00fctunu arac\u0131l\u0131\u011f\u0131yla ili\u015fkilidir.<\/p>\n<p>E\u011fer bir m\u00fc\u015fterinin ad\u0131n\u0131 ve soyad\u0131n\u0131, o m\u00fc\u015fterinin verdi\u011fi sipari\u015flerle birlikte g\u00f6rmek istersek, bu iki tabloyu birle\u015ftirmemiz gerekir. \u0130\u015fte tam bu noktada JOIN&#8217;ler devreye girer. JOIN, bir veya daha fazla tablodan ilgili s\u00fctunlar\u0131, belirli bir ko\u015fula (genellikle tablolar aras\u0131ndaki birincil anahtar-yabanc\u0131 anahtar ili\u015fkisi) g\u00f6re birle\u015ftirerek tek bir sonu\u00e7 k\u00fcmesi olu\u015fturur.<\/p>\n<p>JOIN kullanman\u0131n temel nedenleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Veri Birle\u015ftirme:<\/strong> Farkl\u0131 tablolarda saklanan ili\u015fkili verileri tek bir sorguda bir araya getirmek.<\/li>\n<li><strong>Kapsaml\u0131 Raporlama:<\/strong> Birden fazla veri kayna\u011f\u0131ndan bilgi \u00e7ekerek daha anlaml\u0131 ve detayl\u0131 raporlar olu\u015fturmak.<\/li>\n<li><strong>Veri B\u00fct\u00fcnl\u00fc\u011f\u00fc:<\/strong> \u0130li\u015fkisel modelin sundu\u011fu veri b\u00fct\u00fcnl\u00fc\u011f\u00fc avantajlar\u0131ndan faydalan\u0131rken, bu verileri kolayca sorgulayabilmek.<\/li>\n<li><strong>Veri Tekrar\u0131n\u0131 \u00d6nleme:<\/strong> Normalizasyonun getirdi\u011fi avantajlar\u0131 koruyarak, verileri ihtiya\u00e7 duyuldu\u011funda dinamik olarak birle\u015ftirmek.<\/li>\n<\/ul>\n<h3>SQL JOIN T\u00fcrleri<\/h3>\n<p>SQL&#8217;de farkl\u0131 ihtiya\u00e7lara y\u00f6nelik \u00e7e\u015fitli JOIN t\u00fcrleri bulunur. Her bir JOIN t\u00fcr\u00fc, tablolar aras\u0131ndaki e\u015fle\u015fen ve e\u015fle\u015fmeyen kay\u0131tlar\u0131 farkl\u0131 \u015fekillerde ele al\u0131r. Temel JOIN t\u00fcrleri \u015funlard\u0131r:<\/p>\n<ol>\n<li>INNER JOIN<\/li>\n<li>LEFT JOIN (LEFT OUTER JOIN)<\/li>\n<li>RIGHT JOIN (RIGHT OUTER JOIN)<\/li>\n<li>FULL JOIN (FULL OUTER JOIN)<\/li>\n<li>CROSS JOIN<\/li>\n<li>SELF JOIN (\u00f6zel bir kullan\u0131m durumu)<\/li>\n<\/ol>\n<p>Bu JOIN t\u00fcrlerini daha detayl\u0131 incelemeden \u00f6nce, genel JOIN s\u00f6zdizimine bir g\u00f6z atal\u0131m:<\/p>\n<pre><code>SELECT column1, column2, ...\nFROM TableA\nJOIN_TYPE TableB\nON TableA.matching_column = TableB.matching_column;<\/code><\/pre>\n<p>Burada <code>JOIN_TYPE<\/code> yerine yukar\u0131da belirtilen JOIN t\u00fcrlerinden biri gelir. <code>ON<\/code> anahtar kelimesi ise birle\u015ftirme ko\u015fulunu belirtir. Bu ko\u015ful, iki tablonun hangi s\u00fctunlar \u00fczerinden ili\u015fkilendirilece\u011fini ifade eder.<\/p>\n<h3>INNER JOIN<\/h3>\n<h4>Tan\u0131m ve Kullan\u0131m<\/h4>\n<p>INNER JOIN, en yayg\u0131n kullan\u0131lan JOIN t\u00fcr\u00fcd\u00fcr. \u0130ki tabloda da e\u015fle\u015fen kay\u0131tlara sahip olan sat\u0131rlar\u0131 birle\u015ftirir. E\u011fer bir tabloda e\u015fle\u015fen bir kay\u0131t yoksa, o kay\u0131t sonu\u00e7 k\u00fcmesinde yer almaz. Venn \u015femas\u0131 benzetmesiyle, iki k\u00fcmenin kesi\u015fimini temsil eder.<\/p>\n<h4>\u00d6rnek Senaryo<\/h4>\n<p>Bir e-ticaret veritaban\u0131nda, &#8220;M\u00fc\u015fteriler&#8221; tablosu ve &#8220;Sipari\u015fler&#8221; tablosu oldu\u011funu varsayal\u0131m. M\u00fc\u015fteriler tablosunda t\u00fcm m\u00fc\u015fteri bilgileri, Sipari\u015fler tablosunda ise t\u00fcm sipari\u015f bilgileri yer al\u0131yor. Her sipari\u015fin hangi m\u00fc\u015fteriye ait oldu\u011funu belirten bir <code>MusteriID<\/code> s\u00fctunu Sipari\u015fler tablosunda mevcut. E\u011fer sadece sipari\u015f vermi\u015f m\u00fc\u015fterilerin adlar\u0131n\u0131 ve sipari\u015f detaylar\u0131n\u0131 g\u00f6rmek istiyorsak, INNER JOIN kullan\u0131r\u0131z.<\/p>\n<h4>SQL Kodu \u00d6rne\u011fi<\/h4>\n<p>A\u015fa\u011f\u0131daki \u00f6rnekte, <code>Musteriler<\/code> ve <code>Siparisler<\/code> tablolar\u0131n\u0131 <code>MusteriID<\/code> s\u00fctunu \u00fczerinden INNER JOIN ile birle\u015ftiriyoruz:<\/p>\n<pre><code>SELECT\n    M.MusteriAd,\n    M.MusteriSoyad,\n    S.SiparisID,\n    S.SiparisTarihi,\n    S.ToplamTutar\nFROM\n    Musteriler AS M\nINNER JOIN\n    Siparisler AS S ON M.MusteriID = S.MusteriID;<\/code><\/pre>\n<p>Bu sorgu, hem <code>Musteriler<\/code> tablosunda hem de <code>Siparisler<\/code> tablosunda <code>MusteriID<\/code> de\u011feri e\u015fle\u015fen t\u00fcm sat\u0131rlar\u0131 getirir. Yani, sadece sipari\u015f vermi\u015f m\u00fc\u015fterilerin bilgileri ve bu m\u00fc\u015fterilere ait sipari\u015f bilgileri listelenir. Hen\u00fcz hi\u00e7 sipari\u015f vermemi\u015f m\u00fc\u015fteriler veya m\u00fc\u015fterisi olmayan sipari\u015fler (ki bu genellikle veritaban\u0131 b\u00fct\u00fcnl\u00fc\u011f\u00fc nedeniyle olmamal\u0131d\u0131r) sonu\u00e7 k\u00fcmesinde yer almaz.<\/p>\n<h3>LEFT JOIN (LEFT OUTER JOIN)<\/h3>\n<h4>Tan\u0131m ve Kullan\u0131m<\/h4>\n<p>LEFT JOIN (veya LEFT OUTER JOIN), sol taraftaki tablodan (FROM anahtar kelimesinden sonra belirtilen ilk tablo) t\u00fcm kay\u0131tlar\u0131 ve sa\u011f taraftaki tablodan (JOIN anahtar kelimesinden sonra belirtilen ikinci tablo) e\u015fle\u015fen kay\u0131tlar\u0131 getirir. E\u011fer sa\u011f tabloda sol tablodaki bir kay\u0131t i\u00e7in e\u015fle\u015fen bir de\u011fer yoksa, sa\u011f tablonun s\u00fctunlar\u0131 i\u00e7in <code>NULL<\/code> de\u011ferleri d\u00f6nd\u00fcr\u00fcl\u00fcr. Venn \u015femas\u0131 benzetmesiyle, sol k\u00fcmenin tamam\u0131 ve sa\u011f k\u00fcme ile olan kesi\u015fimi temsil eder.<\/p>\n<h4>\u00d6rnek Senaryo<\/h4>\n<p>Yine &#8220;M\u00fc\u015fteriler&#8221; ve &#8220;Sipari\u015fler&#8221; tablolar\u0131n\u0131 ele alal\u0131m. Bu kez, t\u00fcm m\u00fc\u015fterilerin listesini g\u00f6rmek istiyoruz, sipari\u015f vermi\u015f olsunlar veya olmas\u0131nlar. E\u011fer bir m\u00fc\u015fteri sipari\u015f vermi\u015fse, sipari\u015f detaylar\u0131n\u0131 da g\u00f6rmek istiyoruz; vermemi\u015fse, o m\u00fc\u015fterinin bilgileri yine de listelenmeli ve sipari\u015f detaylar\u0131 k\u0131sm\u0131 bo\u015f (NULL) kalmal\u0131. Bu senaryo i\u00e7in LEFT JOIN idealdir.<\/p>\n<h4>SQL Kodu \u00d6rne\u011fi<\/h4>\n<pre><code>SELECT\n    M.MusteriAd,\n    M.MusteriSoyad,\n    S.SiparisID,\n    S.SiparisTarihi,\n    S.ToplamTutar\nFROM\n    Musteriler AS M\nLEFT JOIN\n    Siparisler AS S ON M.MusteriID = S.MusteriID;<\/code><\/pre>\n<p>Bu sorgu, t\u00fcm m\u00fc\u015fterileri listeler. E\u011fer bir m\u00fc\u015fterinin hi\u00e7 sipari\u015fi yoksa, <code>SiparisID<\/code>, <code>SiparisTarihi<\/code> ve <code>ToplamTutar<\/code> s\u00fctunlar\u0131nda <code>NULL<\/code> de\u011ferler g\u00f6r\u00fcn\u00fcr. Bu, hangi m\u00fc\u015fterilerin hen\u00fcz hi\u00e7 sipari\u015f vermedi\u011fini kolayca tespit etmek i\u00e7in de kullan\u0131labilir:<\/p>\n<pre><code>SELECT\n    M.MusteriAd,\n    M.MusteriSoyad\nFROM\n    Musteriler AS M\nLEFT JOIN\n    Siparisler AS S ON M.MusteriID = S.MusteriID\nWHERE\n    S.SiparisID IS NULL; -- Hi\u00e7 sipari\u015f vermemi\u015f m\u00fc\u015fterileri bulur<\/code><\/pre>\n<h3>RIGHT JOIN (RIGHT OUTER JOIN)<\/h3>\n<h4>Tan\u0131m ve Kullan\u0131m<\/h4>\n<p>RIGHT JOIN (veya RIGHT OUTER JOIN), LEFT JOIN&#8217;in simetri\u011fidir. Sa\u011f taraftaki tablodan (JOIN anahtar kelimesinden sonra belirtilen ikinci tablo) t\u00fcm kay\u0131tlar\u0131 ve sol taraftaki tablodan (FROM anahtar kelimesinden sonra belirtilen ilk tablo) e\u015fle\u015fen kay\u0131tlar\u0131 getirir. E\u011fer sol tabloda sa\u011f tablodaki bir kay\u0131t i\u00e7in e\u015fle\u015fen bir de\u011fer yoksa, sol tablonun s\u00fctunlar\u0131 i\u00e7in <code>NULL<\/code> de\u011ferleri d\u00f6nd\u00fcr\u00fcl\u00fcr. Venn \u015femas\u0131 benzetmesiyle, sa\u011f k\u00fcmenin tamam\u0131 ve sol k\u00fcme ile olan kesi\u015fimi temsil eder.<\/p>\n<h4>\u00d6rnek Senaryo<\/h4>\n<p>Bir &#8220;Urunler&#8221; tablosu ve bir &#8220;SiparisDetaylari&#8221; tablosu oldu\u011funu d\u00fc\u015f\u00fcnelim. Sipari\u015fDetaylari tablosunda hangi \u00fcr\u00fcn\u00fcn ka\u00e7 adet sat\u0131ld\u0131\u011f\u0131 bilgisi var. E\u011fer t\u00fcm \u00fcr\u00fcnleri listelemek, sat\u0131lm\u0131\u015f olsunlar veya olmas\u0131nlar, ve sat\u0131lm\u0131\u015flarsa sat\u0131\u015f detaylar\u0131n\u0131 g\u00f6rmek istersek, RIGHT JOIN kullanabiliriz. Bu, hangi \u00fcr\u00fcnlerin hen\u00fcz hi\u00e7 sat\u0131lmad\u0131\u011f\u0131n\u0131 tespit etmek i\u00e7in faydal\u0131 olabilir.<\/p>\n<h4>SQL Kodu \u00d6rne\u011fi<\/h4>\n<pre><code>SELECT\n    U.UrunAd,\n    U.BirimFiyat,\n    SD.SiparisDetayID,\n    SD.Miktar\nFROM\n    SiparisDetaylari AS SD\nRIGHT JOIN\n    Urunler AS U ON SD.UrunID = U.UrunID;<\/code><\/pre>\n<p>Bu sorgu, t\u00fcm \u00fcr\u00fcnleri listeler. E\u011fer bir \u00fcr\u00fcn hi\u00e7 sat\u0131lmam\u0131\u015fsa, <code>SiparisDetayID<\/code> ve <code>Miktar<\/code> s\u00fctunlar\u0131nda <code>NULL<\/code> de\u011ferler g\u00f6r\u00fcn\u00fcr. T\u0131pk\u0131 LEFT JOIN&#8217;de oldu\u011fu gibi, hi\u00e7 sat\u0131lmam\u0131\u015f \u00fcr\u00fcnleri bulmak i\u00e7in <code>WHERE UrunID IS NULL<\/code> (veya sa\u011f tablonun ilgili s\u00fctunu) ko\u015fulu kullan\u0131labilir. Ancak pratik kullan\u0131mda, \u00e7o\u011fu zaman RIGHT JOIN yerine LEFT JOIN tercih edilir ve tablolar\u0131n s\u0131ras\u0131 de\u011fi\u015ftirilerek ayn\u0131 sonuca ula\u015f\u0131l\u0131r, \u00e7\u00fcnk\u00fc LEFT JOIN okumas\u0131 ve anla\u015f\u0131lmas\u0131 genellikle daha kolayd\u0131r.<\/p>\n<h3>FULL JOIN (FULL OUTER JOIN)<\/h3>\n<h4>Tan\u0131m ve Kullan\u0131m<\/h4>\n<p>FULL JOIN (veya FULL OUTER JOIN), her iki tablodan da t\u00fcm kay\u0131tlar\u0131 getirir. E\u011fer bir tabloda di\u011fer tabloda e\u015fle\u015fen bir kay\u0131t yoksa, o tablonun e\u015fle\u015fmeyen s\u00fctunlar\u0131 i\u00e7in <code>NULL<\/code> de\u011ferleri d\u00f6nd\u00fcr\u00fcl\u00fcr. Bu, her iki tablodaki t\u00fcm bilgiyi tek bir sonu\u00e7 k\u00fcmesinde g\u00f6rmek istedi\u011fimizde kullan\u0131\u015fl\u0131d\u0131r. Venn \u015femas\u0131 benzetmesiyle, iki k\u00fcmenin birle\u015fimini (union) temsil eder.<\/p>\n<h4>\u00d6rnek Senaryo<\/h4>\n<p>\u0130ki farkl\u0131 departmanda \u00e7al\u0131\u015fanlar\u0131n listesi oldu\u011funu d\u00fc\u015f\u00fcnelim: &#8220;PazarlamaCalisanlari&#8221; ve &#8220;ITCalisanlari&#8221;. Her iki tabloda da <code>CalisanID<\/code> ve <code>CalisanAd<\/code> s\u00fctunlar\u0131 var. Baz\u0131 \u00e7al\u0131\u015fanlar her iki departmanda da g\u00f6rev al\u0131yor olabilir (e\u015fle\u015fen <code>CalisanID<\/code>), baz\u0131lar\u0131 sadece Pazarlama&#8217;da, baz\u0131lar\u0131 ise sadece IT&#8217;de. Her iki departmandaki t\u00fcm \u00e7al\u0131\u015fanlar\u0131 ve varsa di\u011fer departmandaki kar\u015f\u0131l\u0131klar\u0131n\u0131 g\u00f6rmek i\u00e7in FULL JOIN kullan\u0131r\u0131z.<\/p>\n<h4>SQL Kodu \u00d6rne\u011fi<\/h4>\n<pre><code>SELECT\n    PC.CalisanID AS PazarlamaCalisanID,\n    PC.CalisanAd AS PazarlamaCalisanAd,\n    ITC.CalisanID AS ITCalisanID,\n    ITC.CalisanAd AS ITCalisanAd\nFROM\n    PazarlamaCalisanlari AS PC\nFULL JOIN\n    ITCalisanlari AS ITC ON PC.CalisanID = ITC.CalisanID;<\/code><\/pre>\n<p>Bu sorgu, Pazarlama&#8217;daki t\u00fcm \u00e7al\u0131\u015fanlar\u0131, IT&#8217;deki t\u00fcm \u00e7al\u0131\u015fanlar\u0131 ve her iki departmanda da olan \u00e7al\u0131\u015fanlar\u0131 listeler. E\u011fer bir \u00e7al\u0131\u015fan sadece Pazarlama&#8217;daysa, <code>ITCalisanID<\/code> ve <code>ITCalisanAd<\/code> s\u00fctunlar\u0131 <code>NULL<\/code> olur. Benzer \u015fekilde, sadece IT&#8217;de olanlar i\u00e7in <code>PazarlamaCalisanID<\/code> ve <code>PazarlamaCalisanAd<\/code> s\u00fctunlar\u0131 <code>NULL<\/code> olur. <code>COALESCE<\/code> fonksiyonu, <code>NULL<\/code> de\u011ferleri olan s\u00fctunlardan ilk <code>NULL<\/code> olmayan de\u011feri se\u00e7mek i\u00e7in s\u0131kl\u0131kla FULL JOIN ile birlikte kullan\u0131l\u0131r, b\u00f6ylece daha temiz bir sonu\u00e7 k\u00fcmesi elde edilebilir:<\/p>\n<pre><code>SELECT\n    COALESCE(PC.CalisanID, ITC.CalisanID) AS CalisanID,\n    COALESCE(PC.CalisanAd, ITC.CalisanAd) AS CalisanAd,\n    CASE WHEN PC.CalisanID IS NOT NULL THEN 'Pazarlama' ELSE NULL END AS PazarlamaDurumu,\n    CASE WHEN ITC.CalisanID IS NOT NULL THEN 'IT' ELSE NULL END AS ITDurumu\nFROM\n    PazarlamaCalisanlari AS PC\nFULL JOIN\n    ITCalisanlari AS ITC ON PC.CalisanID = ITC.CalisanID;<\/code><\/pre>\n<h3>CROSS JOIN<\/h3>\n<h4>Tan\u0131m ve Kullan\u0131m<\/h4>\n<p>CROSS JOIN, iki tablodaki t\u00fcm sat\u0131rlar\u0131n olas\u0131 her kombinasyonunu (Kartezyen \u00e7arp\u0131m) olu\u015fturur. Birle\u015ftirme ko\u015fulu belirtilmez. Sonu\u00e7 k\u00fcmesindeki sat\u0131r say\u0131s\u0131, ilk tablonun sat\u0131r say\u0131s\u0131 ile ikinci tablonun sat\u0131r say\u0131s\u0131n\u0131n \u00e7arp\u0131m\u0131na e\u015fittir. Genellikle dikkatli kullan\u0131lmal\u0131d\u0131r, \u00e7\u00fcnk\u00fc b\u00fcy\u00fck tablolarla kullan\u0131ld\u0131\u011f\u0131nda \u00e7ok b\u00fcy\u00fck sonu\u00e7 k\u00fcmeleri \u00fcretebilir.<\/p>\n<h4>\u00d6rnek Senaryo<\/h4>\n<p>Bir &#8220;Renkler&#8221; tablosu (K\u0131rm\u0131z\u0131, Mavi, Ye\u015fil) ve bir &#8220;Bedenler&#8221; tablosu (S, M, L) oldu\u011funu varsayal\u0131m. E\u011fer her rengin her bedenle olas\u0131 t\u00fcm kombinasyonlar\u0131n\u0131 listelemek istersek (\u00f6rne\u011fin, K\u0131rm\u0131z\u0131-S, K\u0131rm\u0131z\u0131-M, K\u0131rm\u0131z\u0131-L, Mavi-S, vb.), CROSS JOIN kullan\u0131r\u0131z.<\/p>\n<h4>SQL Kodu \u00d6rne\u011fi<\/h4>\n<pre><code>SELECT\n    R.RenkAd,\n    B.BedenAd\nFROM\n    Renkler AS R\nCROSS JOIN\n    Bedenler AS B;<\/code><\/pre>\n<p>Bu sorgu, her rengi her bedenle e\u015fle\u015ftirerek olas\u0131 t\u00fcm kombinasyonlar\u0131 getirir. \u00d6rne\u011fin, 3 renk ve 3 beden varsa, sonu\u00e7 k\u00fcmesinde 3 * 3 = 9 sat\u0131r olacakt\u0131r. CROSS JOIN, test verisi olu\u015fturmak, t\u00fcm olas\u0131 senaryolar\u0131 modellemek veya belirli bir senaryoda t\u00fcm kombinasyonlar\u0131 incelemek gibi ni\u015f durumlarda faydal\u0131 olabilir.<\/p>\n<h3>SELF JOIN<\/h3>\n<h4>Tan\u0131m ve Kullan\u0131m<\/h4>\n<p>SELF JOIN, bir tablonun kendisiyle birle\u015ftirilmesidir. Ayn\u0131 tablonun farkl\u0131 sat\u0131rlar\u0131 aras\u0131ndaki ili\u015fkileri sorgulamak i\u00e7in kullan\u0131l\u0131r. Bu, genellikle hiyerar\u015fik verilerle (\u00f6rne\u011fin, \u00e7al\u0131\u015fanlar ve y\u00f6neticileri, a\u011fa\u00e7 yap\u0131lar\u0131) \u00e7al\u0131\u015f\u0131rken veya ayn\u0131 tablodaki kay\u0131tlar\u0131 belirli bir ko\u015fula g\u00f6re kar\u015f\u0131la\u015ft\u0131rmak gerekti\u011finde kullan\u0131l\u0131r. SELF JOIN, asl\u0131nda bir INNER JOIN (veya ba\u015fka bir JOIN t\u00fcr\u00fc) olup, sadece her iki taraf\u0131nda da ayn\u0131 tablo bulunur, ancak farkl\u0131 takma adlarla (alias) kullan\u0131l\u0131r.<\/p>\n<h4>\u00d6rnek Senaryo<\/h4>\n<p>Bir &#8220;Calisanlar&#8221; tablosu oldu\u011funu d\u00fc\u015f\u00fcnelim. Bu tabloda <code>CalisanID<\/code>, <code>CalisanAd<\/code> ve <code>YoneticiID<\/code> s\u00fctunlar\u0131 var. <code>YoneticiID<\/code>, ayn\u0131 tablodaki ba\u015fka bir \u00e7al\u0131\u015fan\u0131n <code>CalisanID<\/code>&#8216;sine referans verir. Bir \u00e7al\u0131\u015fan\u0131n ad\u0131n\u0131 ve y\u00f6neticisinin ad\u0131n\u0131 ayn\u0131 anda g\u00f6rmek istiyoruz.<\/p>\n<h4>SQL Kodu \u00d6rne\u011fi<\/h4>\n<pre><code>SELECT\n    C.CalisanAd AS Calisan,\n    Y.CalisanAd AS Yonetici\nFROM\n    Calisanlar AS C\nINNER JOIN\n    Calisanlar AS Y ON C.YoneticiID = Y.CalisanID;<\/code><\/pre>\n<p>Bu sorgu, her \u00e7al\u0131\u015fan\u0131 y\u00f6neticisiyle e\u015fle\u015ftirir. <code>Calisanlar<\/code> tablosunu iki farkl\u0131 takma ad (<code>C<\/code> ve <code>Y<\/code>) ile kullanarak, ayn\u0131 tablonun farkl\u0131 &#8220;rol&#8221;lerini temsil ediyoruz. E\u011fer bir \u00e7al\u0131\u015fan\u0131n y\u00f6neticisi yoksa (yani <code>YoneticiID<\/code> NULL ise veya e\u015fle\u015fen bir y\u00f6netici ID&#8217;si yoksa), bu \u00e7al\u0131\u015fan INNER JOIN nedeniyle sonu\u00e7 k\u00fcmesinde g\u00f6r\u00fcnmez. T\u00fcm \u00e7al\u0131\u015fanlar\u0131 listelemek ve varsa y\u00f6neticilerini g\u00f6rmek i\u00e7in LEFT JOIN kullan\u0131labilir:<\/p>\n<pre><code>SELECT\n    C.CalisanAd AS Calisan,\n    Y.CalisanAd AS Yonetici\nFROM\n    Calisanlar AS C\nLEFT JOIN\n    Calisanlar AS Y ON C.YoneticiID = Y.CalisanID;<\/code><\/pre>\n<p>Bu durumda, y\u00f6neticisi olmayan \u00e7al\u0131\u015fanlar\u0131n <code>Yonetici<\/code> s\u00fctunu <code>NULL<\/code> olarak d\u00f6necektir.<\/p>\n<h3>JOIN Ko\u015fullar\u0131 ve Performans \u0130pu\u00e7lar\u0131<\/h3>\n<h4>ON ve WHERE Aras\u0131ndaki Fark<\/h4>\n<p>JOIN ko\u015fullar\u0131 genellikle <code>ON<\/code> anahtar kelimesi ile belirtilir. <code>ON<\/code> ko\u015fulu, tablolar\u0131n nas\u0131l birle\u015ftirilece\u011fini belirlerken, <code>WHERE<\/code> ko\u015fulu birle\u015ftirme ger\u00e7ekle\u015ftikten sonra sonu\u00e7 k\u00fcmesini filtrelemek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<ul>\n<li><strong><code>ON<\/code> Ko\u015fulu:<\/strong> JOIN i\u015flemi s\u0131ras\u0131nda hangi sat\u0131rlar\u0131n birle\u015ftirilece\u011fini belirler. OUTER JOIN&#8217;larda <code>ON<\/code> ko\u015fulu, e\u015fle\u015fmeyen sat\u0131rlar\u0131n da korunmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong><code>WHERE<\/code> Ko\u015fulu:<\/strong> JOIN i\u015flemi tamamland\u0131ktan sonra, birle\u015ftirilmi\u015f sonu\u00e7 k\u00fcmesinden hangi sat\u0131rlar\u0131n d\u00f6nd\u00fcr\u00fclece\u011fini belirler. OUTER JOIN&#8217;larda <code>WHERE<\/code> ko\u015fulu, e\u015fle\u015fmeyen sat\u0131rlar\u0131 da filtreleyebilir, bu da beklenen sonu\u00e7lar\u0131 de\u011fi\u015ftirebilir (\u00f6rne\u011fin, bir LEFT JOIN&#8217;i bir INNER JOIN gibi davranmaya zorlayabilir).<\/li>\n<\/ul>\n<p>\u00d6rnek:<\/p>\n<pre><code>-- LEFT JOIN ve ON ko\u015fulu\nSELECT M.MusteriAd, S.SiparisID\nFROM Musteriler AS M\nLEFT JOIN Siparisler AS S ON M.MusteriID = S.MusteriID AND S.SiparisTarihi > '2023-01-01';\n-- Bu, t\u00fcm m\u00fc\u015fterileri getirir. Sadece 2023 sonras\u0131 sipari\u015fleri olan m\u00fc\u015fterilerin sipari\u015f bilgileri g\u00f6r\u00fcn\u00fcr.\n-- Di\u011fer m\u00fc\u015fterilerin sipari\u015f bilgileri NULL olur, ancak M\u00fc\u015fteri bilgileri her zaman gelir.\n\n-- LEFT JOIN ve WHERE ko\u015fulu\nSELECT M.MusteriAd, S.SiparisID\nFROM Musteriler AS M\nLEFT JOIN Siparisler AS S ON M.MusteriID = S.MusteriID\nWHERE S.SiparisTarihi > '2023-01-01';\n-- Bu, sadece 2023 sonras\u0131 sipari\u015fleri olan m\u00fc\u015fterileri ve o sipari\u015fleri getirir.\n-- E\u011fer bir m\u00fc\u015fterinin 2023 sonras\u0131 sipari\u015fi yoksa, o m\u00fc\u015fteri tamamen filtrelenir (LEFT JOIN, INNER JOIN gibi davran\u0131r).<\/code><\/pre>\n<h4>\u0130ndekslerin \u00d6nemi<\/h4>\n<p>JOIN performans\u0131n\u0131n anahtarlar\u0131ndan biri, birle\u015ftirme ko\u015fulunda kullan\u0131lan s\u00fctunlara indeks uygulamakt\u0131r. \u0130ndeksler, veritaban\u0131 motorunun b\u00fcy\u00fck tablolardaki e\u015fle\u015fen sat\u0131rlar\u0131 \u00e7ok daha h\u0131zl\u0131 bulmas\u0131n\u0131 sa\u011flar. Genellikle, birincil anahtarlar otomatik olarak indekslenir, ancak yabanc\u0131 anahtarlar (JOIN ko\u015fullar\u0131nda s\u0131kl\u0131kla kullan\u0131lan s\u00fctunlar) i\u00e7in de indeks olu\u015fturmak performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir.<\/p>\n<h4>Do\u011fru JOIN T\u00fcr\u00fcn\u00fc Se\u00e7me<\/h4>\n<p>Her JOIN t\u00fcr\u00fcn\u00fcn belirli bir amac\u0131 vard\u0131r. Yanl\u0131\u015f JOIN t\u00fcr\u00fcn\u00fc se\u00e7mek, eksik veya hatal\u0131 sonu\u00e7lara yol a\u00e7abilir. \u0130htiyac\u0131n\u0131za uygun olan\u0131 se\u00e7mek i\u00e7in \u015fu sorular\u0131 sorun:<\/p>\n<ul>\n<li>Sadece e\u015fle\u015fen kay\u0131tlar\u0131 m\u0131 istiyorum? (INNER JOIN)<\/li>\n<li>Sol tablodaki t\u00fcm kay\u0131tlar\u0131 ve varsa sa\u011fdaki e\u015fle\u015fmeleri mi istiyorum? (LEFT JOIN)<\/li>\n<li>Sa\u011f tablodaki t\u00fcm kay\u0131tlar\u0131 ve varsa soldaki e\u015fle\u015fmeleri mi istiyorum? (RIGHT JOIN)<\/li>\n<li>Her iki tablodaki t\u00fcm kay\u0131tlar\u0131 ve varsa e\u015fle\u015fmeleri mi istiyorum? (FULL JOIN)<\/li>\n<li>T\u00fcm olas\u0131 kombinasyonlar\u0131 m\u0131 istiyorum? (CROSS JOIN)<\/li>\n<li>Ayn\u0131 tablodaki kay\u0131tlar\u0131 m\u0131 ili\u015fkilendiriyorum? (SELF JOIN)<\/li>\n<\/ul>\n<h4>JOIN S\u0131ras\u0131<\/h4>\n<p>\u00c7o\u011fu veritaban\u0131 y\u00f6netim sistemi (DBMS) sorgu iyile\u015ftiricileri (query optimizer) JOIN s\u0131ras\u0131n\u0131 ak\u0131ll\u0131ca belirleyebilir. Ancak, \u00f6zellikle \u00e7ok say\u0131da tabloyu birle\u015ftirirken veya b\u00fcy\u00fck tablolarla \u00e7al\u0131\u015f\u0131rken, JOIN s\u0131ras\u0131 performans \u00fczerinde etkili olabilir. Genellikle, daha k\u00fc\u00e7\u00fck sonu\u00e7 k\u00fcmeleri \u00fcreten JOIN&#8217;lerin \u00f6nce yap\u0131lmas\u0131, sonraki JOIN&#8217;lerin daha az veri \u00fczerinde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayarak performans\u0131 art\u0131rabilir.<\/p>\n<h4>B\u00fcy\u00fck Tablolarla \u00c7al\u0131\u015f\u0131rken Dikkat Edilmesi Gerekenler<\/h4>\n<ul>\n<li><strong>Sadece \u0130htiyac\u0131n\u0131z Olan S\u00fctunlar\u0131 Se\u00e7in:<\/strong> <code>SELECT *<\/code> kullanmaktan ka\u00e7\u0131n\u0131n. Yaln\u0131zca gerekli s\u00fctunlar\u0131 se\u00e7mek, a\u011f trafi\u011fini ve bellek kullan\u0131m\u0131n\u0131 azalt\u0131r.<\/li>\n<li><strong>Veriyi \u00d6nceden Filtreleyin:<\/strong> JOIN i\u015fleminden \u00f6nce <code>WHERE<\/code> ko\u015fullar\u0131yla veri miktar\u0131n\u0131 azaltmak, JOIN&#8217;in daha az veri \u00fczerinde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>CTE&#8217;ler veya Subquery&#8217;ler Kullan\u0131n:<\/strong> Karma\u015f\u0131k JOIN&#8217;leri daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir par\u00e7alara ay\u0131rmak i\u00e7in Common Table Expressions (CTE) veya alt sorgular kullanabilirsiniz.<\/li>\n<\/ul>\n<h3>Pratik Uygulamalar ve \u0130leri Seviye Konular<\/h3>\n<h4>Birden Fazla Tabloyu Birle\u015ftirme<\/h4>\n<p>Ger\u00e7ek d\u00fcnya senaryolar\u0131nda, genellikle ikiden fazla tabloyu birle\u015ftirmeniz gerekir. SQL, zincirleme JOIN&#8217;lere izin verir:<\/p>\n<pre><code>SELECT\n    M.MusteriAd,\n    S.SiparisID,\n    U.UrunAd,\n    SD.Miktar\nFROM\n    Musteriler AS M\nINNER JOIN\n    Siparisler AS S ON M.MusteriID = S.MusteriID\nINNER JOIN\n    SiparisDetaylari AS SD ON S.SiparisID = SD.SiparisID\nINNER JOIN\n    Urunler AS U ON SD.UrunID = U.UrunID;<\/code><\/pre>\n<p>Bu \u00f6rnek, bir m\u00fc\u015fterinin ad\u0131n\u0131, sipari\u015f numaras\u0131n\u0131, sipari\u015findeki \u00fcr\u00fcn ad\u0131n\u0131 ve miktar\u0131n\u0131 g\u00f6steren kapsaml\u0131 bir rapor olu\u015fturur.<\/p>\n<h4>JOIN ve Agregasyon Fonksiyonlar\u0131<\/h4>\n<p>JOIN&#8217;ler, <code>GROUP BY<\/code> ve agregasyon fonksiyonlar\u0131 (<code>COUNT<\/code>, <code>SUM<\/code>, <code>AVG<\/code>, <code>MAX<\/code>, <code>MIN<\/code>) ile birlikte kullan\u0131larak g\u00fc\u00e7l\u00fc \u00f6zet raporlar olu\u015fturulabilir. \u00d6rne\u011fin, her m\u00fc\u015fterinin toplam sipari\u015f tutar\u0131n\u0131 g\u00f6rmek isteyebilirsiniz:<\/p>\n<pre><code>SELECT\n    M.MusteriAd,\n    M.MusteriSoyad,\n    COUNT(S.SiparisID) AS ToplamSiparisSayisi,\n    SUM(S.ToplamTutar) AS ToplamSiparisTutari\nFROM\n    Musteriler AS M\nLEFT JOIN\n    Siparisler AS S ON M.MusteriID = S.MusteriID\nGROUP BY\n    M.MusteriID, M.MusteriAd, M.MusteriSoyad\nORDER BY\n    ToplamSiparisTutari DESC;<\/code><\/pre>\n<p>Bu sorgu, her m\u00fc\u015fterinin ad\u0131n\u0131, toplam sipari\u015f say\u0131s\u0131n\u0131 ve toplam sipari\u015f tutar\u0131n\u0131 listeler. LEFT JOIN kullan\u0131ld\u0131\u011f\u0131 i\u00e7in, hi\u00e7 sipari\u015f vermemi\u015f m\u00fc\u015fteriler de sonu\u00e7 k\u00fcmesinde yer al\u0131r ve onlar\u0131n <code>ToplamSiparisSayisi<\/code> 0, <code>ToplamSiparisTutari<\/code> ise NULL veya 0 (veritaban\u0131na g\u00f6re) olacakt\u0131r.<\/p>\n<h4>Subquery&#8217;ler ve JOIN&#8217;ler<\/h4>\n<p>Baz\u0131 durumlarda, birle\u015ftirme yapmadan \u00f6nce bir veya daha fazla tablo \u00fczerinde karma\u015f\u0131k filtrelemeler veya hesaplamalar yapmak gerekebilir. Bu t\u00fcr durumlarda alt sorgular (subquery) kullan\u0131labilir. Alt sorgular, genellikle JOIN&#8217;lere bir alternatif olarak veya JOIN&#8217;lerle birlikte daha karma\u015f\u0131k sorgular olu\u015fturmak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code>-- Subquery kullanarak belirli bir tarihten sonra sipari\u015f veren m\u00fc\u015fterileri bulma\nSELECT M.MusteriAd, M.MusteriSoyad\nFROM Musteriler AS M\nWHERE M.MusteriID IN (SELECT S.MusteriID FROM Siparisler AS S WHERE S.SiparisTarihi > '2023-01-01');\n\n-- Ayn\u0131 sorgunun JOIN ile yap\u0131l\u0131\u015f\u0131 (genellikle daha performansl\u0131d\u0131r)\nSELECT DISTINCT M.MusteriAd, M.MusteriSoyad\nFROM Musteriler AS M\nINNER JOIN Siparisler AS S ON M.MusteriID = S.MusteriID\nWHERE S.SiparisTarihi > '2023-01-01';<\/code><\/pre>\n<p>Genel olarak, m\u00fcmk\u00fcn oldu\u011funca JOIN&#8217;leri tercih etmek, veritaban\u0131 optimizasyon motorlar\u0131n\u0131n daha iyi planlar olu\u015fturmas\u0131na yard\u0131mc\u0131 oldu\u011fu i\u00e7in daha iyi performans sa\u011flayabilir.<\/p>\n<h4>CTE&#8217;ler (Common Table Expressions) ve JOIN&#8217;ler<\/h4>\n<p>CTE&#8217;ler, karma\u015f\u0131k sorgular\u0131 daha okunabilir ve y\u00f6netilebilir par\u00e7alara ay\u0131rmak i\u00e7in kullan\u0131lan ge\u00e7ici, adland\u0131r\u0131lm\u0131\u015f sonu\u00e7 k\u00fcmeleridir. CTE&#8217;ler, ana sorgu i\u00e7inde bir kez tan\u0131mlan\u0131r ve daha sonra birden \u00e7ok kez referans verilebilir. \u00d6zellikle birden fazla JOIN i\u00e7eren veya kendi i\u00e7inde karma\u015f\u0131k mant\u0131k bar\u0131nd\u0131ran sorgularda faydal\u0131d\u0131r.<\/p>\n<pre><code>WITH YuksekDegerliMusteriler AS (\n    SELECT\n        MusteriID,\n        MusteriAd,\n        MusteriSoyad\n    FROM\n        Musteriler\n    WHERE\n        MusteriID IN (SELECT MusteriID FROM Siparisler GROUP BY MusteriID HAVING SUM(ToplamTutar) > 1000)\n)\nSELECT\n    YDM.MusteriAd,\n    YDM.MusteriSoyad,\n    COUNT(S.SiparisID) AS ToplamSiparisSayisi,\n    SUM(S.ToplamTutar) AS ToplamSiparisTutari\nFROM\n    YuksekDegerliMusteriler AS YDM\nINNER JOIN\n    Siparisler AS S ON YDM.MusteriID = S.MusteriID\nGROUP BY\n    YDM.MusteriID, YDM.MusteriAd, YDM.MusteriSoyad;<\/code><\/pre>\n<p>Bu \u00f6rnekte, \u00f6nce y\u00fcksek de\u011ferli m\u00fc\u015fterileri bir CTE i\u00e7inde tan\u0131ml\u0131yor, ard\u0131ndan bu CTE&#8217;yi sipari\u015flerle birle\u015ftirerek daha detayl\u0131 bir rapor olu\u015fturuyoruz. Bu yakla\u015f\u0131m, sorgunun mant\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m anlamay\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>S\u0131k Yap\u0131lan Hatalar ve \u00c7\u00f6z\u00fcmleri<\/h3>\n<ul>\n<li><strong>Yanl\u0131\u015f JOIN T\u00fcr\u00fc Se\u00e7imi:<\/strong> En s\u0131k yap\u0131lan hatad\u0131r. \u00d6rne\u011fin, t\u00fcm sol tablo kay\u0131tlar\u0131n\u0131 g\u00f6rmek isterken INNER JOIN kullanmak, baz\u0131 kay\u0131tlar\u0131n eksik gelmesine neden olur. \u00c7\u00f6z\u00fcm: Her JOIN t\u00fcr\u00fcn\u00fcn amac\u0131n\u0131 iyi anlamak ve sorgu gereksinimlerine g\u00f6re do\u011fru t\u00fcr\u00fc se\u00e7mek.<\/li>\n<li><strong>Eksik JOIN Ko\u015fullar\u0131:<\/strong> Birle\u015ftirme ko\u015fulunun (<code>ON<\/code> yan t\u00fcmcesi) unutulmas\u0131 veya yanl\u0131\u015f belirtilmesi. Bu, CROSS JOIN benzeri istenmeyen sonu\u00e7lara (Kartezyen \u00e7arp\u0131m) veya hatal\u0131 e\u015fle\u015fmelere yol a\u00e7abilir. \u00c7\u00f6z\u00fcm: Her JOIN i\u00e7in do\u011fru ve eksiksiz bir <code>ON<\/code> ko\u015fulu sa\u011flamak.<\/li>\n<li><strong>Performans Sorunlar\u0131:<\/strong> \u0130ndekssiz s\u00fctunlarda JOIN yapmak, \u00e7ok b\u00fcy\u00fck tablolar\u0131 birle\u015ftirmek veya <code>SELECT *<\/code> kullanmak performans\u0131 d\u00fc\u015f\u00fcrebilir. \u00c7\u00f6z\u00fcm: \u0130ndeksleri kullanmak, sadece gerekli s\u00fctunlar\u0131 se\u00e7mek ve b\u00fcy\u00fck tablolar\u0131 filtrelemek.<\/li>\n<li><strong>Veri Tekrar\u0131 (Duplicate Rows):<\/strong> \u00d6zellikle bire-\u00e7ok ili\u015fkilerde, birle\u015ftirilen tablolardan birinde birden fazla e\u015fle\u015fme oldu\u011funda sonu\u00e7 k\u00fcmesinde ayn\u0131 sat\u0131r\u0131n birden fazla kez g\u00f6r\u00fcnmesi. \u00d6rne\u011fin, bir m\u00fc\u015fterinin birden fazla sipari\u015fi varsa, m\u00fc\u015fteri bilgileri her sipari\u015f i\u00e7in tekrarlan\u0131r. \u00c7\u00f6z\u00fcm: <code>DISTINCT<\/code> anahtar kelimesini kullanmak (e\u011fer sadece benzersiz anahtar s\u00fctunlar\u0131 isteniyorsa) veya <code>GROUP BY<\/code> ile agregasyon yapmak.<\/li>\n<li><strong><code>ON<\/code> ve <code>WHERE<\/code> Ko\u015fullar\u0131n\u0131n Kar\u0131\u015ft\u0131r\u0131lmas\u0131:<\/strong> \u00d6zellikle OUTER JOIN&#8217;larda <code>ON<\/code> ve <code>WHERE<\/code> ko\u015fullar\u0131n\u0131n farkl\u0131 etkileri vard\u0131r. <code>WHERE<\/code> ko\u015fulunu yanl\u0131\u015f yerde kullanmak, OUTER JOIN&#8217;in davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirebilir. \u00c7\u00f6z\u00fcm: <code>ON<\/code> ko\u015fulunun birle\u015ftirme mant\u0131\u011f\u0131n\u0131, <code>WHERE<\/code> ko\u015fulunun ise sonu\u00e7 k\u00fcmesini filtreleme mant\u0131\u011f\u0131n\u0131 temsil etti\u011fini unutmamak.<\/li>\n<\/ul>\n<h3>Sonu\u00e7<\/h3>\n<p>SQL JOIN&#8217;ler, ili\u015fkisel veritabanlar\u0131n\u0131n temelini olu\u015fturan ve farkl\u0131 tablolarda saklanan verileri bir araya getirerek anlaml\u0131 bilgiler elde etmemizi sa\u011flayan g\u00fc\u00e7l\u00fc ara\u00e7lard\u0131r. INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN ve SELF JOIN gibi farkl\u0131 t\u00fcrler, \u00e7e\u015fitli veri birle\u015ftirme senaryolar\u0131na uygun \u00e7\u00f6z\u00fcmler sunar. Her bir JOIN t\u00fcr\u00fcn\u00fcn kendine \u00f6zg\u00fc davran\u0131\u015f\u0131n\u0131 ve kullan\u0131m alanlar\u0131n\u0131 anlamak, do\u011fru ve performansl\u0131 SQL sorgular\u0131 yazmak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p>Bu rehberde ele al\u0131nan temel JOIN t\u00fcrlerini, s\u00f6zdizimini, pratik \u00f6rnekleri ve performans ipu\u00e7lar\u0131n\u0131 kavrayarak, karma\u015f\u0131k veritaban\u0131 yap\u0131lar\u0131 \u00fczerinde etkili sorgular olu\u015fturma becerinizi geli\u015ftirebilirsiniz. Unutmay\u0131n ki, veritaban\u0131 y\u00f6netiminde ustala\u015fman\u0131n yolu, JOIN&#8217;leri do\u011fru bir \u015fekilde anlamaktan ve uygulamaktan ge\u00e7er. S\u00fcrekli pratik yaparak ve farkl\u0131 senaryolar \u00fczerinde deneyler yaparak bu konudaki bilginizi peki\u015ftirebilirsiniz.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"SQL&#8217;de JOIN Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber\n\u0130li\u015fkisel veritaban\u0131 y\u00f6netim sistemlerinin (RDBMS) temel ta\u015flar\u0131ndan biri olan SQL (Structured Qu","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1505],"tags":[],"class_list":{"0":"post-33844","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-sql-2","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>SQL&#039;de JOIN Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQL&#039;de JOIN Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"SQL&#039;de JOIN Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber \u0130li\u015fkisel veritaban\u0131 y\u00f6netim sistemlerinin (RDBMS) temel ta\u015flar\u0131ndan biri olan SQL (Structured Qu\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-07T18:40:50+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"SQL&#8217;de JOIN Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-11-07T18:40:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/\"},\"wordCount\":3211,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"SQL\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/\",\"name\":\"SQL'de JOIN Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-07T18:40:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQL&#8217;de JOIN Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"SQL'de JOIN Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"SQL'de JOIN Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber","og_description":"SQL'de JOIN Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber \u0130li\u015fkisel veritaban\u0131 y\u00f6netim sistemlerinin (RDBMS) temel ta\u015flar\u0131ndan biri olan SQL (Structured Qu","og_url":"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-07T18:40:50+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"SQL&#8217;de JOIN Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber","datePublished":"2025-11-07T18:40:50+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/"},"wordCount":3211,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["SQL"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/","name":"SQL'de JOIN Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-07T18:40:50+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/sqlde-join-kullanimi-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"SQL&#8217;de JOIN Kullan\u0131m\u0131: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33844","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33844"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33844\/revisions"}],"predecessor-version":[{"id":33845,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33844\/revisions\/33845"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33844"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33844"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33844"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}