У меня проблемы с пониманием реляционной алгебры, когда речь идет о тета-соединениях, равных соединениях и естественных соединениях. Может ли кто-нибудь помочь мне лучше понять это? Если я использую знак = для тета-соединения, будет ли это то же самое, что и обычное соединение?
sql
database
relational-database
relational-algebra
маклунианец
источник
источник
Ответы:
Тета присоединиться допускает произвольные отношения сравнения (таких как ≥).
Эквисоединения является тэта присоединиться с помощью оператора равенства.
Естественное соединение является эквисоединением атрибутов , которые имеют такое же имя , в каждом отношениях.
Кроме того, естественное соединение удаляет повторяющиеся столбцы, участвующие в сравнении равенства, поэтому остается только 1 из каждого сравниваемого столбца; в грубых реляционно-алгебраических терминах:
⋈ = πR,S-as ○ ⋈aR=aS
источник
theta
тета-соединение относится к произвольному условию, используемому в качестве критерия для соединения. (см. «Системы баз данных: Полная книга» Гарсиа-Молина, Ульман, Уидом, глава 2, ТетаХотя ответы, объясняющие точные различия, прекрасны, я хочу показать, как реляционная алгебра преобразуется в SQL и какова реальная ценность трех концепций.
Ключевым понятием в вашем вопросе является идея соединения. Чтобы понять соединение, вам необходимо понимать декартово произведение (пример основан на SQL, где эквивалент называется перекрестным соединением, как указано на один день);
На практике это не очень полезно. Рассмотрим этот пример.
Декартово произведение 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 |
Присоединяйтесь к нам, чтобы повысить ценность этих продуктов. На самом деле мы хотим «соединить» продукт со связанными с ним компонентами, потому что каждый компонент принадлежит продукту. Это можно сделать с помощью соединения:
Соответствующий запрос 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 «Введение в базы данных» из Стэнфорда, поэтому я осмелюсь сказать, что у меня в голове свежая реляционная алгебра.
источник
CROSS JOIN
Результатом операции в SQL является табличное выражение (строки столбцов). Операция над множеством Декартово произведение приводит к набору пар.SELECT * FROM...
(и, возможно, вы это делаете). Но он есть в языке, он есть в каждой реализации SQL, и я часто его использую (и держу пари, что вы тоже!). Подсказка, не весь код является производственным.Ответ @outis хороший: лаконичный и правильный в отношении отношений.
Однако с SQL ситуация несколько сложнее.
Рассмотрим обычную базу данных поставщиков и запчастей, но реализованную на SQL:
SELECT * FROM S NATURAL JOIN SP;
вернет набор результатов ** со столбцами
SNO, SNAME, STATUS, CITY, PNO, QTY
Соединение выполняется для столбца с тем же именем в обеих таблицах
SNO
. Обратите внимание, что в наборе результатов есть шесть столбцов и только один столбец дляSNO
.Теперь рассмотрим theta eqijoin, в котором имена столбцов для соединения должны быть явно указаны (плюс переменные диапазона
S
иSP
обязательны):SELECT * FROM S JOIN SP ON S.SNO = SP.SNO;
В наборе результатов будет семь столбцов, включая два столбца для
SNO
. Имена набора результатов - это то, что в стандарте SQL называется «зависимым от реализации», но они могут выглядеть так:SNO, SNAME, STATUS, CITY, SNO, PNO, QTY
или возможно это
S.SNO, SNAME, STATUS, CITY, SP.SNO, PNO, QTY
Другими словами,
NATURAL JOIN
в SQL можно рассмотреть возможность удаления столбцов с повторяющимися именами из набора результатов (но, увы, не удалит повторяющиеся строки - вы должны не забыть изменитьSELECT
наSELECT DISTINCT
себя).** Я не совсем знаю, каков результат
SELECT * FROM table_expression;
. Я знаю, что это не отношение, потому что, помимо прочего, в нем могут быть столбцы с повторяющимися именами или столбец без имени. Я знаю, что это не набор, потому что, помимо прочего, важен порядок столбцов. Это даже не таблица SQL или табличное выражение SQL. Я называю это набором результатов.источник
JOIN ... USING(...)
.SELECT * FROM table_expression;
» ?Natural - это подмножество Equi, которое является подмножеством Theta.
Не обязательно, но это будет Equi. Natural означает, что вы сопоставляете все столбцы с одинаковыми именами, Equi просто означает, что вы используете исключительно '=' (а не 'меньше чем', например и т. Д.)
Тем не менее, это чисто академическое сообщество, вы можете годами работать с реляционными базами данных и никогда не слышать, чтобы кто-нибудь использовал эти термины.
источник
Theta Join: когда вы делаете запрос на соединение с использованием любого оператора (например, =, <,>,> = и т. Д.), Тогда этот запрос соединения попадает в Theta join.
Equi Join: когда вы делаете запрос на соединение, используя только оператор равенства, тогда этот запрос соединения попадает в Equi join.
Пример:
Примечание: Equi join также является тета-соединением!
Естественное соединение: тип Equi Join, который происходит неявно путем сравнения всех столбцов с одинаковыми именами в обеих таблицах.
Примечание: здесь результат соединения имеет только один столбец для каждой пары столбцов с одинаковыми именами.
пример
источник
Декартово произведение двух таблиц дает все возможные комбинации кортежей, как в математическом примере - произведение двух наборов. поскольку много раз есть некоторые ненужные значения, которые также занимают ненужное место в памяти, поэтому здесь на помощь приходят объединения, которые дают комбинацию только тех значений атрибутов, которые требуются и имеют смысл.
внутреннее соединение дает повторяющееся поле в таблице дважды, тогда как естественное объединение здесь решает проблему, просто отфильтровывая повторяющиеся столбцы и отображая их только один раз. в противном случае оба работают одинаково. Естественное соединение более эффективно, поскольку оно сохраняет память. Кроме того, при естественном соединении удаляются избыточности.
Equi join двух таблиц таковы, что они отображают только те кортежи, которые соответствуют значению в другой таблице. например: пусть new1 и new2 будут двумя таблицами. если sql-запрос выберите * из new1, присоединитесь к new2 на new1.id = new.id (id - это тот же столбец в двух таблицах), затем начните с таблицы new2 и присоединитесь, которая соответствует идентификатору во второй таблице. кроме того, у неэквивалентного соединения нет оператора равенства, который есть у них <,> и между оператором.
theta join состоит из всех операторов сравнения, включая оператор равенства и другие операторы сравнения <,>. когда он использует оператор равенства (=), он известен как равное соединение.
источник
Естественное соединение: естественное соединение возможно, когда в двух отношениях есть хотя бы один общий атрибут.
Тета-соединение: Тета-соединение возможно, когда двое действуют при определенных условиях.
Equi Join: Equi может быть возможен, когда двое действуют при условии справедливости. Это один из типов тета-соединения.
источник