Хотя ответы, объясняющие точные различия, прекрасны, я хочу показать, как реляционная алгебра преобразуется в 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
Декартово произведение Product x Component будет ниже или 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 |
Присоединяйтесь к нам, чтобы повысить ценность этих продуктов. На самом деле мы хотим «соединить» продукт со связанными с ним компонентами, потому что каждый компонент принадлежит продукту. Это можно сделать с помощью соединения:
Продукт 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, а у самолета - нет. Это намного полезнее.
Возвращаясь к вашим вопросам, все соединения, о которых вы спрашиваете, являются вариациями JOIN, которые я только что показал:
Естественное соединение = соединение (предложение ON) выполняется для всех столбцов с одинаковым именем; он удаляет повторяющиеся столбцы из результата, в отличие от всех других объединений; большинство СУБД (систем баз данных, созданных различными поставщиками, такими как Microsoft SQL Server, Oracle MySQL и т. д.) даже не заботятся о поддержке этого, это просто плохая практика (или намеренно отказались от ее реализации). Представьте, что разработчик приходит и меняет название второго столбца в Product с Price на Cost. Тогда все естественные соединения будут выполняться по PName И по Cost, что приведет к 0 строкам, поскольку числа не совпадают.
Theta Join = это общее соединение, которое все используют, потому что оно позволяет указать условие (предложение ON в SQL). Вы можете присоединиться практически к любому условию, которое вам нравится, например, к Продуктам, у которых первые 2 буквы совпадают или у которых другая цена. На практике это случается редко - в 95% случаев вы присоединяетесь на условии равенства, что приводит нас к:
Equi Join = наиболее часто используемый на практике. Пример выше - это равное соединение. Базы данных оптимизированы для этого типа объединений! Противоположностью равноправного соединения является неэквивалентное соединение, т. Е. Когда вы соединяетесь с условием, отличным от "=". Базы данных не оптимизированы для этого! Оба они являются подмножествами общего тета-соединения. Естественное соединение также является тета-соединением, но условие (тета) неявно.
Источник информации: университет + сертифицированный разработчик SQL Server + недавно завершил MOO «Введение в базы данных» из Стэнфорда, поэтому я осмелюсь сказать, что у меня в голове свежая реляционная алгебра.