Каково поведение MySQL JOIN по умолчанию: INNER или OUTER?

95

Итак, я просматривал Интернет последний час, читал и искал окончательный ответ на этот простой вопрос.

Что такое JOIN по умолчанию в MySQL?

SELECT * FROM t1 JOIN t2

Это то же самое, что

SELECT * FROM t1, t2

OR

SELECT * FROM t1 INNER JOIN t2

Также связанный с этим вопрос: когда вы используете предложения WHERE, это то же самое, что JOIN или INNER JOIN?

Прямо сейчас я думаю, что автономное JOIN идентично использованию запятых и предложений WHERE.

Куанг Ван
источник

Ответы:

128

В MySQL JOINнеквалифицированное написание подразумевает INNER JOIN. Другими словами, INNERin не INNER JOINявляется обязательным. INNERи CROSSявляются синонимами в MySQL. Для ясности я пишу, JOINесть INNER JOINли у меня условие соединения и CROSS JOINесли у меня нет условия.

Допустимый синтаксис для объединений описан в документации .


Прямо сейчас я думаю, что автономный JOIN - это не что иное, как (идентичное) использование запятых и предложений WHERE.


Эффект тот же, но история за ними другая. Синтаксис запятой взят из стандарта ANSI-89. Однако есть ряд проблем с этим синтаксисом, поэтому в стандарте ANSI-92 было введено ключевое слово JOIN.

Я настоятельно рекомендую всегда использовать синтаксис JOIN, а не запятую.

  • T1 JOIN T2 ON ...читабельнее чем T1, T2 WHERE ....
  • Он более удобен в обслуживании, потому что взаимосвязи таблиц и фильтры четко определены, а не смешаны вместе.
  • Синтаксис JOIN легче преобразовать во OUTER JOIN, чем синтаксис с запятой.
  • Смешивание запятой и синтаксиса JOIN в одном операторе может привести к любопытным ошибкам из-за правил приоритета.
  • При использовании синтаксиса JOIN вероятность случайного создания декартова произведения меньше из-за забытого предложения соединения, потому что предложения соединения написаны рядом с соединениями, и легко увидеть, отсутствует ли оно.
Марк Байерс
источник
Милый, спасибо, что разъяснили мне этот простой вопрос :) Раньше я всегда использовал запятые + предложения where ... но буду преобразовывать в использование JOIN по вашему совету. Спасибо
Куанг Ван
Привет, Марк, что ты подразумеваешь под сочетанием JOIN и запятых? Смешайте такие запросы: SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)?
Куанг Ван,
2
@Quang: Это, например, не удастся:SELECT * FROM t1, t2 JOIN t3 ON t1.x=t3.y WHERE t1.a = t2.b
Марк Байерс,
0

Они эквивалентны, а также , равные CROSS JOIN.

Между использованием запятой и [INNER | CROSS] JOINсинтаксисом есть некоторые различия , которые могут быть важны при объединении большего количества таблиц. Практически все, что вам нужно знать, описано здесь, в документации MySQLJOIN .

Mchl
источник
1
^ --- ответ на вопрос JOIN (автономный) в основном то же самое, что и INNER и запятая + where clauses
Куанг Ван