MySQL поддерживает следующий синтаксис оператора JOIN
при использовании в
командах SELECT
:
table_reference, table_reference table_reference [CROSS] JOIN table_reference table_reference INNER JOIN table_reference join_condition table_reference STRAIGHT_JOIN table_reference table_reference LEFT [OUTER] JOIN table_reference join_condition table_reference LEFT [OUTER] JOIN table_reference table_reference NATURAL [LEFT [OUTER]] JOIN table_reference { OJ table_reference LEFT OUTER JOIN table_reference ON conditional_expr } table_reference RIGHT [OUTER] JOIN table_reference join_condition table_reference RIGHT [OUTER] JOIN table_reference table_reference NATURAL [RIGHT [OUTER]] JOIN table_reference
где table_reference
определено, как:
table_name [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | [FORCE INDEX (key_list)]]
и join_condition
определено, как:
ON conditional_expr | USING (column_list)
В большинстве случаев не следует указывать в части ON
какие бы то ни
было условия, накладывающие ограничения на строки в наборе результатов (из
этого правила есть исключения). Если необходимо указать, какие строки должны
присутствовать в результате, следует сделать это в выражении WHERE
.
Необходимо учитывать, что в версиях до 3.23.17 оператор INNER JOIN
не
принимает параметр join_condition
!
Наличие последней из приведенных выше конструкций выражения LEFT OUTER JOIN
обусловлено только требованиями совместимости с ODBC:
-
Вместо ссылки на таблицу может использоваться псевдоним, который присваивается при помощи выражений
tbl_name AS alias_name
илиtbl_name alias_name
:mysql> SELECT t1.name, t2.salary FROM employee AS t1, info AS t2 WHERE t1.name = t2.name;
Условный оператор
ON
представляет собой условие в любой форме из числа тех, которые можно использовать в выраженииWHERE
.-
Если запись для правой таблицы в частях
ON
илиUSING
вLEFT JOIN
не найдена, то для данной таблицы используется строка, в которой все столбцы установлены вNULL
. Эту возможность можно применять для нахождения результатов в таблице, не имеющей эквивалента в другой таблице:mysql> SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL;
Этот пример находит все строки в таблице
table1
с величинойid
, которая не присутствует в таблицеtable2
(т.е. все строки вtable1
, для которых нет соответствующих строк вtable2
). Конечно, это предполагает, чтоtable2.id
объявлен какNOT NULL
. See Раздел 5.2.6, «Как MySQL оптимизируетLEFT JOIN
иRIGHT JOIN
». -
USING (column_list)
служит для указания списка столбцов, которые должны существовать в обеих таблицах. Такое выражениеUSING
, как:A LEFT JOIN B USING (C1,C2,C3,...)
семантически идентично выражению
ON
, например:A.C1=B.C1 AND A.C2=B.C2 AND A.C3=B.C3,...
Выражение
NATURAL [LEFT] JOIN
для двух таблиц определяется так, чтобы оно являлось семантическим эквивалентомINNER JOIN
илиLEFT JOIN
с выражениемUSING
, в котором указаны все столбцы, имеющиеся в обеих таблицах.INNER JOIN
и,
(запятая) являются семантическими эквивалентами. Оба осуществляют полное объединение используемых таблиц. Способ связывания таблиц обычно задается в условииWHERE
.RIGHT JOIN
работает аналогичноLEFT JOIN
. Для сохранения переносимости кода между различными базами данных рекомендуется вместоRIGHT JOIN
использоватьLEFT JOIN
.STRAIGHT_JOIN
идентичноJOIN
, за исключением того, что левая таблица всегда читается раньше правой. Это выражение может использоваться для тех (немногих) случаев, когда оптимизатор объединения располагает таблицы в неправильном порядке.-
Начиная с версии MySQL 3.23.12, можно давать MySQL указания о том, какой индекс должен использоваться при извлечении информации из таблицы. Эта возможность полезна, если оператор
EXPLAIN
показывает, что MySQL из всех возможных индексов использует ошибочный. Задавая значение индекса вUSE INDEX (key_list)
, можно заставить MySQL применять для поиска записи только один из возможных индексов. Альтернативное выражениеIGNORE INDEX (key_list)
запрещает использование в MySQL данного конкретного индекса. ВыраженияUSE/IGNORE KEY
являются синонимами дляUSE/IGNORE INDEX
.В MySQL 4.0.9 можно также указывать
FORCE INDEX
. Это работает также, как иUSE INDEX (key_list)
но в дополнение дает понять серверу что полное сканирование таблицы будет ОЧЕНЬ дорогостоящей операцией. Другими словами, в этом случае сканирование таблицы будет использовано только тогда, когда не будет найдено другого способа использовать один из данных индексов для поиска записей в таблице.
Несколько примеров:
mysql> SELECT * FROM table1,table2 WHERE table1.id=table2.id; mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id; mysql> SELECT * FROM table1 LEFT JOIN table2 USING (id); mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id LEFT JOIN table3 ON table2.id=table3.id; mysql> SELECT * FROM table1 USE INDEX (key1,key2) WHERE key1=1 AND key2=2 AND key3=3; mysql> SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND key3=3;
See Раздел 5.2.6, «Как MySQL оптимизирует LEFT JOIN
и RIGHT JOIN
».