是否需要INNER JOIN和OUTER JOIN?

时间:2013-10-20 13:32:59

标签: sql database join

我知道任何连接都可以使用CROSS连接和WHERE子句完成。

我做了一些实验,看起来好像将等式谓词放在where子句中,或者看起来像内部连接的参数产生相同性能的相同结果。

此外,使用内部联接不会保存任何键入,因为仍必须指定连接谓词。

我想对于各种外连接也是如此。只需指定值可以为null或不为null。

我可以只使用交叉连接吗?

3 个答案:

答案 0 :(得分:10)

不能使用CROSS连接和WHERE子句进行任何连接。每个连接cross,inner和outer都有自己的逻辑意义。

  1. 交叉加入仅适用于一个阶段 - 笛卡尔积。
  2. 内部联接应用两个阶段 - 笛卡儿积和过滤器。
  3. 外部联接应用三个阶段 - 笛卡儿积,过滤和添加外行。
  4. 包含OUTER JOIN子句的查询的一个令人困惑的方面是在ON过滤器或WHERE过滤器中指定逻辑表达式。两者之间的主要区别在于,在添加外部行之前应用 ON,而之后应用 WHERE 。 ON过滤器从保留表中删除一行(指定为左外或右外)不是最终的,因为它将被添加回来;相反, WHERE过滤器消除行是最终的。

    ON和WHERE子句之间的逻辑差异仅在使用外部时存在 join。当您使用内连接时,在使用内连接表运算符的ON子句中或在带有交叉连接表运算符的Where子句中指定逻辑表达式的位置无关紧要。

    希望这有帮助!!!

答案 1 :(得分:1)

答案是性能可能不会受到影响,但是,当您有经验丰富的开发人员在他们真正的内部联接时查看交叉联接时,可读性和代码清晰度会受到阻碍。除此之外,这是个人偏好的问题。

答案 2 :(得分:0)

你的问题是对的。你说你测试并比较了JOIN和Dekart产品。你得到的结果是他们是平等的,但是大约一年前我在MySQL数据库上进行了相同的测试,JOIN s更快。这是因为SQL标准表明必须如何实现连接操作,以及Dekart产品输出必须与INNER JOIN相同。

因此,我的建议是使用标准方式编写查询,原因如下:

  1. 在DBMS(数据库管理系统)上运行良好的查询可能无法在另一个上运行。
  2. 同一个DBMS的早期版本可能无法优化Dekart产品以及后者。
  3. 可能是最重要的。使用JOIN的查询结构更易于阅读和理解,因此更容易修改查询。
  4. 总而言之,我的建议是改为使用JOIN