Đây là một câu hỏi rất phổ biến, vì vậy câu trả lời này dựa trên bài viết này tôi đã viết.
Bảng mối quan hệ
Xét chúng ta có những điều sau đây post
và post_comment
bảng:
Có post
các hồ sơ sau đây:
| id | title |
|----|-----------|
| 1 | Java |
| 2 | Hibernate |
| 3 | JPA |
và post_comment
có ba hàng sau:
| id | review | post_id |
|----|-----------|---------|
| 1 | Good | 1 |
| 2 | Excellent | 1 |
| 3 | Awesome | 2 |
SQL tham gia
Mệnh đề SQL THAM GIA cho phép bạn liên kết các hàng thuộc về các bảng khác nhau. Chẳng hạn, CROSS THAM GIA sẽ tạo ra Sản phẩm Cartesian chứa tất cả các kết hợp hàng có thể có giữa hai bảng tham gia.
Mặc dù CROSS THAM GIA hữu ích trong một số trường hợp nhất định, nhưng hầu hết thời gian, bạn muốn tham gia các bảng dựa trên một điều kiện cụ thể. Và, đó là nơi INNER THAM GIA phát huy tác dụng.
SQL INNER THAM GIA cho phép chúng tôi lọc Sản phẩm của Cartesian khi nối hai bảng dựa trên một điều kiện được chỉ định thông qua mệnh đề ON.
SQL INNER THAM GIA - Điều kiện "luôn luôn đúng"
Nếu bạn cung cấp một điều kiện "luôn luôn đúng", INNER THAM GIA sẽ không lọc các bản ghi đã tham gia và tập kết quả sẽ chứa Sản phẩm Cartesian của hai bảng tham gia.
Chẳng hạn, nếu chúng ta thực hiện truy vấn SQL INNER THAM GIA sau đây:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
INNER JOIN post_comment pc ON 1 = 1
Chúng tôi sẽ nhận được tất cả các kết hợp post
và post_comment
hồ sơ:
| p.id | pc.id |
|---------|------------|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
Vì vậy, nếu điều kiện mệnh đề ON là "luôn luôn đúng", INNER THAM GIA đơn giản tương đương với truy vấn CROSS THAM GIA:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
CROSS JOIN post_comment
WHERE 1 = 1
ORDER BY p.id, pc.id
SQL INNER THAM GIA - Điều kiện "luôn luôn sai"
Mặt khác, nếu điều kiện mệnh đề ON là "luôn luôn sai", thì tất cả các bản ghi đã tham gia sẽ được lọc ra và tập kết quả sẽ trống.
Vì vậy, nếu chúng tôi thực hiện truy vấn SQL INNER THAM GIA sau đây:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
INNER JOIN post_comment pc ON 1 = 0
ORDER BY p.id, pc.id
Chúng tôi sẽ không nhận được bất kỳ kết quả nào:
| p.id | pc.id |
|---------|------------|
Đó là vì truy vấn trên tương đương với truy vấn CROSS THAM GIA sau:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
CROSS JOIN post_comment
WHERE 1 = 0
ORDER BY p.id, pc.id
SQL INNER THAM GIA - Mệnh đề ON sử dụng các cột Khóa ngoài và Khóa chính
Điều kiện mệnh đề ON phổ biến nhất là điều kiện khớp với cột Khóa ngoài trong bảng con với cột Khóa chính trong bảng cha, như được minh họa bằng truy vấn sau:
SELECT
p.id AS "p.id",
pc.post_id AS "pc.post_id",
pc.id AS "pc.id",
p.title AS "p.title",
pc.review AS "pc.review"
FROM post p
INNER JOIN post_comment pc ON pc.post_id = p.id
ORDER BY p.id, pc.id
Khi thực hiện truy vấn SQL INNER THAM GIA ở trên, chúng ta sẽ nhận được tập kết quả sau:
| p.id | pc.post_id | pc.id | p.title | pc.review |
|---------|------------|------------|------------|-----------|
| 1 | 1 | 1 | Java | Good |
| 1 | 1 | 2 | Java | Excellent |
| 2 | 2 | 3 | Hibernate | Awesome |
Vì vậy, chỉ các bản ghi khớp với điều kiện mệnh đề ON mới được đưa vào tập kết quả truy vấn. Trong trường hợp của chúng tôi, tập kết quả chứa tất cả post
cùng với post_comment
hồ sơ của họ . Các post
hàng không có liên kết post_comment
được loại trừ vì chúng không thể đáp ứng điều kiện ON ON.
Một lần nữa, truy vấn SQL INNER THAM GIA ở trên tương đương với truy vấn CROSS THAM GIA sau đây:
SELECT
p.id AS "p.id",
pc.post_id AS "pc.post_id",
pc.id AS "pc.id",
p.title AS "p.title",
pc.review AS "pc.review"
FROM post p, post_comment pc
WHERE pc.post_id = p.id
Các hàng không bị tấn công là những hàng thỏa mãn mệnh đề WHERE và chỉ những bản ghi này sẽ được đưa vào tập kết quả. Đó là cách tốt nhất để hình dung cách hoạt động của mệnh đề INNER THAM GIA.
| p.id | pc.post_id | pc.id | tiêu đề | pc.review |
| ------ | ------------ | ------- | ----------- | --------- - |
| 1 | 1 | 1 | Java | Tốt
| 1 | 1 | 2 | Java | Tuyệt vời |
| 1 | 2 | 3 | Java | Tuyệt vời |
| 2 | 1 | 1 | Ngủ đông | Tốt
| 2 | 1 | 2 | Ngủ đông | Tuyệt vời |
| 2 | 2 | 3 | Ngủ đông | Tuyệt vời |
| 3 | 1 | 1 | JPA | Tốt
| 3 | 1 | 2 | JPA | Tuyệt vời |
| 3 | 2 | 3 | JPA | Tuyệt vời |
Phần kết luận
Một câu lệnh INNER THAM GIA có thể được viết lại dưới dạng CROSS THAM GIA với mệnh đề WHERE khớp với cùng một điều kiện bạn đã sử dụng trong mệnh đề ON của truy vấn INNER THAM GIA.
Không phải điều này chỉ áp dụng cho INNER THAM GIA, không áp dụng cho OUTER THAM GIA.