如何在不使用ON条件的情况下使用MySQL JOIN?

131

是否可能编写不带 ON 语句的连接查询?以及这些连接查询中 LEFT JOIN、RIGHT JOIN 的区别是什么。


1
由于 ON 子句告诉服务器表之间的关系,如果不同的连接类型都给出相同的结果,则说明您出现了问题。添加一些代码可以帮助我们发现您的问题。同时,您可以前往Jeff Atwood的博客,了解不同连接类型的2分钟简介。 - fvu
1
@fvu那篇博客文章在评论中被作者否认且没有帮助。MySQL和SQLite都允许(INNER) JOIN不带ON子句。(将其视为ON 1=1,即将其视为CROSS JOIN。) - philipxy
3个回答

192

MySQL 文档覆盖了这个主题。

以下是概要。在使用joininner join时,on条件是可选的。这与ANSI标准不同,并且不同于几乎所有其他数据库。效果是一个cross join。同样,您也可以在cross join中使用on子句,这也与标准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 子句在进行右外连接或左外连接时是必需的,因此本讨论不适用于它们。

15

7
为了进一步澄清,两个表中用于连接的列必须具有完全相同的名称才能使用USING方法。 - rmirabelle

5

进行交叉连接或笛卡尔积有几种方法:

SELECT column_names FROM table1 CROSS JOIN table2;

SELECT column_names FROM table1, table2;

SELECT column_names FROM table1 JOIN table2;

在第三种情况下不使用on条件会导致执行交叉连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接