- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
İ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.
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ı.")
Bu kod bloğu, iki farklı tablodaki veriyi ortak bir anahtar (ID) üzerinden birleştirerek anlamlı bir sonuç kümesi elde etmeyi gösterir.
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.
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.
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.
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.
Yorumlar
Yorum Gönder