我知道任何连接都可以通过 CROSS 连接和 WHERE 子句来完成。
我做了一些实验,看起来将相等谓词放在 where 子句中或作为内部连接的参数会产生相同的结果和相同的性能。
此外,使用内部连接不会节省任何输入,因为仍然必须指定连接谓词。
我想各种外连接也是如此。只需指定值可以为空或不为空。
我可以只使用交叉连接吗?
不能使用 CROSS 连接和 WHERE 子句完成任何连接。交叉、内部和外部连接中的每一个都有其自身的逻辑意义。
包含 OUTER JOIN 子句的查询的一个令人困惑的方面是是否在 ON 过滤器或 WHERE 过滤器中指定逻辑表达式。两者的主要区别在于ON 是在添加外部行之前应用,而WHERE 是在之后应用。ON 过滤器从保留的表中删除一行(指定为左外或右外)不是最终的,因为它将被添加回来;相比之下,WHERE 过滤器对一行的消除是最终的。
ON 和 WHERE 子句之间的这种逻辑差异仅在使用外连接时存在。当您使用内部联接时,您在 ON 子句中使用内部联接表运算符或在 Where 子句中使用交叉联接表运算符指定逻辑表达式的位置并不重要。
希望这可以帮助!!!
答案是性能可能不会受到影响,但是,当您有经验丰富的开发人员查看交叉连接时,它们实际上是内部连接时,可读性和代码清晰度会受到阻碍。除此之外,这是个人喜好的问题。
你的问题对了一半。您说您测试并比较了JOIN
s 和 Dekart 的产品。你得到的结果是它们是相等的,但是大约一年前,我在 MySQL 数据库上进行了相同的测试,并且JOIN
s 更快。这是因为 SQL 标准指示必须如何执行连接操作,并且 Dekart 产品输出必须与INNER JOIN
.
因此,由于某些原因,我的建议是使用标准方式编写查询:
JOIN
更容易阅读和理解它正在做的事情,因此更容易修改查询。总而言之,我的建议是使用JOIN
s 代替。