Có, tôi sử dụng cả ba trong số các JOIN đó, mặc dù tôi có xu hướng chỉ sử dụng LEFT (OUTER) JOIN
s thay vì trộn giữa các THAM GIA TRÁI và PHẢI. Tôi cũng sử dụng FULL OUTER JOIN
s và CROSS JOIN
s.
Tóm lại, một INNER JOIN
chỉ giới hạn tập kết quả đối với những bản ghi được thỏa mãn bởi điều kiện JOIN. Hãy xem xét các bảng sau
CHỈNH SỬA: Tôi đã đổi tên tên Bảng và đặt tiền tố chúng bằng @
để các Biến trong Bảng có thể được sử dụng cho bất kỳ ai đọc câu trả lời này và muốn thử nghiệm.
Nếu bạn cũng muốn thử nghiệm điều này trong trình duyệt, Tôi đã thiết lập tất cả điều này trên SQL Fiddle quá;
@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
Mã 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');
INNER JOIN
Câu lệnh SQL, được kết hợp trên id
lĩnh vực
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
INNER JOIN
@Table2 t2
ON
t1.id = t2.id
Kết quả trong
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
LEFT JOIN
sẽ trả về một tập hợp kết quả với tất cả các bản ghi từ bảng ở phía bên trái của phép nối (nếu bạn viết câu lệnh dưới dạng một lớp lót, bảng sẽ xuất hiện đầu tiên) và các trường từ bảng ở phía bên phải của phép nối khớp với biểu thức nối và được bao gồm trong SELECT
mệnh đề. Thiếu chi tiết sẽ được điền bằng NULL
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
LEFT JOIN
@Table2 t2
ON
t1.id = t2.id
Kết quả trong
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
4 | Four | NULL
RIGHT JOIN
là logic tương tự như LEFT JOIN
nhưng sẽ trả về tất cả các bản ghi từ phía bên phải của phép nối và các trường từ phía bên trái khớp với biểu thức phép nối và được bao gồm trong SELECT
mệnh đề.
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
RIGHT JOIN
@Table2 t2
ON
t1.id = t2.id
Kết quả trong
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
NULL| NULL| Gold Rings
Tất nhiên, cũng có FULL OUTER JOIN
, bao gồm các bản ghi từ cả hai bảng đã kết hợp và điền bất kỳ thiếu nào chi tiết với NULL.
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
FULL OUTER JOIN
@Table2 t2
ON
t1.id = t2.id
Kết quả trong
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
4 | Four | NULL
NULL| NULL| Gold Rings
Và một CROSS JOIN
(còn được gọi là CARTESIAN PRODUCT
), đơn giản là sản phẩm của việc áp dụng chéo các trường trong SELECT
từ một bảng với các trường trong SELECT
tuyên bố từ bảng khác. Lưu ý rằng không có biểu thức nối trong CROSS JOIN
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
CROSS JOIN
@Table2 t2
Kết quả trong
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
CHỈNH SỬA:
Hãy tưởng tượng bây giờ có một Table3
@Table3
id | name
---------
2 | Prime 1
3 | Prime 2
5 | Prime 3
Mã 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');
Bây giờ cả ba bảng đều được kết hợp với 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
Kết quả trong
id | name | name | name
-------------------------------
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
Có thể hữu ích khi hiểu kết quả này bằng cách nghĩ rằng các bản ghi có id 2 và 3 là những bản ghi duy nhất chung cho cả 3 bảng và cũng là lĩnh vực chúng tôi đang tham gia mỗi bảng.
Bây giờ cả ba với LEFT JOIN
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
Kết quả trong
id | name | name | name
-------------------------------
1 | One | Partridge | NULL
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
4 | Four | NULL | NULL
Câu trả lời của Joel là một lời giải thích tốt cho việc giải thích tập kết quả này (Table1 là bảng cơ sở / nguồn gốc).
Bây giờ với INNER JOIN
và 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
Kết quả trong
id | name | name | name
-------------------------------
1 | One | Partridge | NULL
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
Mặc dù chúng tôi không biết thứ tự mà trình tối ưu hóa truy vấn sẽ thực hiện các hoạt động, chúng tôi sẽ xem xét truy vấn này từ trên xuống dưới để hiểu tập kết quả. INNER JOIN
trên id giữa Table1 và Table2 sẽ hạn chế tập kết quả chỉ những bản ghi được thỏa mãn bởi điều kiện nối, tức là ba hàng mà chúng ta đã thấy trong ví dụ đầu tiên. Điều này tạm thời tập kết quả sau đó sẽ là LEFT JOIN
ed thành Table3 trên id giữa Table1 và Tables; Có các bản ghi trong Table3 với id 2 và 3, nhưng không phải id 1, vì vậy trường t3.name sẽ có chi tiết cho 2 và 3 chứ không phải 1.