JOIN Türleri
MenzeletDB 10 farklı JOIN türünü destekler. JOIN stratejisi optimizer tarafından otomatik seçilir.
Örnek Tablolar
Bu bölümdeki tüm örnekler aşağıdaki tablolara dayanır:
-- Tablo tanımları
CREATE TABLE musteriler (id INT NOT NULL, ad VARCHAR, sehir VARCHAR)
CREATE TABLE siparisler (id INT NOT NULL, musteri_id INT, tutar FLOAT, tarih DATE)
CREATE TABLE urunler (id INT NOT NULL, ad VARCHAR, fiyat FLOAT)
CREATE TABLE siparis_detay (siparis_id INT, urun_id INT, miktar INT)
-- Örnek veriler
INSERT INTO musteriler VALUES (1, 'Ahmet', 'İstanbul')
INSERT INTO musteriler VALUES (2, 'Mehmet', 'Ankara')
INSERT INTO musteriler VALUES (3, 'Ayşe', 'İzmir')
INSERT INTO musteriler VALUES (4, 'Fatma', 'Bursa')
INSERT INTO siparisler VALUES (101, 1, 500.00, '2024-01-15')
INSERT INTO siparisler VALUES (102, 2, 750.00, '2024-01-20')
INSERT INTO siparisler VALUES (103, 1, 300.00, '2024-02-10')
INSERT INTO siparisler VALUES (104, 5, 100.00, '2024-02-15')
1. INNER JOIN
Her iki tabloda eşleşen satırları döner.
SELECT m.ad, s.tutar, s.tarih
FROM musteriler m
INNER JOIN siparisler s ON m.id = s.musteri_id
| ad | tutar | tarih |
|---|---|---|
| Ahmet | 500.00 | 2024-01-15 |
| Mehmet | 750.00 | 2024-01-20 |
| Ahmet | 300.00 | 2024-02-10 |
musteri_id=5 (siparisler) ve id=3,4 (musteriler) eşleşme olmadığı için sonuçta yer almaz.
2. LEFT OUTER JOIN
Sol tablodaki tüm satırları döner; sağda eşleşme yoksa NULL.
SELECT m.ad, s.tutar
FROM musteriler m
LEFT JOIN siparisler s ON m.id = s.musteri_id
| ad | tutar |
|---|---|
| Ahmet | 500.00 |
| Ahmet | 300.00 |
| Mehmet | 750.00 |
| Ayşe | NULL |
| Fatma | NULL |
Ayşe ve Fatma’nın siparişi yok ama sonuçta yer alır (tutar = NULL).
3. RIGHT OUTER JOIN
Sağ tablodaki tüm satırları döner; solda eşleşme yoksa NULL.
SELECT m.ad, s.tutar, s.musteri_id
FROM musteriler m
RIGHT JOIN siparisler s ON m.id = s.musteri_id
| ad | tutar | musteri_id |
|---|---|---|
| Ahmet | 500.00 | 1 |
| Mehmet | 750.00 | 2 |
| Ahmet | 300.00 | 1 |
| NULL | 100.00 | 5 |
musteri_id=5 olan siparişin müşterisi yok (ad = NULL).
4. FULL OUTER JOIN
Her iki tablodaki tüm satırları döner; eşleşme yoksa NULL.
SELECT m.ad, s.tutar
FROM musteriler m
FULL OUTER JOIN siparisler s ON m.id = s.musteri_id
| ad | tutar |
|---|---|
| Ahmet | 500.00 |
| Ahmet | 300.00 |
| Mehmet | 750.00 |
| Ayşe | NULL |
| Fatma | NULL |
| NULL | 100.00 |
5. CROSS JOIN
Kartezyen çarpım — her satır diğer tablodaki her satırla eşleşir.
SELECT m.ad, u.ad AS urun
FROM musteriler m
CROSS JOIN urunler u
4 müşteri x N ürün = 4N satır sonuç.
6. NATURAL JOIN
Aynı isimli sütunlarda otomatik eşleşme yapar.
-- Her iki tabloda 'id' sütunu varsa otomatik eşleşir
SELECT * FROM musteriler NATURAL JOIN siparisler
Dikkat: Sütun isimlerinin tam olarak eşleşmesi gerekir. Beklenmedik sonuçlara yol açabileceğinden açık
ONkoşulu tercih edilir.
7. LEFT SEMI JOIN
Sol tabloda sağla eşleşen satırları döner; sağ tablo sütunları dahil edilmez.
SELECT m.ad, m.sehir
FROM musteriler m
LEFT SEMI JOIN siparisler s ON m.id = s.musteri_id
| ad | sehir |
|---|---|
| Ahmet | İstanbul |
| Mehmet | Ankara |
Siparişi olan müşteriler.
INveyaEXISTSalt sorgusunun performanslı alternatifi.
Eşdeğer standart SQL:
SELECT ad, sehir FROM musteriler
WHERE id IN (SELECT musteri_id FROM siparisler)
8. RIGHT SEMI JOIN
Sağ tabloda solla eşleşen satırları döner; sol tablo sütunları dahil edilmez.
SELECT s.id, s.tutar
FROM musteriler m
RIGHT SEMI JOIN siparisler s ON m.id = s.musteri_id
9. LEFT ANTI JOIN
Sol tabloda sağla eşleşmeyen satırları döner.
SELECT m.ad, m.sehir
FROM musteriler m
LEFT ANTI JOIN siparisler s ON m.id = s.musteri_id
| ad | sehir |
|---|---|
| Ayşe | İzmir |
| Fatma | Bursa |
Hiç siparişi olmayan müşteriler.
NOT INveyaNOT EXISTSalt sorgusunun performanslı alternatifi.
Eşdeğer standart SQL:
SELECT ad, sehir FROM musteriler
WHERE id NOT IN (SELECT musteri_id FROM siparisler)
10. RIGHT ANTI JOIN
Sağ tabloda solla eşleşmeyen satırları döner.
SELECT s.id, s.tutar, s.musteri_id
FROM musteriler m
RIGHT ANTI JOIN siparisler s ON m.id = s.musteri_id
| id | tutar | musteri_id |
|---|---|---|
| 104 | 100.00 | 5 |
Müşteri kaydı olmayan (geçersiz müşteri ID) siparişler.
Çoklu JOIN
SELECT m.ad AS musteri,
u.ad AS urun,
sd.miktar,
u.fiyat * sd.miktar AS toplam
FROM siparisler s
INNER JOIN musteriler m ON s.musteri_id = m.id
INNER JOIN siparis_detay sd ON s.id = sd.siparis_id
INNER JOIN urunler u ON sd.urun_id = u.id
ORDER BY toplam DESC
Self JOIN
Aynı tabloyu kendisiyle birleştirir:
-- Aynı şehirdeki müşteri çiftleri
SELECT a.ad AS musteri1, b.ad AS musteri2, a.sehir
FROM musteriler a
INNER JOIN musteriler b ON a.sehir = b.sehir AND a.id < b.id
JOIN Optimizasyonu
MenzeletDB optimizer’ı JOIN stratejisini otomatik seçer:
| Strateji | Kullanım Durumu |
|---|---|
| Hash Join | Eşitlik koşulu (ON a.id = b.id), büyük tablolar |
| Nested Loop | Eşitsizlik koşulları, küçük tablolar |
| Sort-Merge Join | Her iki tablo sıralı olduğunda |
Sorgu planını görmek için
EXPLAINkullanılabilir:EXPLAIN SELECT m.ad, s.tutar FROM musteriler m JOIN siparisler s ON m.id = s.musteri_id