SQL JOIN işlemleri: tabloları doğru birleştirme rehberi
SQL JOIN türlerini INNER, LEFT, RIGHT, FULL ve CROSS örnekleriyle öğrenin; tablo birleştirirken satır çoğalması ve eksik veri hatalarından kaçının.
JOIN neden gerekir?
İlişkisel veritabanlarında veri, tekrarı önlemek için ayrı tablolara bölünür. Müşteri bilgisi bir tabloda, siparişler başka bir tabloda, ürünler ayrı bir tabloda tutulur. Bir rapor için müşteri adı ile sipariş tutarını yan yana görmek gerektiğinde bu tabloları ortak bir sütun üzerinden birleştirmek gerekir. SQL'de bu işi JOIN yapar.
JOIN, tablolardaki satırları belirlenen bir eşleşme koşuluna göre yan yana getirir. Koşul genellikle bir tablodaki yabancı anahtarın diğer tablodaki birincil anahtara eşitlenmesidir. Hangi JOIN türünün seçileceği ise eşleşmeyen satırlara ne yapılacağı sorusunun cevabına bağlıdır: atılsın mı, korunsun mu?
JOIN türleri ve ne zaman hangisi?
Temel JOIN türleri şunlardır:
- INNER JOIN: Yalnızca eşleşme koşulunu sağlayan satırları getirir. Eşleşmeyenler sonuçtan düşer. Örneğin yalnızca sipariş vermiş müşterileri listelemek için kullanılır.
- LEFT JOIN (LEFT OUTER JOIN): Soldaki tablonun tüm satırlarını korur, sağda eşleşme yoksa sağ tablo sütunları boş (NULL) gelir. Örneğin tüm müşterileri ve varsa siparişlerini listelemek için kullanılır.
- RIGHT JOIN: LEFT JOIN'in tersidir; sağdaki tablonun tüm satırlarını korur. Pratikte tabloların sırası değiştirilerek LEFT JOIN yazılabilir, bu yüzden daha az tercih edilir.
- FULL OUTER JOIN: Birleştirilen tabloların tüm satırlarını korur, eşleşmeyenleri NULL ile tamamlar. Bazı veritabanı sistemlerinde doğrudan desteklenmeyebilir; kendi sisteminizin belgesini kontrol edin.
- CROSS JOIN: Eşleşme koşulu olmadan tabloların tüm satır kombinasyonlarını üretir. Tarih ve kategori kombinasyonlarını oluşturmak gibi bilinçli kullanımlarda işe yarar, yanlışlıkla yapıldığında ise çok büyük sonuç kümeleri doğurur.
- SELF JOIN: Bir tabloyu kendisiyle birleştirir. Örneğin çalışan ile yönetici aynı tabloda tutuluyorsa hiyerarşiyi çıkarmak için kullanılır.
Sözdizimi: adım adım okuma
Temel yapı şöyledir:
SELECT c.name, o.total FROM customers c INNER JOIN orders o ON c.id = o.customer_id
Bu sorguyu şu sırayla okuyabilirsiniz: FROM ile ana tablo seçilir, JOIN ile birleştirilecek tablo eklenir, ON ile eşleşme koşulu yazılır, SELECT ile hangi sütunların getirileceği belirlenir. Tablolara kısa takma adlar vermek (c, o gibi) okunabilirliği artırır ve aynı adlı sütunların karışmasını önler.
Sütun adlarını her zaman tablo takma adıyla birlikte yazmak iyi bir alışkanlıktır. Birden fazla tablo birleştirirken JOIN ifadeleri art arda eklenir ve her biri kendi ON koşuluna sahip olur. Okunabilirlik için her JOIN'i ayrı satıra yazmak, sorguyu hata ayıklarken büyük kolaylık sağlar. Eşleşme koşulunu atlamak, CROSS JOIN benzeri bir sonuca yol açtığından ON ifadesinin eksiksiz yazıldığı kontrol edilmelidir.
Örnek: müşteriler ve siparişler
Örneğin bir mağazanın müşteriler ve siparişler tablosu olsun. Yalnızca alışveriş yapmış müşterileri ve toplam tutarlarını görmek için INNER JOIN uygun olur; alışveriş yapmamış müşteriler sonuçta yer almaz.
Pazarlama ekibi ise hiç alışveriş yapmamış müşterilere kampanya göndermek istiyor. Bu durumda LEFT JOIN kullanılır: müşteriler tablosu solda, siparişler sağdadır ve sipariş tarafı boş olan satırlar filtrelenir (WHERE o.id IS NULL). Böylece yalnızca siparişi olmayan müşteriler kalır. Bu desene anti-join denir ve eşleşmeyenleri bulmak için sık kullanılır.
Başka bir senaryoda sipariş satırlarındaki ürün bilgisini görmek gerekir; sipariş kalemleri tablosu ve ürünler tablosu da zincire eklenir. Burada her JOIN'in eşleşme koşulu doğru anahtar çifti üzerinden kurulmalıdır; yanlış bir anahtar, birbiriyle ilgisiz satırların eşleşmesine neden olur ve sonuç yanlış çıkar.
Satır çoğalması ve NULL tuzakları
JOIN işleminde en sık hata, satır çoğalmasıdır. Eşleşme bire-çok ilişkideyse, tek taraftaki satır çok taraftaki her satırla eşleşir ve sonuçta tekrar eder. Örneğin müşteri tablosunu siparişlerle birleştirdikten sonra müşteri başına toplam almak istiyorsanız, sipariş sayısı kadar tekrar eden müşteri satırlarını toplamamaya dikkat etmelisiniz. Çözüm, birleştirmeden önce siparişleri müşteri bazında gruplayıp özetlemek ya da toplama işlemini doğru düzeyde yapmaktır.
Bir diğer tuzak LEFT JOIN ile WHERE kullanımıdır. Sağ tabloya ait bir koşulu WHERE bölümüne yazmak, eşleşmeyen satırları eleyerek LEFT JOIN'i fiilen INNER JOIN'e çevirir. Sağ tabloya ait filtre eşleşme koşuluna (ON) yazılırsa sol tablo satırları korunur.
NULL değerleri eşitlik koşullarında eşleşmez; anahtar sütunlarında boş değer varsa o satırlar JOIN dışında kalır. Eşleşme sütunlarının veri türlerinin uyumlu olduğundan ve gereksiz boşluk ya da büyük-küçük harf farkı bulunmadığından emin olmak da hataları azaltır.
Sağlama alışkanlıkları ve performans
JOIN sonuçlarını kontrol etmek için birkaç alışkanlık edinin:
- Birleştirmeden önce ve sonra satır sayısını karşılaştırın. Beklenmedik artış satır çoğalmasının işaretidir.
- Eşleşme anahtarının hangi tabloda benzersiz olduğunu bilin.
- Küçük bir örnek kümesinde sonucu elle doğrulayın.
- Eşleşmeyen satırları ayrıca listeleyip veri kalitesi sorunlarını görün.
Performans açısından eşleşme sütunlarının dizinli olması büyük tablolarda fark yaratır. Gereksiz sütunları getirmemek ve birleştirmeden önce satır sayısını filtreyle azaltmak sorguyu hızlandırır. Yürütme planını incelemek, hangi birleştirme yönteminin kullanıldığını ve darboğazın nerede olduğunu gösterir.
Bu konunun derinleştirilmesi için alt sorgular, ortak tablo ifadeleri ve pencere fonksiyonları sonraki adımlardır.
Öğrenme yolu ve Mindset bağlamı
Sıra genelde şöyledir: önce tek tabloda SELECT, filtreleme ve gruplama; ardından INNER JOIN ve LEFT JOIN; sonra çoklu tablo birleştirme ve anti-join desenleri; son olarak alt sorgular, pencere fonksiyonları ve performans. Gerçek bir veri kümesi üzerinde, iş sorularıyla çalışmak kavramın oturmasını hızlandırır.
Mindset programlarında SQL ile Veri Sorgulama (Temel) programı; SQL ve İlişkisel Veritabanı Temelleri, Filtreleme Teknikleri ve Temel Fonksiyonlar, Toplulaştırma Fonksiyonları ve Gruplama, Tablo Birleştirme: JOIN Teknikleri ile Pratik İş Raporları ile Sorgu Geliştirme başlıklarını içerir. SQL ile Veri Sorgulama (İleri) programında Alt Sorgular ve Korelasyon Teknikleri, Sorgu Performansı ve Yürütme Planı Analizi ile Pencere Fonksiyonları ile İleri Analiz başlıkları yer alır. SQL ile Programlama Eğitimi ise Sorgular, Join Kullanımı ve Toplama ve Gruplama başlıklarını işler.
İlgili Mindset programı
SQL ile Veri Sorgulama (Temel)
Sık sorulan sorular
INNER JOIN ile LEFT JOIN arasındaki temel fark nedir?
INNER JOIN yalnızca eşleşme koşulunu sağlayan satırları verir. LEFT JOIN ise soldaki tablonun tüm satırlarını korur, sağda eşleşme yoksa o tarafı boş bırakır.
JOIN yazdım ama satır sayısı beklediğimden fazla çıktı, neden?
Muhtemelen bire-çok ilişkide satır çoğalması yaşanıyor. Tek taraftaki satır, çok taraftaki her satırla eşleşir ve tekrar eder. Eşleşme anahtarının benzersizliğini kontrol edin, gerekiyorsa çok taraftaki tabloyu önce gruplayıp özetleyin ya da toplamayı doğru düzeyde yapın.
RIGHT JOIN'i ne zaman kullanmalıyım?
RIGHT JOIN, LEFT JOIN'in ayna görüntüsüdür ve tabloların sırası değiştirilerek aynı sonuç elde edilebilir. Okunabilirlik için çoğu ekip tek yönde, genellikle LEFT JOIN ile yazmayı tercih eder. Sorgu tutarlılığı açısından bu yaklaşım hata riskini azaltır.
Birden fazla tabloyu aynı sorguda birleştirebilir miyim?
Evet. JOIN ifadeleri art arda eklenir ve her biri kendi ON koşuluna sahiptir. Sorgu uzadıkça takma adlar kullanmak, her JOIN'i ayrı satıra yazmak ve ara sonuçları kontrol etmek önemlidir. Karmaşık sorgularda ortak tablo ifadeleri okunabilirliği artırır.
JOIN sorgusu yavaş çalışıyorsa ne yapmalıyım?
Önce eşleşme sütunlarının dizinli olduğunu ve gereksiz sütun getirmediğinizi kontrol edin. Birleştirmeden önce filtrelerle satır sayısını azaltmak yardımcı olur. Yürütme planını inceleyerek darboğazın nerede olduğunu görebilirsiniz; sistemden sisteme çıktı biçimi farklıdır.
İlgili rehberler
İlgili eğitimler
Kategori: Veri Analitiği ve İş Zekası, Yazılım Geliştirme