Mặc dù các câu trả lời giải thích sự khác biệt chính xác là tốt, nhưng tôi muốn chỉ ra cách đại số quan hệ được chuyển đổi sang SQL và giá trị thực của 3 khái niệm là gì.
Khái niệm chính trong câu hỏi của bạn là ý tưởng về sự tham gia. Để hiểu một phép nối, bạn cần hiểu một Sản phẩm Descartes (ví dụ dựa trên SQL trong đó phép tương đương được gọi là phép nối chéo như onedaywhen đã chỉ ra);
Điều này không hữu ích trong thực tế. Hãy xem xét ví dụ này.
Product(PName, Price)
====================
Laptop, 1500
Car, 20000
Airplane, 3000000
Component(PName, CName, Cost)
=============================
Laptop, CPU, 500
Laptop, hdd, 300
Laptop, case, 700
Car, wheels, 1000
Sản phẩm Descartes Sản phẩm x Thành phần sẽ là - dưới đây hoặc sql fiddle . Bạn có thể thấy có 12 hàng = 3 x 4. Rõ ràng, các hàng như "Máy tính xách tay" với "bánh xe" không có ý nghĩa gì, đây là lý do tại sao trong thực tế, sản phẩm Descartes hiếm khi được sử dụng.
| PNAME | PRICE | CNAME | COST |
--------------------------------------
| Laptop | 1500 | CPU | 500 |
| Laptop | 1500 | hdd | 300 |
| Laptop | 1500 | case | 700 |
| Laptop | 1500 | wheels | 1000 |
| Car | 20000 | CPU | 500 |
| Car | 20000 | hdd | 300 |
| Car | 20000 | case | 700 |
| Car | 20000 | wheels | 1000 |
| Airplane | 3000000 | CPU | 500 |
| Airplane | 3000000 | hdd | 300 |
| Airplane | 3000000 | case | 700 |
| Airplane | 3000000 | wheels | 1000 |
Tham gia ở đây để tăng thêm giá trị cho các sản phẩm này. Những gì chúng tôi thực sự muốn là "kết hợp" sản phẩm với các thành phần liên quan của nó, bởi vì mỗi thành phần thuộc về một sản phẩm. Cách để làm điều này là với một tham gia:
Thành phần THAM GIA SẢN PHẨM TRÊN Pname
Truy vấn SQL được liên kết sẽ giống như thế này (bạn có thể chơi với tất cả các ví dụ ở đây )
SELECT *
FROM Product
JOIN Component
ON Product.Pname = Component.Pname
và kết quả:
| PNAME | PRICE | CNAME | COST |
----------------------------------
| Laptop | 1500 | CPU | 500 |
| Laptop | 1500 | hdd | 300 |
| Laptop | 1500 | case | 700 |
| Car | 20000 | wheels | 1000 |
Lưu ý rằng kết quả chỉ có 4 hàng, vì Máy tính xách tay có 3 thành phần, Ô tô có 1 và Máy bay không có. Điều này hữu ích hơn nhiều.
Quay trở lại câu hỏi của bạn, tất cả các phép nối mà bạn hỏi đều là các biến thể của THAM GIA mà tôi vừa hiển thị:
Natural Join = phép nối (mệnh đề ON) được tạo trên tất cả các cột có cùng tên; nó loại bỏ các cột trùng lặp khỏi kết quả, trái ngược với tất cả các phép nối khác; hầu hết các DBMS (hệ thống cơ sở dữ liệu được tạo bởi các nhà cung cấp khác nhau như SQL Server của Microsoft, MySQL của Oracle, v.v.) thậm chí không quan tâm đến việc hỗ trợ điều này, nó chỉ là một thực tiễn xấu (hoặc cố tình chọn không triển khai nó). Hãy tưởng tượng rằng một nhà phát triển đến và thay đổi tên của cột thứ hai trong Sản phẩm từ Giá thành Chi phí. Sau đó, tất cả các phép nối tự nhiên sẽ được thực hiện trên PName VÀ trên Chi phí, dẫn đến 0 hàng vì không có số nào khớp.
Theta Join = đây là phép nối chung mà mọi người sử dụng vì nó cho phép bạn chỉ định điều kiện (mệnh đề ON trong SQL). Bạn có thể tham gia với bất kỳ điều kiện nào bạn thích, chẳng hạn như trên Sản phẩm có 2 chữ cái đầu tiên giống nhau hoặc có giá khác. Trong thực tế, điều này hiếm khi xảy ra - trong 95% trường hợp, bạn sẽ tham gia với điều kiện bình đẳng, dẫn đến việc:
Trang bị Tham gia = cái phổ biến nhất được sử dụng trong thực tế. Ví dụ trên là một phép nối trang bị. Cơ sở dữ liệu được tối ưu hóa cho loại liên kết này! Kết hợp của phép nối trang bị là phép nối không trang bị, tức là khi bạn tham gia với một điều kiện khác với "=". Cơ sở dữ liệu không được tối ưu hóa cho việc này! Cả hai đều là tập hợp con của tham gia theta chung. Phép nối tự nhiên cũng là phép nối theta nhưng điều kiện (theta) là ngầm định.
Nguồn thông tin: trường đại học + nhà phát triển SQL Server được chứng nhận + gần đây đã hoàn thành MOO "Giới thiệu về cơ sở dữ liệu" từ Stanford, vì vậy tôi dám khẳng định rằng tôi đã nghĩ đến đại số quan hệ.