Menu

SQLite INNER JOIN: Tabloları Birleştirme Rehberi

SQLite'ta INNER JOIN nasıl çalışır? Mantığını, ON kullanımını, üç tablonun birleştirilmesini ve USING kısayolunu örneklerle anlatıyoruz.

Bu sayfada çalıştırılabilir editörler var — düzenle, çalıştır ve sonucu anında gör.

Join, İki Tabloyu Birbirine Bağlar

İlişkisel veritabanları veriyi tablolara böler — müşteriler bir tabloda, siparişler bir başka tabloda, ürünler üçüncü bir tabloda durur. Böylece her bilgi tek bir yerde kalır. Ama gerçek bir soruya cevap aramaya başladığında ("hangi müşteri neyi sipariş etmiş?"), bu parçaları yeniden bir araya getirmeniz gerekir. İşte SQLite tablo birleştirme tam olarak bunu yapar.

INNER JOIN, bu işin en çok kullanılan yoludur. İki tablodaki satırları belirttiğiniz koşula göre eşleştirir ve eşleşmeyen her şeyi dışarıda bırakır.

Üç müşteri, üç sipariş var ama Chen'in hiç siparişi yok — bu yüzden Chen sonuçta görünmüyor. İşte inner join'in özü tam da bu: sadece eşleşen satırlar hayatta kalır.

Mantığı Kavrayalım: Önce Eşleştir, Sonra Filtrele

INNER JOIN'i şöyle okuyun: birinci tablodaki her satırı al, ikinci tablodaki her satırla karşılaştır ve ON koşulu doğru olduğunda o çifti sonuca ekle. Kafanızda canlandırırken devasa bir kartezyen çarpım üzerine uygulanan bir filtre olarak düşünebilirsiniz. SQLite gerçekte bu şekilde çalışmaz (mümkün olduğunda indeksleri kullanır), ama sonucun ne olacağını tahmin etmek için bu zihinsel model son derece işe yarar.

Burada işinize yarayacak birkaç pratik alışkanlık:

  • Tabloyu birden fazla kez anacaksanız takma ad verin (customers AS c). Sorgu çok daha temiz görünür.
  • İki tabloda da olabilecek kolonları nitelendirin (c.name, o.total).
  • ON o.customer_id = c.id ifadesindeki sıralama önemli değil — c.id = o.customer_id da aynı sonucu verir.

INNER JOIN ile JOIN arasındaki fark

SQLite'ta (ve standart SQL'de) tek başına yazılan JOIN, aslında INNER JOIN anlamına gelir. Yani INNER anahtar kelimesi isteğe bağlıdır.

Her iki yazım da aynı planı üretir ve aynı satırları döndürür. INNER JOIN'i açıkça yazmak, farklı join türlerinin bir arada bulunduğu kodlarda küçük bir okunabilirlik artısı sağlar — birkaç satır aşağıdaki LEFT JOIN'in yanında niyetiniz hemen anlaşılır.

ON ile USING karşılaştırması

Birleştirilecek sütunlar her iki tabloda da aynı ada sahipse, USING (sütun) yazımı ON a.col = b.col ifadesine göre çok daha kısa kalır:

USING (customer_id) aslında iki işi birden yapar: hem iki taraftaki customer_id değerlerini eşleştirir, hem de bu sütunu sonuçta tek bir kolon olarak gösterir. Yani iki tabloda da sütun adı gerçekten aynıysa rahatlıkla USING kullanabilirsiniz. Ama isimler farklıysa (orders.customer_id = customers.id gibi) ya da koşul tek bir eşitlikten ibaret değilse, ON ile devam etmek daha doğru olur.

SQLite ile 3 Tablo Birleştirme (Inner Join)

Birden fazla tabloyu birleştirmek için JOIN ... ON ... ifadelerini arka arkaya zincirlemeniz yeterli. Her yeni JOIN, o ana kadar oluşan sonucu bir sonraki tabloya bağlar.

Yukarıdan aşağıya okuyun: müşteriler siparişlere, siparişler de ürünlere bağlanıyor. Çıktıdaki her satır, tek bir müşteri–sipariş–ürün eşleşmesini temsil eder. Zincirin herhangi bir halkasında karşılığı bulunmayan kayıtlar dışarıda kalır — yani inner join kuralı her adımda devreye girer.

WHERE ile filtreleme

