【问题标题】:SQL Query - INNER JOIN - WHERE vs ANDSQL 查询 - INNER JOIN - WHERE 与 AND
【发布时间】:2017-12-21 03:52:47
【问题描述】:

我正在练习 SQL 查询,我对一个问题的解决方案是:

SELECT C.*
FROM customer C
INNER JOIN salesman S ON C.salesman_id = S.salesman_id
  AND S.commission > 0.12
  AND S.city <> C.city;

这个问题的解决方案是:

SELECT C.* 
FROM customer C  
INNER JOIN salesman S  ON C.salesman_id = S.salesman_id 
WHERE S.commission > .12 
  AND C.city <> S.city;

但是,两个输出之间没有区别。

所以我想了解何时应该使用 WHERE 子句和 ANDclause 和 INNER JOIN

两个给定查询之间会有任何性能差异吗?

【问题讨论】:

  • 这两个查询不会有任何性能差异。这是个人喜好的问题。我想将连接谓词保留在 ON 条件中,并将过滤器保留在 Where 子句中

标签: sql join inner-join where-clause


【解决方案1】:

Gordon Linoff 的回答是正确的,但是,我大力提倡设置处理关系的条件,即。将表连接到“on 子句”中的(外)键,其余的到 where 子句中。这很好地分离了关注点——尤其是当你有一个复合键时。

如果您保持该模式并且表结构更改会影响连接条件,您只需更改 on-clause 而不必担心 where 部分。

【讨论】:

    【解决方案2】:

    这两个查询完全没有区别。按照惯例,两个查询之间的条件通常放在on 子句中:

    select C.*
    from customer C inner join
         salesman S 
         on C.salesman_id = S.salesman_id and S.city <> C.city
    where S.commission > 0.12;
    

    不过,从功能上讲,on 子句或where 子句中可以包含附加条件——结果和性能应该相同。注意:这不适用于外连接。在这种情况下,条件通常应该放在on 子句中。

    【讨论】:

    • 非常感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 2013-03-17
    • 1970-01-01
    • 2015-01-10
    相关资源
    最近更新 更多