Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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
adtutartarih
Ahmet500.002024-01-15
Mehmet750.002024-01-20
Ahmet300.002024-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
adtutar
Ahmet500.00
Ahmet300.00
Mehmet750.00
AyşeNULL
FatmaNULL

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
adtutarmusteri_id
Ahmet500.001
Mehmet750.002
Ahmet300.001
NULL100.005

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
adtutar
Ahmet500.00
Ahmet300.00
Mehmet750.00
AyşeNULL
FatmaNULL
NULL100.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 ON koş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
adsehir
Ahmetİstanbul
MehmetAnkara

Siparişi olan müşteriler. IN veya EXISTS alt 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
adsehir
Ayşeİzmir
FatmaBursa

Hiç siparişi olmayan müşteriler. NOT IN veya NOT EXISTS alt 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
idtutarmusteri_id
104100.005

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:

StratejiKullanım Durumu
Hash JoinEşitlik koşulu (ON a.id = b.id), büyük tablolar
Nested LoopEşitsizlik koşulları, küçük tablolar
Sort-Merge JoinHer iki tablo sıralı olduğunda

Sorgu planını görmek için EXPLAIN kullanılabilir:

EXPLAIN SELECT m.ad, s.tutar
FROM musteriler m JOIN siparisler s ON m.id = s.musteri_id