【问题标题】:Why should I use a JOIN instead of WHERE in SQL? [duplicate]为什么我应该在 SQL 中使用 JOIN 而不是 WHERE? [复制]
【发布时间】:2014-09-04 20:21:02
【问题描述】:

我在这里看到了其他问题的答案,大多数人建议在 SQL 中使用 JOIN 而不是 WHERE。

我是 SQL 新手,大约 6 个月前开始使用 Oracle,但我从未使用过 JOIN。

我不会以任何方式进行任何复杂的查询。我经常使用的查询如下。使用 JOIN 相当于什么,我应该这样做吗?有什么好处吗?

SELECT orders.no, orders.created, totals.net
FROM orders, totals
WHERE orders.no = totals.no

我使用的是旧版 Oracle; 8i 所以我相信有些 JOIN 使用的是 (+) 什么的,但从来没有理解过。

【问题讨论】:

  • 您使用联接。但隐含的语法。使用显式连接语法,您可以将连接条件与 where 子句中的实际过滤条件分开,这样更具可读性。
  • 如果您使用的是 oracle 8i,您可能无法使用“join”。您不了解外连接的加号这一事实是在 from 子句而不是 where 子句中连接表的一个很好的理由。
  • 我认为使用 ON 子句将连接条件与 WHERE 子句中的其他条件区分开来更简洁。
  • @MGorgon:那篇文章是关于性能的

标签: sql oracle


【解决方案1】:

我的理解是执行计划是相同的,你会得到相同的结果。但是使用JOIN 更简洁,更易于阅读。我自己是老派WHERE 的粉丝,但我已经训练自己改用JOIN

这里有很棒的帖子,包括它们的等效性:Inner join vs Where

你自己试试吧,你应该得到相同的执行计划。

【讨论】:

    【解决方案2】:

    嗯,有时情况正好相反:在 Oracle 中,出于性能原因,您必须继续使用 where 连接语法。

    对于非常复杂的 sql 语句,Oracle 使用 Oracle 联接(又名在 where 子句中)仍然比使用 ANSI 联接(又名join)表现更好。

    我认为没有真正的理由不选择 ANSI 联接或 Oracle 联接。不过,我个人更喜欢使用 ANSI 连接,因为它更容易阅读/理解。

    【讨论】:

    • "Oracle 在加入 Oracle 的情况下仍然表现更好" - 这可能适用于 9.x 和 10.x,但肯定不适用于任何最近/支持的版本 ( 11.x、12.x)。顺便说一句:where 子句中的隐式连接也是“ANSI 连接”——只是标准的旧版本(JOIN 运算符是在 SQL:99 中引入的,如果我没记错的话)
    • @a_horse_with_no_name:我们的自动生成系统在 10.2 和 11.1 版本的 Oracle 中一直遇到这种性能问题。一些视图有大约 20-30 个表的连接。使用 ANSI 联接时性能大幅下降。将构建引擎更改为使用 Oracle 连接解决了该问题。
    • 我想在 12 上做一些测试。也许它确实有所改善。感谢您的关注。
    猜你喜欢
    • 2012-10-08
    • 2015-08-13
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2011-06-19
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多