2015-06-23 6 views
0

Я смущен natural join, theta join и inner join, потому что все они имеют тенденцию давать те же результаты для схемы, приведенной ниже.Разница между различными объединениями в SQL

Определение:

Природная присоединиться образует декартово произведение двух аргументов, выполняет выбор принуждая равенство на тех атрибутов, которые появляются в обоих отношения схемы.

Теты соединения является расширением естественной присоединиться к операции, что позволяет нам сочетать выбор и декартово произведение в одной операции

Внутреннее соединения вычисляет тету объединение двух отношений с данным условием соединения.

Рассмотрим схему:

mysql> select * from loan; 
+---------+-------------+--------+ 
| loan_id | branch_name | amount | 
+---------+-------------+--------+ 
| L11  | Round Hill | 900 | 
| L14  | Downtown | 1500 | 
| L15  | Perryridge | 1500 | 
| L16  | Perryridge | 1300 | 
| L17  | Downtown | 1000 | 
| L23  | Redwood  | 2000 | 
| L93  | Mianus  | 500 | 
+---------+-------------+--------+ 
7 rows in set (0.00 sec) 

mysql> select * from borrower; 
+---------------+---------+ 
| customer_name | loan_id | 
+---------------+---------+ 
| Adams   | L16  | 
| Curry   | L93  | 
| Hayes   | L15  | 
| Jackson  | L14  | 
| Jones   | L17  | 
| Smith   | L11  | 
| Smith   | L23  | 
| Williams  | L17  | 
| Adams   | L19  | 
| Adams   | L15  | 
| Jones   | L15  | 
| Williams  | L23  | 
+---------------+---------+ 
12 rows in set (0.00 sec) 

Natual Регистрация

mysql> select * from loan l, borrower b where l.loan_id=b.loan_id; 
+---------+-------------+--------+---------------+---------+ 
| loan_id | branch_name | amount | customer_name | loan_id | 
+---------+-------------+--------+---------------+---------+ 
| L16  | Perryridge | 1300 | Adams   | L16  | 
| L93  | Mianus  | 500 | Curry   | L93  | 
| L15  | Perryridge | 1500 | Hayes   | L15  | 
| L14  | Downtown | 1500 | Jackson  | L14  | 
| L17  | Downtown | 1000 | Jones   | L17  | 
| L11  | Round Hill | 900 | Smith   | L11  | 
| L23  | Redwood  | 2000 | Smith   | L23  | 
| L17  | Downtown | 1000 | Williams  | L17  | 
| L15  | Perryridge | 1500 | Adams   | L15  | 
| L15  | Perryridge | 1500 | Jones   | L15  | 
| L23  | Redwood  | 2000 | Williams  | L23  | 
+---------+-------------+--------+---------------+---------+ 
11 rows in set (0.01 sec) 

Theta Регистрация

mysql> select * from loan l join borrower b on l.loan_id=b.loan_id; 
+---------+-------------+--------+---------------+---------+ 
| loan_id | branch_name | amount | customer_name | loan_id | 
+---------+-------------+--------+---------------+---------+ 
| L16  | Perryridge | 1300 | Adams   | L16  | 
| L93  | Mianus  | 500 | Curry   | L93  | 
| L15  | Perryridge | 1500 | Hayes   | L15  | 
| L14  | Downtown | 1500 | Jackson  | L14  | 
| L17  | Downtown | 1000 | Jones   | L17  | 
| L11  | Round Hill | 900 | Smith   | L11  | 
| L23  | Redwood  | 2000 | Smith   | L23  | 
| L17  | Downtown | 1000 | Williams  | L17  | 
| L15  | Perryridge | 1500 | Adams   | L15  | 
| L15  | Perryridge | 1500 | Jones   | L15  | 
| L23  | Redwood  | 2000 | Williams  | L23  | 
+---------+-------------+--------+---------------+---------+ 
11 rows in set (0.00 sec) 

Inner Регистрация

