Разница между этими двумя подходами к столу?

Рассмотрим две таблицы: 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;

Ответы

Ответ 1

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

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

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

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

Для MySQL специально для запятой имеет одну разницу

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

Тем не менее, он не был бы разумным для банка по этой разнице.

Ответ 2

where post.user_id = user.user_id

Здесь вы делаете условное утверждение

from users as user join posts as post using user_id

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

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

Ответ 3

В MySQL Синтаксис JOIN, CROSS JOIN, INNER JOIN и JOIN - все те же. Список таблиц, разделенных запятыми, представляет собой STRAIGHT_JOIN, который почти идентичен JOIN, за исключением того, что левая таблица всегда читается первой. Согласно руководству, это полезно "для тех (нескольких) случаев, для которых оптимизатор объединения помещает таблицы в неправильном порядке".