Я смущен 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)
Все запросы возвращают один и тот же результат. В чем разница между ними?
Разница только в синтаксисе. Если вы объясняете расширенные и показываете предупреждения (способ увидеть, как именно оптимизатор выполняет запрос), все эти запросы переписываются в один и тот же запрос. – piotrm
Нечего путать. В MySQL эти три запроса * идентичны *. Нет никакой разницы, кроме использования синтаксиса синтаксиса старой школы для операции объединения, используя (более новое) ключевое слово 'JOIN', включение ключевого слова' INNER', которое не имеет никакого влияния, или предикат указан в 'ON 'или предложение WHERE'. Помимо некоторых поверхностных изменений синтаксиса, три оператора * идентичны *. Мы ожидаем, что все три утверждения вернут тот же результат. – spencer7593