JOIN ile Tabloları Birleştirme
Süre: 14 dk | Seviye: Başlangıç | Kategori: Veri Bilimi
Bir önceki derste tek bir tablo üzerinde WHERE, ORDER BY ve gruplandırma gibi araçlarla veriyi filtreleyip düzenlemeyi öğrenmiştik. Bu derste bir adım ileri gidiyoruz: artık iki ayrı tabloda duran, birbiriyle ilişkili verileri tek bir sonuçta buluşturacağız. Ders sonunda öğrendiklerimizi bir sonraki ve kursun son dersinde gerçek bir rapor çıkarmak için kullanacağız; bu yüzden burada kurulan temel çok önemli.
Bu derste ne yapacağız?
Bu dersin hedefi, INNER JOIN komutunu kullanarak iki tabloyu ortak bir sütun üzerinden birleştirmeyi öğrenmektir. Ders sonunda örneğin bir “siparisler” tablosuyla bir “musteriler” tablosunu birleştirip “hangi müşteri neyi sipariş etti” gibi anlamlı sonuçlar üretebileceksiniz.
Ön koşul: SELECT, FROM ve WHERE komutlarını kullanarak tek tablodan veri çekebiliyor olmanız ve bir veritabanı yönetim aracına (örneğin tarayıcı üzerinden çalışan bir SQL ortamı ya da masaüstü bir veritabanı programı) erişiminizin olması gerekir. Ara yüz kullandığınız programın sürümüne göre farklılık gösterebilir; aşağıdaki menü ve düğme adları genel bir yaklaşımdır, kendi programınızda karşılıklarını arayabilirsiniz.
Kavram
JOIN kelimesi Türkçede “birleştirme” anlamına gelir. Bunu günlük hayattan bir örnekle düşünelim: Bir okulda öğrenci listesi bir defterde, sınav notları ise başka bir defterde tutuluyor olsun. Her iki defterde de ortak bir bilgi vardır: öğrenci numarası. Öğrenci numarasını kullanarak iki defteri yan yana koyup “bu numaralı öğrencinin adı bu, notu da bu” diye eşleştirebilirsiniz. İşte JOIN da veritabanında tam olarak bunu yapar: iki tabloyu ortak bir sütun (genellikle bir kimlik numarası, yani ID) üzerinden eşleştirip tek bir sonuç tablosu oluşturur.
INNER JOIN, en sık kullanılan JOIN türüdür. “Inner” kelimesi “iç taraf” anlamına gelir ve sadece her iki tabloda da eşleşmesi bulunan satırları getirir. Örneğimizde, notu olmayan bir öğrenci varsa INNER JOIN sonucunda bu öğrenci listede görünmez; çünkü iki taraf da eşleşemiyor demektir. Bu, başlangıç seviyesinde en güvenli ve en anlaşılır JOIN türü olduğu için bu derste ondan başlayacağız.
Adım adım uygulama
Bu uygulamada iki örnek tablomuz olduğunu varsayalım: musteriler tablosunda musteri_id ve ad_soyad sütunları, siparisler tablosunda ise siparis_id, musteri_id ve urun sütunları bulunuyor. Amacımız hangi müşterinin hangi ürünü sipariş ettiğini tek bir tabloda görmek.
- 1. Adım – Önce tabloları tek tek gözünüzde canlandırın. Kullandığınız veritabanı aracında sol taraftaki tablo listesinden musteriler tablosuna tıklayın ve sütun adlarını not alın. Ardından siparisler tablosuna tıklayıp onun sütunlarını da görün. Ortak sütunun musteri_id olduğunu tespit edin; JOIN işlemi bu ortak sütun üzerinden yapılacak.
- 2. Adım – Sorgu penceresini açın. Aracın üst menüsünden Yeni Sorgu veya New Query düğmesine tıklayın. Karşınıza boş bir yazı alanı gelecek; SQL komutlarını buraya yazacağız.
- 3. Adım – Temel INNER JOIN cümlesini yazın. Aşağıdaki satırları sırayla yazın: SELECT musteriler.ad_soyad, siparisler.urun satırı hangi sütunları görmek istediğinizi belirtir. FROM musteriler satırı ana tabloyu seçer. INNER JOIN siparisler ON musteriler.musteri_id = siparisler.musteri_id satırı ise iki tabloyu hangi sütundan eşleştireceğinizi söyler. ON kelimesinden sonra gelen eşitlik, “bu iki sütun aynı değerdeyse satırları birleştir” anlamına gelir.
- 4. Adım – Sorguyu çalıştırın. Sorgu penceresinin üzerinde bulunan Çalıştır veya Run düğmesine tıklayın (bazı programlarda klavye kısayolu F5 tuşudur). Alt tarafta sonuç tablosu belirecek; bu tabloda artık müşteri adları ile sipariş verdikleri ürünler yan yana görünecek.
- 5. Adım – Sonucu WHERE ile daraltmayı deneyin. Öğrendiğiniz WHERE kalıbını JOIN ile birlikte de kullanabilirsiniz. Sorgunun sonuna WHERE siparisler.urun = 'Kalem' eklerseniz, yalnızca kalem sipariş eden müşterileri görürsünüz. Bu, JOIN ile WHERE'in birlikte çok güçlü çalıştığının bir kanıtıdır.
- 6. Adım – Sütun adlarındaki karışıklığı önleyin. İki tabloda da musteri_id adında bir sütun olduğu için, veritabanı programı hangi tablodan bahsettiğinizi anlayamayabilir. Bu yüzden sütun adını yazarken önce tablo adını, sonra bir nokta, sonra sütun adını yazma alışkanlığı edinin, örneğin musteriler.musteri_id gibi.
Sık karşılaşılan sorunlar
| Hata veya durum | Çözüm |
|---|---|
| “Ambiguous column” (belirsiz sütun) hatası alıyorum | Aynı isimli sütun her iki tabloda da var demektir; sütun adının önüne tablo adını ve nokta ekleyin, örneğin musteriler.musteri_id. |
| Sonuç tablosu boş geliyor | ON satırındaki eşlenen sütunların gerekten aynı tip veri içerdiğinden emin olun; ayrıca INNER JOIN yalnızca eşleşen satırları gösterdiği için, hiç eşleşme yoksa sonuç boş görünür; bu her zaman hata olmayabilir. |
| Beklenenden fazla satır geliyor | Bir müşterinin birden fazla siparişi varsa, o müşteri sonuçta o kadar satır olarak tekrar eder; bu normaldir, çünkü her sipariş ayrı bir satırdır. |
| “Table not found” (tablo bulunamadı) hatası | Tablo adını yanlış yazmış olabilirsiniz; sol taraftaki tablo listesinden doğru adı kopyalayıp yapıştırın. |
| JOIN sonrası hangi sütunun hangi tablodan geldiğini karıştırıyorum | SELECT satırında her sütunu tablo.adı biçiminde yazın; bu hem hatayı önler hem de sorguyu okurken kafanızı karıştırmaz. |
Mini görev
Kendi ortamınızda (örnek verilerle doldurulmuş musteriler ve siparisler tabloları varsa onlarla, yoksa eğitmeninizin size verdiği iki ilişkili tabloyla) aşağıdaki görevi yapın: Müşteri adlarını ve sipariş verdikleri ürünleri tek bir sonuçta gösteren bir INNER JOIN sorgusu yazın, ardından bu sorguya bir WHERE koşulu ekleyerek sadece belirli bir ürünü sipariş eden müşterileri listeleyin.
- Sorguda FROM ve INNER JOIN satırları doğru tablo adlarını içeriyor mu?
- ON satırında ortak sütun doğru şekilde eşleştirilmiş mi?
- Sonuç tablosunda hem müşteri adı hem de ürün sütunu görünüyor mu?
- WHERE koşulu eklendikten sonra satır sayısı beklendiği gibi azaldı mı?
Kendini sına
1) INNER JOIN, iki tablodan hangi satırları getirir?
2) ON kelimesinin sorgu içindeki görevi nedir?
3) İki tabloda aynı isimli bir sütun olduğunda yaşanan hatayı önlemek için ne yapmalıyız?
4) Bir müşterinin sonuç tablosunda birden fazla satırda görünmesinin nedeni ne olabilir?
5) INNER JOIN ile WHERE komutunu aynı sorguda birlikte kullanabilir miyiz?
Cevaplar
1) Yalnızca her iki tabloda da eşleşmesi bulunan satırları getirir; eşleşmeyen satırlar sonuçta görünmez.
2) ON kelimesi, iki tablonun hangi sütunlar üzerinden eşleştirileceğini belirtir; genellikle bir kimlik (ID) sütunudur.
3) Sütun adının önüne tablo adını ve nokta ekleyerek yazmalıyız, örneğin musteriler.musteri_id.
4) O müşteriye ait birden fazla sipariş kaydı vardır; JOIN her siparişi ayrı bir satır olarak gösterir.
5) Evet, INNER JOIN ile oluşturulan birleşik sonuç üzerine WHERE koşulu ekleyerek sonucu daha da daraltabiliriz.
Bu derste iki tabloyu birleştirmeyi öğrendik. Kursun son dersinde, şimdiye kadar öğrendiğiniz SELECT, WHERE, ORDER BY, gruplandırma ve JOIN konularını bir araya getirerek gerçek anlamda okunabilir bir rapor oluşturacağız.
Bu dersi kayıt olmadan izleyebilirsin. İlerlemeni kaydetmek, sertifika almak ve puan tablosuna girmek için ücretsiz üye ol: Kayıt Ol