是否可能编写不带 ON
语句的连接查询?以及这些连接查询中 LEFT JOIN、RIGHT JOIN
的区别是什么。
是否可能编写不带 ON
语句的连接查询?以及这些连接查询中 LEFT JOIN、RIGHT JOIN
的区别是什么。
MySQL 文档覆盖了这个主题。
以下是概要。在使用join
或inner 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
子句在进行右外连接或左外连接时是必需的,因此本讨论不适用于它们。在http://www.sitepoint.com/understanding-sql-joins-mysql-database/网页中可以看到一些实例。
你可以在查询语句中使用'USING'代替'ON'。
SELECT * FROM table1 LEFT JOIN table2 USING (id);
进行交叉连接或笛卡尔积有几种方法:
SELECT column_names FROM table1 CROSS JOIN table2;
SELECT column_names FROM table1, table2;
SELECT column_names FROM table1 JOIN table2;
在第三种情况下不使用on
条件会导致执行交叉连接。
ON
子句告诉服务器表之间的关系,如果不同的连接类型都给出相同的结果,则说明您出现了问题。添加一些代码可以帮助我们发现您的问题。同时,您可以前往Jeff Atwood的博客,了解不同连接类型的2分钟简介。 - fvu