Chociaż odpowiedzi wyjaśniające dokładne różnice są w porządku, chcę pokazać, jak algebra relacyjna jest przekształcana na SQL i jaka jest rzeczywista wartość trzech pojęć.
Kluczowym pojęciem w Twoim pytaniu jest idea złączenia. Aby zrozumieć sprzężenie, musisz zrozumieć iloczyn kartezjański (przykład jest oparty na SQL, gdzie odpowiednik nazywa się sprzężeniem krzyżowym, jak onedaywhen);
W praktyce nie jest to zbyt przydatne. Rozważmy ten przykład.
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
Produkt kartezjański Produkt x składnik będzie - bellow lub sql fiddle . Widać, że jest tam 12 rzędów = 3 x 4. Oczywiście rzędy typu „Laptop” z „kółkami” nie mają żadnego znaczenia, dlatego w praktyce iloczyn kartezjański jest rzadko używany.
| 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 |
JOINs są tutaj, aby zwiększyć wartość tych produktów. To, czego naprawdę chcemy, to „połączenie” produktu z powiązanymi z nim komponentami, ponieważ każdy komponent należy do produktu. Aby to zrobić, użyj sprzężenia:
Produkt DOŁĄCZ Komponent NA Pname
Skojarzone zapytanie SQL wyglądałoby tak (możesz pobawić się wszystkimi przykładami tutaj )
SELECT *
FROM Product
JOIN Component
ON Product.Pname = Component.Pname
a wynik:
| PNAME | PRICE | CNAME | COST |
| Laptop | 1500 | CPU | 500 |
| Laptop | 1500 | hdd | 300 |
| Laptop | 1500 | case | 700 |
| Car | 20000 | wheels | 1000 |
Zwróć uwagę, że wynik ma tylko 4 rzędy, ponieważ laptop ma 3 komponenty, samochód ma 1, a samolot żadnego. Jest to o wiele bardziej przydatne.
Wracając do pytań, wszystkie połączenia, o które pytasz, są odmianami JOIN, które właśnie pokazałem:
Natural Join = łączenie (klauzula ON) jest wykonywane na wszystkich kolumnach o tej samej nazwie; usuwa zduplikowane kolumny z wyniku, w przeciwieństwie do wszystkich innych łączeń; większość DBMS (systemy bazodanowe stworzone przez różnych dostawców, takich jak Microsoft SQL Server, Oracle MySQL itp.) nawet nie przejmuje się tym wsparciem, jest to po prostu zła praktyka (lub celowo zdecydowała się jej nie implementować). Wyobraź sobie, że programista przychodzi i zmienia nazwę drugiej kolumny produktu z ceny na koszt. Wtedy wszystkie naturalne łączenia byłyby wykonywane na PName AND na koszcie, dając w wyniku 0 wierszy, ponieważ żadne liczby nie pasują.
Theta Join = jest to ogólne łączenie, którego wszyscy używają, ponieważ pozwala określić warunek (klauzula ON w SQL). Możesz dołączyć na prawie dowolnych warunkach, na przykład na produktach, które mają podobne pierwsze 2 litery lub mają inną cenę. W praktyce rzadko się to zdarza - w 95% przypadków dołączysz na warunku równości, co prowadzi nas do:
Equi Join = najczęściej używane w praktyce. Powyższy przykład to sprzężenie equi. Bazy danych są zoptymalizowane pod kątem tego typu złączeń! Przeciwieństwem sprzężenia equi jest sprzężenie nierównomierne, tj. Gdy łączysz się pod warunkiem innym niż „=”. Bazy danych nie są do tego zoptymalizowane! Oba są podzbiorami ogólnego złączenia theta. Naturalne sprzężenie jest również złączeniem theta, ale warunek (theta) jest niejawny.
Źródło informacji: uniwersytet + certyfikowany programista SQL Server + niedawno ukończył MOO „Wprowadzenie do baz danych” ze Stanford, więc śmiem powiedzieć, że mam świeżo na myśli algebrę relacyjną.