Tôi có 2 bảng như thế này:
> SELECT * FROM table_a;
+------+------+
| id | name |
+------+------+
| 1 | row1 |
| 2 | row2 |
+------+------+
> SELECT * FROM table_b;
+------+------+------+
| id | name | aid |
+------+------+------+
| 3 | row3 | 1 |
| 4 | row4 | 1 |
| 5 | row5 | NULL |
+------+------+------+
INNER THAM GIA quan tâm đến cả hai bảng
INNER THAM GIA quan tâm đến cả hai bảng, vì vậy bạn chỉ nhận được một hàng nếu cả hai bảng có một. Nếu có nhiều cặp khớp nhau, bạn sẽ có nhiều hàng.
> SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
+------+------+------+------+------+
Sẽ không có gì khác biệt với INNER THAM GIA nếu bạn đảo ngược thứ tự, bởi vì nó quan tâm đến cả hai bảng:
> SELECT * FROM table_b b INNER JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
+------+------+------+------+------+
Bạn nhận được các hàng giống nhau, nhưng các cột theo thứ tự khác nhau vì chúng tôi đã đề cập các bảng theo thứ tự khác nhau.
TRÁI PHIẾU chỉ quan tâm đến bảng đầu tiên
LEFT THAM GIA quan tâm đến bảng đầu tiên bạn cung cấp và không quan tâm nhiều đến bảng thứ hai, vì vậy bạn luôn nhận được các hàng từ bảng đầu tiên, ngay cả khi không có hàng tương ứng trong bảng thứ hai:
> SELECT * FROM table_a a LEFT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
| 2 | row2 | NULL | NULL | NULL |
+------+------+------+------+------+
Ở trên, bạn có thể thấy tất cả các hàng của bảng_a mặc dù một số trong số chúng không khớp với bất kỳ thứ gì trong bảng b, nhưng không phải tất cả các hàng của bảng_b - chỉ những hàng khớp với thứ gì đó trong bảng_a.
Nếu chúng ta đảo ngược thứ tự của các bảng, LEFT THAM GIA hành xử khác nhau:
> SELECT * FROM table_b b LEFT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
| 5 | row5 | NULL | NULL | NULL |
+------+------+------+------+------+
Bây giờ chúng ta nhận được tất cả các hàng của bảng_b, nhưng chỉ khớp với các hàng của bảng_a.
RIGHT THAM GIA chỉ quan tâm đến bảng thứ hai
a RIGHT JOIN b
giúp bạn chính xác các hàng giống như b LEFT JOIN a
. Sự khác biệt duy nhất là thứ tự mặc định của các cột.
> SELECT * FROM table_a a RIGHT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id | name | id | name | aid |
+------+------+------+------+------+
| 1 | row1 | 3 | row3 | 1 |
| 1 | row1 | 4 | row4 | 1 |
| NULL | NULL | 5 | row5 | NULL |
+------+------+------+------+------+
Đây là các hàng giống như table_b LEFT JOIN table_a
, mà chúng ta đã thấy trong phần TRÁI PHIẾU.
Tương tự:
> SELECT * FROM table_b b RIGHT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 4 | row4 | 1 | 1 | row1 |
| NULL | NULL | NULL | 2 | row2 |
+------+------+------+------+------+
Là các hàng giống như table_a LEFT JOIN table_b
.
Không tham gia nào mang lại cho bạn bản sao của tất cả mọi thứ
Mệnh đề không tham gia: Nếu bạn viết các bảng không có mệnh đề THAM GIA, chỉ cần phân tách bằng dấu phẩy, bạn sẽ nhận được mọi hàng của bảng đầu tiên được viết bên cạnh mỗi hàng của bảng thứ hai, trong mọi kết hợp có thể:
> SELECT * FROM table_b, table_a;
+------+------+------+------+------+
| id | name | aid | id | name |
+------+------+------+------+------+
| 3 | row3 | 1 | 1 | row1 |
| 3 | row3 | 1 | 2 | row2 |
| 4 | row4 | 1 | 1 | row1 |
| 4 | row4 | 1 | 2 | row2 |
| 5 | row5 | NULL | 1 | row1 |
| 5 | row5 | NULL | 2 | row2 |
+------+------+------+------+------+
(Đây là từ bài đăng trên blog của tôi Ví dụ về các loại tham gia SQL )