Хотя ответы, объясняющие точные различия, хороши, я хочу показать, как реляционная алгебра преобразуется в SQL и какова действительная ценность этих трех концепций.
Ключевой концепцией в вашем вопросе является идея объединения. Чтобы понять объединение, вам нужно понять декартово произведение (пример основан на SQL, где эквивалент называется перекрестным соединением, как указывает один день);
Это не очень полезно на практике. Рассмотрим этот пример.
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
Декартово произведение Продукт x Компонент будет - ниже или sql fiddle . Вы можете видеть, что есть 12 рядов = 3 x 4. Очевидно, что строки типа «Ноутбук» с «колесами» не имеют значения, поэтому на практике редко используется декартово произведение.
| 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 |
СОЕДИНЕНИЯ здесь для того, чтобы повысить ценность этих продуктов. На самом деле мы хотим «объединить» продукт со связанными с ним компонентами, потому что каждый компонент принадлежит продукту. Это можно сделать с помощью соединения:
Product JOIN Component ON Pname
Соответствующий SQL-запрос будет выглядеть следующим образом (вы можете поиграть со всеми примерами здесь )
SELECT *
FROM Product
JOIN Component
ON Product.Pname = Component.Pname
и результат:
| PNAME | PRICE | CNAME | COST |
----------------------------------
| Laptop | 1500 | CPU | 500 |
| Laptop | 1500 | hdd | 300 |
| Laptop | 1500 | case | 700 |
| Car | 20000 | wheels | 1000 |
Обратите внимание, что результат имеет только 4 строки, потому что у ноутбука 3 компонента, у автомобиля 1 и у самолета нет. Это гораздо полезнее.
Возвращаясь к вашим вопросам, все объединения, о которых вы спрашиваете, являются вариантами соединения, которое я только что показал:
Естественное объединение = объединение (предложение ON) выполняется для всех столбцов с одинаковым именем; он удаляет дубликаты столбцов из результата, в отличие от всех других объединений; большинство СУБД (систем баз данных, созданных различными поставщиками, такими как Microsoft SQL Server, Oracle MySQL и т. д.) даже не утруждают себя поддержкой, это просто плохая практика (или намеренно отказались от ее реализации). Представьте, что приходит разработчик и меняет имя второго столбца в разделе «Продукт» с «Цена на стоимость». Тогда все естественные объединения будут выполнены в PName AND на Cost, что приведет к 0 строкам, поскольку ни одно число не соответствует.
Theta Join = это общее объединение, которое используют все, потому что оно позволяет вам указать условие (предложение ON в SQL). Вы можете присоединиться практически к любым условиям, которые вам нравятся, например, к продуктам, которые имеют первые две одинаковые буквы или имеют другую цену. На практике это случается редко - в 95% случаев вы присоединитесь к условию равенства, что приводит нас к:
Equi Join = самый распространенный метод, используемый на практике. Пример выше - это равное соединение. Базы данных оптимизированы для этого типа соединений! Противоположность равноправного соединения - это неэквивалентное соединение, т. Е. Когда вы присоединяетесь при условии, отличном от «=». Базы данных не оптимизированы для этого! Они оба являются подмножествами общего тэта-соединения. Естественное соединение также является тета-соединением, но условие (тета) неявно.
Источник информации: университет + сертифицированный разработчик SQL Server + недавно завершил MOO "Введение в базы данных" из Стэнфорда, поэтому, смею сказать, у меня свежая реляционная алгебра.