ON, satırların nasıl eşleneceğini söyler; WHERE ise eşleşmiş sonucu filtreler. Özellikle inner join'lerde, ek bir koşulu ON içine ya da WHERE içine yazmak aynı satırları üretir — ama yaygın kullanım, join koşullarını ON içinde, satır filtrelerini ise WHERE içinde tutmaktır.

Bu sorgu şöyle okunur: "müşterileri ve siparişleri birleştir, sonra yalnızca İngiltere'deki ve siparişi 20'nin üzerinde olanları tut." İki farklı rol, iki ayrı koşul — ileride kendine teşekkür edeceksiniz. (LEFT JOIN yazmaya başladığında ON/WHERE ayrımı artık kozmetik olmaktan çıkar, ama o konu bir sonraki sayfada.)

ON içinde birden fazla koşul kullanmak

ON ifadesi tek bir eşitlikle sınırlı değildir; istediğiniz her boolean ifadeyi alabilir. İlişki birden fazla sütuna yayıldığında ya da sağ tarafı daha join anında filtrelemek istediğinde işine yarar.

İptal edilen sipariş listede görünmüyor çünkü ikinci koşul sağlanmıyor. Inner join için aynı sonucu WHERE o.status = 'paid' yazarak da elde edebilirdiniz. ON ile yazılan versiyon, "neyin eşleşme sayılacağı" mantığını join'in hemen yanında tutar.

Sık Yapılan Hatalar

İnsanların kafasını karıştıran birkaç nokta var:

  • ON ifadesini unutmak. SQLite'ta FROM a INNER JOIN b şeklinde ON olmadan yazmak söz dizimi hatası verir. (Düz virgülle yazılan FROM a, b ise çalışır ama size cross join üretir — neredeyse hiçbir zaman istediğiniz şey değildir.)
  • Beklenmedik tekrarlar. Bir müşterinin üç siparişi varsa, müşterinin adı sonuçta üç kez görünür. Bu bir hata değil, join'in doğru davranışıdır. Müşteri başına tek satır istiyorsanız GROUP BY ile gruplayın.
  • Eksik satırlar. Görünmesi gereken bir müşteri çıkmadıysa join koşulu eşleşmemiş demektir — join sütunlarında NULL var mı kontrol edin ya da LEFT JOIN'e geçin.
  • Belirsiz sütun adları. SELECT id FROM customers JOIN orders ON ... sorgusu hata verir, çünkü iki tabloda da id sütunu var. Tablo adıyla niteleyin: c.id veya o.id.

Sırada: LEFT JOIN

INNER JOIN, eşleşme bulunmayan satırları "atla geç" mantığıyla işlemek istediğinizde harikadır. Ama bazen siparişi olmayanlar dahil tüm müşterileri listelemek, eksik veriler için de NULL görmek istersiniz. İşte bunun için LEFT JOIN var — bir sonraki konumuz.

Sıkça Sorulan Sorular

SQLite'ta INNER JOIN ne işe yarar?

INNER JOIN, ON koşuluna göre iki tabloda da eşleşen satırları döndürür. Eşleşmeyen satırlar — hangi taraftan olursa olsun — sonuca dahil edilmez. SQLite'ta varsayılan join türüdür; yani JOIN yazmakla INNER JOIN yazmak aynı şey.

SQLite'ta INNER JOIN ile LEFT JOIN arasındaki fark nedir?

INNER JOIN sadece eşleşen satırları getirir. LEFT JOIN ise sol taraftaki tablodaki tüm satırları korur, sağ tarafta eşleşme yoksa o alanları NULL ile doldurur. "Eşleşme yoksa satırı atla" istiyorsan INNER JOIN, "eşleşme olmasa da satırı göster" istiyorsan LEFT JOIN kullan.

SQLite'ta üç tabloyu INNER JOIN ile birleştirebilir miyim?

Evet, peş peşe JOIN ... ON ... ekleyerek zincirleyebilirsin. Her join, o ana kadar oluşan sonucu yeni bir tabloyla bağlar. Teorik bir sınır yok ama dört-beş tabloyu geçtiğinde sorgu okunmaz hale gelmeye başlar; bu noktada CTE (WITH ifadesi) hayat kurtarır.

ON yerine USING ne zaman kullanılmalı?

USING (kolon), birleştirilecek kolon iki tabloda da aynı isimdeyse işe yarayan bir kısayoldur. Daha kısa yazılır ve sonuçtaki tekrar eden kolonu tek bir kolona indirir. Kolon isimleri farklıysa veya daha karmaşık bir koşul gerekiyorsa ON kullanmak gerekir.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA