Разница между этими двумя подходами к объединению таблицы? - PullRequest
16 голосов
/ 14 марта 2011

Предположим, у нас есть две таблицы: Users и Posts. user_id - это внешний ключ в таблице Posts и первичный ключ в таблице Users.

В чем разница между этими двумя SQL-запросами?

select user.name, post.title 
  from users as user, posts as post 
 where post.user_id = user.user_id;

против

select user.name, post.title 
  from users as user join posts as post using user_id;

Ответы [ 4 ]

14 голосов
/ 14 марта 2011

Кроме синтаксиса, для небольшого фрагмента они работают точно так же.Но, если это вообще возможно, всегда пишите новые запросы, используя ANSI-JOIN.

Что касается семантической формы, то запятая нотация используется для создания продукта CARTESIAN между двумя таблицами, что означает создание матрицы всех записей из таблицы Aсо всеми записями из таблицы B, поэтому две таблицы с 4 и 6 записями соответственно создают 24 записи.Используя предложение WHERE, вы можете выбрать строки, которые вам действительно нужны, из этого декартового произведения.Тем не менее, MySQL фактически не выполняет и не создает эту огромную матрицу, но семантически это то, что он означает.

Синтаксис JOIN - это стандарт ANSI, который более четко определяет, как взаимодействуют таблицы.Помещая предложение ON рядом с JOIN, он проясняет, что связывает две таблицы.

Функционально они будут выполнять то же самое для двух ваших запросов.Разница возникает, когда вы начинаете использовать другие типы [OUTER] JOIN.

В частности, для MySQL запятая имеет одно отличие

STRAIGHT_JOIN аналогичноJOIN, за исключением того, что левая таблица всегда читается перед правой таблицей.Это может быть использовано в тех (немногих) случаях, когда оптимизатор объединения размещает таблицы в неправильном порядке.

Однако было бы неразумно рассчитывать на эту разницу.

4 голосов
/ 14 марта 2011
where post.user_id = user.user_id

Здесь вы делаете условное заявление

from users as user join posts as post using user_id

Здесь вы объединяете две таблицы, используя внешний ключ

В конце то же самое, но JOIN лучше использовать для более сложных запросов ...

3 голосов
/ 14 марта 2011

В MySQL Синтаксис JOIN , CROSS JOIN, INNER JOIN и JOIN одинаковы. Список таблиц, разделенных запятыми: JOIN.

0 голосов
/ 17 октября 2018

Руководство MySQL на странице https://dev.mysql.com/doc/refman/5.5/en/join.html подчеркивает разницу между этими двумя подходами:

Однако приоритет оператора запятой меньше, чем у ВНУТРЕННЕЕ СОЕДИНЕНИЕ, КРЕСТНОЕ СОЕДИНЕНИЕ, ЛЕВОЕ СОЕДИНЕНИЕ и т. Д. Если вы смешиваете запятые с другими типами соединения, когда есть условие соединения, ошибка может появиться форма Неизвестный столбец 'col_name' в 'on условии'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...