Spec-Zone .ru
спецификации, руководства, описания, API

13.2.9.2. JOIN Синтаксис

MySQL поддерживает следующий JOIN синтаксисы для table_references часть SELECT операторы и многократная таблица DELETE и UPDATE операторы:

table_references:    escaped_table_reference [, escaped_table_reference] ...escaped_table_reference:    table_reference  | { OJ table_reference }table_reference:    table_factor  | join_tabletable_factor:    tbl_name [PARTITION (partition_names)]         [[AS] alias] [index_hint_list]  | table_subquery [AS] alias  | ( table_references )join_table:    table_reference [INNER | CROSS] JOIN table_factor [join_condition]  | table_reference STRAIGHT_JOIN table_factor  | table_reference STRAIGHT_JOIN table_factor ON conditional_expr  | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition  | table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factorjoin_condition:    ON conditional_expr  | USING (column_list)index_hint_list:    index_hint [, index_hint] ...index_hint:    USE {INDEX|KEY}      [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])  | IGNORE {INDEX|KEY}      [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)  | FORCE {INDEX|KEY}      [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)index_list:    index_name [, index_name] ...

Ссылка на таблицу также известна как выражение соединения.

В MySQL 5.6.2 и позже, ссылка на таблицу (когда это ссылается на разделенную таблицу) может содержать a PARTITION опция, включая список разделенных запятой значений разделов, подразделов, или обоих. Эта опция следует за именем таблицы и предшествует любому объявлению альтернативного имени. Эффект этой опции состоит в том, что строки выбираются только из перечисленных разделов или подразделов — другими словами, любые разделы или подразделы, не названные в списке, игнорируются Для получения дополнительной информации, видят Раздел 18.5, "Выбор Раздела".

Синтаксис table_factor расширяется по сравнению со Стандартом SQL. Последний принимает только table_reference, не список их в паре круглых скобок.

Это - консервативное расширение, если мы рассматриваем каждую запятую в списке table_reference элементы как эквивалентный внутреннему объединению. Например:

SELECT * FROM t1 LEFT JOIN (t2, t3, t4)                 ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)

эквивалентно:

SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)                 ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)

В MySQL, JOIN, CROSS JOIN, и INNER JOIN синтаксические эквиваленты (они могут заменить друг друга). В стандартном SQL они не эквивалентны. INNER JOIN используется с ON пункт, CROSS JOIN используется иначе.

Вообще, круглые скобки могут быть проигнорированы в выражениях соединения, содержащих только операции внутреннего объединения. MySQL также поддерживает вложенные соединения (см. Раздел 8.13.9, "Вложенная Оптимизация Соединения").

Индексируйте подсказки, может быть определен, чтобы влиять, как оптимизатор MySQL использует, индексирует. Для получения дополнительной информации см. Раздел 13.2.9.3, "Индексируйте Синтаксис Подсказки".

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

Некоторые примеры соединения:

SELECT * FROM table1, table2;SELECT * FROM table1 INNER JOIN table2 ON table1.id=table2.id;SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id;SELECT * FROM table1 LEFT JOIN table2 USING (id);SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id  LEFT JOIN table3 ON table2.id=table3.id;

Присоединитесь к Изменениям Обработки в MySQL 5.0.12

Отметить

Естественные соединения и соединения с USING, включая разновидности внешнего объединения, обрабатываются согласно стандарту SQL:2003. Цель состояла в том, чтобы выровнять синтаксис и семантику MySQL относительно NATURAL JOIN и JOIN ... USING согласно SQL:2003. Однако, эти изменения в обработке соединения могут привести к различным выходным столбцам для некоторых соединений. Кроме того, некоторые запросы, которые, казалось, работали правильно в более старых версиях (до 5.0.12) должны быть переписаны, чтобы выполнить стандарт.

У этих изменений есть пять основных аспектов:

Следующий список обеспечивает больше детали, приблизительно несколько эффектов текущей обработки соединения против присоединяются к обработке в более старых версиях. Термин "ранее" означает "до MySQL 5.0.12."