在JOIN子句与WHERE子句中区分b / w put条件

时间:2010-05-08 01:56:44

标签: sql inner-join

假设我有3张桌子。

销售代表

  • 代码
  • 名字
  • 姓氏
  • 电话
  • 电子邮件
  • 销售团队

订单

  • 订单号
  • 代码
  • 客户编号
  • 订单日期
  • 订单状态

客户

  • 客户编号
  • 名称
  • 地址
  • 电话号码

我想获得2010年销售的详细报告。我会加入。我有兴趣了解以下哪项更有效,为什么?

SELECT 
    O.OrderNum, R.Name, C.Name
FROM
    Order O INNER JOIN Rep R ON O.RepCode = R.RepCode
            INNER JOIN Customer C ON O.CustomerNumber = C.CustomerNumber
WHERE
    O.OrderDate >= '01/01/2010'

OR

SELECT 
    O.OrderNum, R.Name, C.Name
FROM
    Order O INNER JOIN Rep R ON (O.RepCode = R.RepCode AND O.OrderDate >= '01/01/2010')
            INNER JOIN Customer C ON O.CustomerNumber = C.CustomerNumber

1 个答案:

答案 0 :(得分:4)

JOIN必须反映表格的关系方面。 WHERE子句,是一个过滤记录的地方。我更喜欢第一个。

首先使其可读,表关系应该是显而易见的(通过使用JOIN),然后是配置文件

效率方面,知道的唯一方法是对其进行分析,不同的数据库在执行查询时有不同的规划者

其中某些数据库可能先应用过滤器,然后再进行连接;某些数据库可能首先盲目地连接表,然后执行where子句。尝试分析,在Postgres和MySQL上使用EXPLAIN SELECT ...,在SQL Server中使用Ctrl + K,使用SQL Server,您可以看到两个查询中哪一个相对于彼此更快