mysql> select * from loan l inner join borrower b on l.loan_id=b.loan_id; 
+---------+-------------+--------+---------------+---------+ 
| loan_id | branch_name | amount | customer_name | loan_id | 
+---------+-------------+--------+---------------+---------+ 
| L16  | Perryridge | 1300 | Adams   | L16  | 
| L93  | Mianus  | 500 | Curry   | L93  | 
| L15  | Perryridge | 1500 | Hayes   | L15  | 
| L14  | Downtown | 1500 | Jackson  | L14  | 
| L17  | Downtown | 1000 | Jones   | L17  | 
| L11  | Round Hill | 900 | Smith   | L11  | 
| L23  | Redwood  | 2000 | Smith   | L23  | 
| L17  | Downtown | 1000 | Williams  | L17  | 
| L15  | Perryridge | 1500 | Adams   | L15  | 
| L15  | Perryridge | 1500 | Jones   | L15  | 
| L23  | Redwood  | 2000 | Williams  | L23  | 
+---------+-------------+--------+---------------+---------+ 
11 rows in set (0.01 sec) 

Все запросы возвращают один и тот же результат. В чем разница между ними?

+1

Разница только в синтаксисе. Если вы объясняете расширенные и показываете предупреждения (способ увидеть, как именно оптимизатор выполняет запрос), все эти запросы переписываются в один и тот же запрос. – piotrm

+0

Нечего путать. В MySQL эти три запроса * идентичны *. Нет никакой разницы, кроме использования синтаксиса синтаксиса старой школы для операции объединения, используя (более новое) ключевое слово 'JOIN', включение ключевого слова' INNER', которое не имеет никакого влияния, или предикат указан в 'ON 'или предложение WHERE'. Помимо некоторых поверхностных изменений синтаксиса, три оператора * идентичны *. Мы ожидаем, что все три утверждения вернут тот же результат. – spencer7593

ответ

1
  • В естественном соединении имя и домен соединения атрибута должны быть одинаковыми.

  • В внутреннем соединение только домен присоединения атрибута должен быть такими же

  • тета позволяет объединить произвольные отношения сравнения (например, ≥).

2

https://en.wikipedia.org/wiki/Relational_algebra

Обеспечивает лучшее объяснение различных объединений вы пытаетесь понять.

Естественное соединение - это самый простой вид соединений между двумя наборами. Первичный ключ и соответствующий внешний ключ кортежей из двух наборов сравниваются для равенства для получения объединенного набора кортежей.

Как пользователь @amalamalpm отметил:

тета присоединиться позволяет для произвольных отношений сравнения.

Поскольку соединение theta допускает произвольные сравнения, естественное объединение можно рассматривать как подмножество тета-соединения.

Внутреннее соединение представляет собой реализацию sql тета-соединения и, таким образом, используется всякий раз, когда используется естественное соединение.

Примечание: В mysql вы можете сделать следующее, чтобы получить естественное соединение. Это требует меньше персонажей, и его предпочитают люди, которые ленивы (как и я).

select * from loan natural join borrower 

Это также приведет к удалению дубликатов поля loan_id, которая существует в обеих наборах (т.е. показывает только один раз в множестве результатов).

Три способа, которыми вы пишете свой запрос, все пытаются получить одинаковый набор результатов.

Вы делаете естественное соединение >> которое является подмножеством тета-соединения >>, которое является внутренним соединением в sql-языке.

Так что mysql дает вам тот же результат. Я не запускал explain extended на них, поэтому я не могу ручаться за это,, но я бы предположил, что mysql выполняет запросы одинаково.

+0

@ spencer7593, в то время как примерные запросы, предоставленные OP, идентичны, существует концептуальная разница между естественным соединением, equi join, тета-объединением в теории реляционной алгебры и * внутренним соединением *, которое является просто sql-talk. –

0

В MySQL все три этих запроса идентичны.

select * from loan l, borrower b where l.loan_id=b.loan_id; 

    select * from loan l join borrower b on l.loan_id=b.loan_id; 

    select * from loan l inner join borrower b on l.loan_id=b.loan_id; 

На практике каждый из этих запросов являются равностепенными присоединяется.


«В теории нет никакой разницы между теорией и практикой. На практике существует»

Применение теоретических меток, таких как «естественный», «тета» и «внутренний» ничего не меняет о том, что все три этих утверждения идентичны. Все три заявления делают то же самое.

В первом утверждении используется только синтаксис синтаксиса старой школы для операции соединения. Запятая в этом первом утверждении эквивалентна ключевому слову JOIN.

В MySQL INNER JOIN является синонимом JOIN. То есть, добавление или удаление ключевого слова INNER не влияет.

И предикат - предикат - это предикат. Возвращаемые строки должны удовлетворять условию, не имеет значения, указано ли условие в предложении ON или в предложении WHERE (в случае внутреннего соединения).

Смежные вопросы