6.4.1.1 Синтаксис оператора JOIN
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)]
и 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 section 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
(выводящий
информацию о структуре и порядке выполнения запроса SELECT
),
показывает, что MySQL использует ошибочный индекс. Задавая значение
индекса в USE INDEX (key_list)
, можно заставить MySQL применять для
поиска записи только один из указанных индексов. Альтернативное
выражение IGNORE INDEX (key_list)
запрещает использование в MySQL
данного конкретного индекса. Выражения USE/IGNORE KEY
являются
синонимами для USE/IGNORE INDEX
.
Несколько примеров:
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 section 5.2.6 Как MySQL оптимизирует LEFT JOIN
и RIGHT JOIN
.