Ya, saya menggunakan ketiga JOIN tersebut, meskipun saya cenderung menggunakan LEFT (OUTER) JOIN
s alih-alih mencampurkan LEFT dan RIGHT JOIN. Saya juga menggunakan FULL OUTER JOIN
s dan CROSS JOIN
s.
Singkatnya, sebuah INNER JOIN
membatasi resultet hanya untuk record-record yang dipenuhi oleh kondisi JOIN. Perhatikan tabel berikut
EDIT: Saya telah mengganti nama nama Tabel dan mengawalinya dengan @
sehingga Variabel Tabel dapat digunakan untuk siapa saja yang membaca jawaban ini dan ingin bereksperimen.
Jika Anda juga ingin bereksperimen dengan ini di browser, Saya telah menyiapkan semuanya di SQL Fiddle juga;
@Table1
id | name
---------
1 | One
2 | Two
3 | Three
4 | Four
@Table2
id | name
---------
1 | Partridge
2 | Turtle Doves
3 | French Hens
5 | Gold Rings
Kode SQL
DECLARE @Table1 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
INSERT INTO @Table1 VALUES(1, 'One');
INSERT INTO @Table1 VALUES(2, 'Two');
INSERT INTO @Table1 VALUES(3, 'Three');
INSERT INTO @Table1 VALUES(4, 'Four');
DECLARE @Table2 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
INSERT INTO @Table2 VALUES(1, 'Partridge');
INSERT INTO @Table2 VALUES(2, 'Turtle Doves');
INSERT INTO @Table2 VALUES(3, 'French Hens');
INSERT INTO @Table2 VALUES(5, 'Gold Rings');
Sebuah INNER JOIN
Pernyataan SQL, bergabung pada id
bidang
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
INNER JOIN
@Table2 t2
ON
t1.id = t2.id
Hasil dalam
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
LEFT JOIN
akan mengembalikan hasil dengan semua catatan dari tabel di sisi kiri gabungan (jika Anda menulis pernyataan sebagai satu baris, tabel yang muncul lebih dulu) dan bidang dari tabel di sisi kanan gabungan yang cocok dengan ekspresi gabungan dan disertakan dalam SELECT
ayat. Hilang detail akan diisi dengan NULL
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
LEFT JOIN
@Table2 t2
ON
t1.id = t2.id
Hasil dalam
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
4 | Four | NULL
RIGHT JOIN
adalah logika yang sama dengan LEFT JOIN
tetapi akan mengembalikan semua catatan dari sisi kanan gabungan dan bidang dari sisi kiri yang cocok dengan ekspresi gabungan dan disertakan dalam SELECT
klausa.
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
RIGHT JOIN
@Table2 t2
ON
t1.id = t2.id
Hasil dalam
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
NULL| NULL| Gold Rings
Tentu saja, ada juga FULL OUTER JOIN
, yang menyertakan catatan dari kedua tabel yang digabungkan dan mengisi yang hilang detail dengan NULL.
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
FULL OUTER JOIN
@Table2 t2
ON
t1.id = t2.id
Hasil dalam
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
4 | Four | NULL
NULL| NULL| Gold Rings
Dan CROSS JOIN
(juga dikenal sebagai CARTESIAN PRODUCT
), yang hanya merupakan produk dari bidang penerapan silang di SELECT
pernyataan dari satu tabel dengan bidang di SELECT
pernyataan dari tabel lainnya. Perhatikan bahwa tidak ada ekspresi gabungan dalam CROSS JOIN
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
CROSS JOIN
@Table2 t2
Hasil dalam
id | name | name
------------------
1 | One | Partridge
2 | Two | Partridge
3 | Three | Partridge
4 | Four | Partridge
1 | One | Turtle Doves
2 | Two | Turtle Doves
3 | Three | Turtle Doves
4 | Four | Turtle Doves
1 | One | French Hens
2 | Two | French Hens
3 | Three | French Hens
4 | Four | French Hens
1 | One | Gold Rings
2 | Two | Gold Rings
3 | Three | Gold Rings
4 | Four | Gold Rings
EDIT:
Bayangkan sekarang ada Table3
@Table3
id | name
---------
2 | Prime 1
3 | Prime 2
5 | Prime 3
Kode SQL
DECLARE @Table3 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
INSERT INTO @Table3 VALUES(2, 'Prime 1');
INSERT INTO @Table3 VALUES(3, 'Prime 2');
INSERT INTO @Table3 VALUES(5, 'Prime 3');
Sekarang ketiga tabel bergabung dengan INNER JOINS
SELECT
t1.id,
t1.name,
t2.name,
t3.name
FROM
@Table1 t1
INNER JOIN
@Table2 t2
ON
t1.id = t2.id
INNER JOIN
@Table3 t3
ON
t1.id = t3.id
Hasil dalam
id | name | name | name
-------------------------------
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
Mungkin membantu untuk memahami hasil ini dengan berpikir bahwa catatan dengan id 2 dan 3 adalah satu-satunya yang umum untuk semua 3 tabel dan juga merupakan bidang tempat kita bergabung di setiap tabel.
Sekarang ketiganya dengan LEFT JOINS
SELECT
t1.id,
t1.name,
t2.name,
t3.name
FROM
@Table1 t1
LEFT JOIN
@Table2 t2
ON
t1.id = t2.id
LEFT JOIN
@Table3 t3
ON
t1.id = t3.id
Hasil dalam
id | name | name | name
-------------------------------
1 | One | Partridge | NULL
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
4 | Four | NULL | NULL
Jawaban Joel adalah penjelasan yang baik untuk menjelaskan hasil ini (Tabel1 adalah tabel dasar/asal).
Sekarang dengan INNER JOIN
dan LEFT JOIN
SELECT
t1.id,
t1.name,
t2.name,
t3.name
FROM
@Table1 t1
INNER JOIN
@Table2 t2
ON
t1.id = t2.id
LEFT JOIN
@Table3 t3
ON
t1.id = t3.id
Hasil dalam
id | name | name | name
-------------------------------
1 | One | Partridge | NULL
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
Meskipun kami tidak mengetahui urutan pengoptimal kueri yang akan melakukan operasi, kami akan melihat kueri ini dari atas ke bawah untuk memahami kumpulan hasil. INNER JOIN
pada id antara Table1 dan Table2 akan membatasi resultet hanya untuk record yang dipenuhi oleh kondisi join yaitu tiga baris yang kita lihat pada contoh pertama. Ini sementara resultset akan menjadi LEFT JOIN
ed ke Tabel3 pada id antara Tabel1 dan Tabel; Ada catatan di Tabel3 dengan id 2 dan 3, tetapi bukan id 1, jadi bidang t3.name akan memiliki detail untuk 2 dan 3 tetapi bukan 1.