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
- musteriler2 tablosuna “Ali” adında yeni bir müşteri ekle (telefon boş olsun).
- 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.
- Her müşterinin kaç sipariş verdiğini listele (
COUNTkullan).
Sıradaki
Tabloları öğrendin. Şimdi altyapıyı kodla yazmayı görüyoruz →