MySQL JOIN Cheatsheet

Test için 2 tablo – yani 2 küme – kullanacağız. Örnekleri takip etmesi kolay olsun diye ikişer eleman verdim. Şimdi test ön gereksinimlerini gerçekleştirelim:

CREATE TABLE IF NOT EXISTS A (
    id INT(10) NOT NULL PRIMARY KEY,
    name VARCHAR(32) NOT NULL
) ENGINE = MEMORY;
CREATE TABLE IF NOT EXISTS B (
    id INT(10) NOT NULL PRIMARY KEY,
    name VARCHAR(32) NOT NULL
) ENGINE = MEMORY;
TRUNCATE TABLE A;
TRUNCATE TABLE B;
INSERT INTO A (id, name) VALUES (1, 'I');
INSERT INTO A (id, name) VALUES (2, 'II');
INSERT INTO B (id, name) VALUES (1, 'I');
INSERT INTO B (id, name) VALUES (3, 'III');

Tablolarımızın durumu şöyle:

-- Yalnız A:
SELECT * FROM A;
Yalnız A
-- Yalnız B:
SELECT * FROM B;
Yalnız B

Gelelim JOIN ‘lere. Yalnızca temel JOIN işlemlerini tanıtacağım. Bunlar transactional DB işlemlerinde en çok lazım olan JOIN deklarasyonlarıdır. A ve B kümeleri yalnızca id ‘lerden müteşekkildir. name alanı ile işimiz yok. Onu meta olarak düşünün.

A Kesişim B Birleşim A Kesişim B (INNER JOIN)

INNER JOIN

A kesişim B kümesi; yani A ve B kümelerinin kesişim kümesi; yani A kümesindeki id ‘ler ile B kümesindeki id ‘lerden ortak olanların kümesi; yani A tablosundaki satırlar ile B tablosundaki satırlardan aynı id ‘ye sahip olanlarının eşleşerek birleştirilmiş hali.

-- A kesişim B birleşim A kesişim B (INNER JOIN using id):
SELECT A.*, B.* FROM A INNER JOIN B ON (A.id = B.id);
INNER JOIN

Aynı sonucu INNER kelimesini kullanmadan da elde edebilirsiniz:

-- JOIN using id = INNER JOIN using id:
SELECT A.*, B.* FROM A JOIN B ON (A.id = B.id);

Şartsız bir NATURAL JOIN ise tam olarak kesişim kümesini verir:

-- Şartsız NATURAL JOIN:
SELECT * FROM A NATURAL JOIN B;

A Birleşim A Kesişim B (LEFT JOIN)

LEFT OUTER JOIN

A birleşim A kesişim B; yani A kümesi ile A ve B kümelerinin kesişim kümesi; yani A kümesindeki id ‘ler ile birlikte A kümesindeki id ‘ler ile B kümesindeki id ‘lerden ortak olanların kümesi; yani A tablosundaki satırlar ile birlikte A tablosundaki satırlar ile B tablosundaki satırlardan aynı id ‘ye sahip olanlarının eşleşerek birleştirilmiş hali.

-- A birleşim A kesişim B (LEFT OUTER JOIN using id):
SELECT A.*, B.* FROM A LEFT OUTER JOIN B ON (A.id = B.id);
LEFT OUTER JOIN

Solda tüm A tablosu satırlarını görüyorsunuz. Sağda ise yalnızca ortak id ‘li satır(lar) var. Sağdaki null değer(ler)i farkettiniz mi? İşte onlar A fark B kümesinin B tarafında bir karşılığının olmadığının ifadesi.

Aynı sonucu OUTER kelimesini kullanmadan da elde edebilirsiniz:

-- LEFT JOIN = LEFT OUTER JOIN:
SELECT A.*, B.* FROM A LEFT JOIN B ON (A.id = B.id);

B Birleşim B Kesişim A (RIGHT JOIN)

RIGHT OUTER JOIN

B birleşim B kesişim A; yani B kümesi ile B ve A kümelerinin kesişim kümesi; yani B kümesindeki id ‘ler ile birlikte B kümesindeki id ‘ler ile A kümesindeki id ‘lerden ortak olanların kümesi; yani B tablosundaki satırlar ile birlikte B tablosundaki satırlar ile A tablosundaki satırlardan aynı id ‘ye sahip olanlarının eşleşerek birleştirilmiş hali.

-- B birleşim B kesişim A (RIGHT OUTER JOIN using id):
SELECT A.*, B.* FROM A RIGHT OUTER JOIN B ON (A.id = B.id);
RIGHT OUTER JOIN

Yine aynı sonucu OUTER kelimesini kullanmadan da elde edebilirsiniz:

-- RIGHT JOIN = RIGHT OUTER JOIN:
SELECT A.*, B.* FROM A RIGHT JOIN B ON (A.id = B.id);

RIGHT JOIN Kullanmak Zorunda mıyım?

Hayır. RIGHT JOIN yerine LEFT JOIN kullanabilirsiniz. A yerine B, B yerine A yazarsanız mesele kalmaz.

-- A RIGHT JOIN B = B LEFT JOIN A:
SELECT A.*, B.* FROM B LEFT JOIN A ON (B.id = A.id);

Bunu test ettiğinizde önceki ile aynı sonucu elde ettiğinizi göreceksiniz.

A Fark B

A EXCEPT B
-- A fark B:
SELECT A.*, B.* FROM A LEFT JOIN B ON (A.id = B.id) WHERE B.id IS NULL;

B Fark A

B EXCEPT A
-- B fark A:
SELECT A.*, B.* FROM A RIGHT JOIN B ON (A.id = B.id) WHERE A.id IS NULL;

A Fark B Birleşim B Fark A Birleşim A Kesişim B Birleşim A Kesişim B (Full Outer Join)

FULL OUTER JOIN
-- A fark B birleşim B fark A birleşim A kesişim B birleşim A kesişim B (Full Outer Join):
SELECT A.*, B.* FROM A LEFT OUTER JOIN B ON (A.id = B.id)
UNION
SELECT A.*, B.* FROM A RIGHT OUTER JOIN B ON (A.id = B.id);
FULL OUTER JOIN

A Kartezyen B (CROSS JOIN)

-- A kartezyen B (CROSS JOIN):
SELECT A.*, B.* FROM A CROSS JOIN B;
A X B
-- Şartsız JOIN = CROSS JOIN:
SELECT A.*, B.* FROM A JOIN B;

Özetle