Modül 1 · Container & Temel Altyapı · ⏱ 6 dk

JOIN: iki defteri yapıştırmak

JOIN gluing two notebooks

Bu derste neler öğreneceksin

  • INNER JOIN farkını açıklar
  • LEFT JOIN ne zaman kullanılır
  • Müşteri + sipariş birleştirir

İki Defteri Yapıştırmak: JOIN

Elif’in işleri büyüdü. Artık sadece içecek değil, müşteri bilgilerini ayrı bir yerde, siparişleri ayrı bir yerde tutuyor. Neden? Çünkü Ayşe 5 kere geldi, hep aynı numarayı yazmak istemiyor. Bir kere yaz, sonra hep oradan çağır.

İki ayrı defteri var:

  • Müşteriler defteri: id, isim, telefon, adres
  • Siparişler defteri: id, musteri_id, icecek, fiyat, tarih

Bugünkü soru: “Bu iki defteri nasıl birleştiririm, tek tabloda görebileyim?”

JOIN = Yapıştırıcı

JOIN iki tabloyu yan yana getirir, ortak bir sütuna bakarak. Ortak sütun bizim durumda musteri_id. Müşteri defterinde id, sipariş defterinde musteri_id. Bunlar “eşleşiyor”.

İki tabloyu şöyle kur (psql’de çalıştır):

CREATE TABLE musteriler2 (
  id SERIAL PRIMARY KEY,
  isim TEXT NOT NULL,
  telefon TEXT
);

CREATE TABLE siparisler (
  id SERIAL PRIMARY KEY,
  musteri_id INT REFERENCES musteriler2(id),
  icecek TEXT NOT NULL,
  fiyat NUMERIC(5,2) NOT NULL,
  tarih DATE NOT NULL DEFAULT CURRENT_DATE
);

INSERT INTO musteriler2 (isim, telefon) VALUES
  ('Ayşe', '0532-111-1111'),
  ('Mehmet', '0533-222-2222'),
  ('Zeynep', '0534-333-3333');

INSERT INTO siparisler (musteri_id, icecek, fiyat) VALUES
  (1, 'Limonata', 25.00),
  (1, 'Nane Limonata', 30.00),
  (2, 'Çilekli Limonata', 35.00),
  (3, 'Klasik Limonata', 25.00),
  (1, 'Buzlu Limonata', 28.00);

Ayşe (id=1) üç sipariş verdi, Mehmet (id=2) bir, Zeynep (id=3) bir. Toplam 5 sipariş.

INNER JOIN: İkisinde de Olanlar

SELECT musteriler2.isim, siparisler.icecek, siparisler.fiyat
FROM siparisler
INNER JOIN musteriler2 ON siparisler.musteri_id = musteriler2.id;

Bu, “sadece her iki tabloda da eşleşen satırları getir” demek. Yani siparişi olan müşteriler. Sonuçta 5 satır görürsün.

LEFT JOIN: Soldaki Hep Gelsin

Bir de şunu düşün: “Hiç sipariş vermemiş müşteriler de görünsün.” Bunun için LEFT JOIN:

SELECT musteriler2.isim, siparisler.icecek
FROM musteriler2
LEFT JOIN siparisler ON musteriler2.id = siparisler.musteri_id;

Bu sefer tüm müşteriler gelir. Siparişi olmayanların yanında içecek sütunu boş (NULL) görünür. Eğer Ali diye bir müşteri eklersen, onun hiç siparişi olmadığı için içeceği boş olur.

Hangi Zaman Hangisi?

  • INNER JOIN: “Sadece aktif müşterileri göster.” (Siparişi olmayanlar görünmesin.)
  • LEFT JOIN: “Tüm müşterileri göster, sipariş vermeyenler de listede olsun (belki ararız).”

Genel kural: Sağ tarafta olmayabilir şeyleri istiyorsan LEFT JOIN. Kesin olmalı diyorsan INNER JOIN.

Müşteri Başına Toplam Harcama

JOIN’i sayma ve gruplama ile birleştirelim. “Her müşteri toplam ne kadar harcamış?”:

SELECT musteriler2.isim, SUM(siparisler.fiyat) AS toplam_harcama
FROM musteriler2
LEFT JOIN siparisler ON musteriler2.id = siparisler.musteri_id
GROUP BY musteriler2.isim
ORDER BY toplam_harcama DESC;

Ayşe en çok harcayan çıkacak. Sebebi açık: 3 sipariş verdi.

Küçük Ödev

  1. musteriler2 tablosuna “Ali” adında yeni bir müşteri ekle (telefon boş olsun).
  2. Ali’nin hiç siparişi yok. INNER JOIN ile Ali görünür mü, LEFT JOIN ile görünür mü? İkisini de dene.
  3. Her müşterinin kaç sipariş verdiğini listele (COUNT kullan).

Sıradaki

Tabloları öğrendin. Şimdi altyapıyı kodla yazmayı görüyoruz →