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 B:
SELECT * FROM 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)
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);
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)
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);
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)
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);
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 fark B:
SELECT A.*, B.* FROM A LEFT JOIN B ON (A.id = B.id) WHERE B.id IS NULL;
B Fark 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)
-- 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);
A Kartezyen B (CROSS JOIN)
-- A kartezyen B (CROSS JOIN):
SELECT A.*, B.* FROM A CROSS JOIN B;
-- Şartsız JOIN = CROSS JOIN:
SELECT A.*, B.* FROM A JOIN B;
Özetle
…