Resim

MySQL JOIN (Tabloları Birleştirmek)

MySQL JOIN (Tabloları Birleştirmek)

İlişkisel veritabanlarının temel amacı, veriyi tekrardan kaçınarak farklı tablolara bölmektir. Örneğin, müşteri bilgileri bir tabloda (musteriler), o müşterinin verdiği siparişler ise ayrı bir tabloda (siparisler) tutulur. Ancak, bir müşterinin hangi siparişleri verdiğini görmek istediğimizde, bu iki tabloyu geçici olarak birleştirmemiz gerekir. SQL'de bu birleştirme işlemi, JOIN komutu ile yapılır. Bu bölümde, INNER JOIN kullanarak müşteri isimlerini ait oldukları siparişlerle nasıl eşleştireceğimizi göreceğiz. 

Kodun Tamamı

select_join.py adında yeni bir dosya oluşturalım:
import mysql.connector
from config import DB_CONFIG
try:
    # 1. Veritabanına Bağlanma
    mydb = mysql.connector.connect(**DB_CONFIG)
    mycurser = mydb.cursor()    
    # Not: Bu kodun çalışması için, "musteriler" ve 
    # "siparisler" adında
    # ve aralarında "musteri_id" ile ilişki olan iki tablonun 
    # var olması gerekir.
    # 2. INNER JOIN Sorgusunu Tanımlama
    JOIN_SQL = """
   SELECT
   m.isim,         -- musteriler tablosundaki isim
   s.urun_adi,     -- siparisler tablosundaki urun_adi
   s.tutar         -- siparisler tablosundaki tutar
   FROM
   musteriler m    -- musteriler tablosuna 'm' takma adı verdik
   INNER JOIN
   siparisler s    -- siparisler tablosuna 's' takma adı verdik
   ON
   m.id =s.musteri_id --Hangi sütunların eşleştirileceğini belirtiriz
  """    
    # 3. Sorguyu Çalıştırma
    mycurser.execute(JOIN_SQL)    
    # 4. Sonuçları Çekme
    sonuclar = mycurser.fetchall()    
    # 5. Sonuçları Yazdırma
    if sonuclar:
        print("\n--MÜŞTERİ ve SİPARİŞ BİLGİLERİ (Birleştirilmiş)--")
        for kayit in sonuclar:
            # kayit[0] = m.isim, kayit[1] = s.urun_adi, 
            # kayit[2] = s.tutar
            print(f"İsim: {kayit[0]}, Ürün Adı: {kayit[1]}, Tutar: {kayit[2]}")
    else:
        print("Eşleşen kayıt bulunamadı.")        
except mysql.connector.Error as err:
    # Genel hataları yakalama
    if err.errno == 1050:
        # Eğer 'siparisler' tablosu yoksa hata kodu 1146 dönebilir.
        #(Bu durumda hata kodu 1050 değil)
        print("Tablo zaten mevcut (veya bağlantı hatası)")
    else:
        print(f"Bağlantı/İşlem hatası: {err}")
        print("Lütfen bağlantı ayarlarını ve tablo isimlerini kontrol edin.")
finally:
    # Bağlantıları kapatma
    if 'mycurser' in locals() and mycurser:
        mycurser.close()
    if 'mydb' in locals() and mydb and mydb.is_connected():
        mydb.close()
        print("MySQL bağlantısı kapatıldı.")

Kodun Açıklaması

Bu kod bloğu, iki farklı tablodaki veriyi ortak bir anahtar (ID) üzerinden birleştirerek anlamlı bir sonuç kümesi elde etmeyi gösterir.

  1. Tablo Takma Adları (Aliases):

    • Sorgu içinde musteriler m ve siparisler s ifadeleri kullanılmıştır. Bu, tablolara m ve s gibi kısa takma adlar vermemizi sağlar.

    • SELECT bölümünde m.isim ve s.urun_adi gibi ifadelerle hangi sütunun hangi tablodan geldiğini açıkça belirtiriz. Bu, aynı isimli sütunlar olduğunda karışıklığı önler.

  2. INNER JOIN Komutu:

    • INNER JOIN siparisler s: Bu komut, musteriler ve siparisler tablolarını birleştirmemizi söyler.

    • ON m.id = s.musteri_id: Bu, birleştirmenin kuralıdır. musteriler tablosundaki id sütunu ile siparisler tablosundaki musteri_id sütunu eşleşiyorsa, bu iki tablonun satırlarını yan yana getirir.

  3. INNER JOIN'in Özelliği:

    • INNER JOIN, yalnızca her iki tabloda da eşleşen kaydı olan satırları döndürür. Örneğin, hiç sipariş vermemiş bir müşteri varsa veya musteri_id'si olmayan bir sipariş kaydı varsa, bu kayıtlar sonuç kümesinde yer almaz.

  4. Veri Çekme ve İşleme:

    • mycurser.fetchall() ile birleştirilmiş tüm kayıtlar çekilir. Her bir kayıt, musteri ve siparis bilgilerini içeren tek bir büyük tuple'dır.

    • for kayit in sonuclar: döngüsü ile bu birleşik bilgiler ekrana yazdırılır.

Bu yöntem, raporlama, faturalandırma ve karmaşık sorgu ihtiyaçlarınız için veritabanı işlemlerinde ustalaşmanın bir sonraki adımıdır.

📹ÖĞRENDİKLERİNİZİ PEKİŞTİRİN:
Hemen aşağıdaki videomuza tıklayın. Adım adım ilerleyerek öğrendiklerinizi görsel olarak pekiştirin ve bir sonraki konuya hatasız bir şekilde geçin!



Yorumlar

Bu blogdaki popüler yayınlar

Python random Modülü

Python print()

Yazılım Nedir?