Как использовать mysql JOIN без условия ON?

106

Можно ли написать запрос соединения без ONоператора? и чем отличаются эти соединения LEFT JOIN, RIGHT JOIN.

Александр Т.
источник
1
Поскольку это ONпредложение сообщает серверу, как связаны таблицы, нет. Если все ваши разные типы соединений дают одинаковый результат, вы почему-то делаете это неправильно, и добавление кода может помочь нам определить вашу проблему. А пока зайдите в блог Джеффа Этвуда, чтобы получить двухминутную вводную информацию о различных типах соединений.
fvu 09

Ответы:

154

Документация MySQL охватывает эту тему.

Вот синопсис. При использовании joinили inner join, то onусловие не является обязательным. Он отличается от стандарта ANSI и практически от любой другой базы данных. Эффект cross join. Точно так же вы можете использовать onпредложение with cross join, которое также отличается от стандартного SQL.

Перекрестное соединение создает декартово произведение, то есть все возможные комбинации 1 строки из первой таблицы и 1 строки из второй. Перекрестное соединение для таблицы с тремя строками ('a', 'b' и 'c') и таблицы с четырьмя строками (скажем, 1, 2, 3, 4) будет иметь 12 строк.

На практике, если вы хотите выполнить перекрестное соединение, используйте cross join:

from A cross join B

намного лучше, чем:

from A, B

и:

from A join B -- with no on clause

В on требуется для правого или левого внешнего соединения, поэтому обсуждение для них не актуально.

Если вам нужно разобраться в различных типах объединений, вам необходимо изучить реляционные базы данных. Stackoverflow - не подходящее место для обсуждения такого уровня.

Гордон Линофф
источник
1
Никогда не слышал о перекрестном соединении и не нуждался в одном ... до сегодняшнего дня!
goos
11

См. Пример в http://www.sitepoint.com/understanding-sql-joins-mysql-database/

Вы можете использовать "USING" вместо "ON", как в запросе

SELECT * FROM table1 LEFT JOIN table2 USING (id);
Ману
источник
3
Для дополнительного пояснения, объединяющий столбец в обеих таблицах должен иметь одинаковое имя, чтобы USING работал
rmirabelle