快捷搜索: 王者荣耀 脱发

sql – JOIN和WHERE中的过滤查询之间的区别?

收集整理的这篇文章主要介绍了 , 小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在SQL中,我试图根据ID过滤结果,并想知道是否存在任何逻辑差异

 
  1. SELECT value
  2. FROM table1
  3. JOIN table2 ON table1.id = table2.id
  4. WHERE table1.id = 1

 
  1. SELECT value
  2. FROM table1
  3. JOIN table2 ON table1.id = table2.id AND table1.id = 1

对我来说,似乎逻辑是不同的,虽然你总是会得到相同的结果集,但我想知道是否有任何条件,你会得到两个不同的结果集(或者它们总是返回完全相同的两个结果集)

解决方法

答案是没有区别的,但是:

我会永远喜欢做以下事情。

>始终将Join条件保留在ON子句中 >总是把过滤器放在where子句中

这使查询更易读。

所以我会用这个查询:

 
  1. SELECT value
  2. FROM table1
  3. INNER JOIN table2
  4. ON table1.id = table2.id
  5. WHERE table1.id = 1

然而,当您使用OUTER JOIN’S时,将过滤器保持在ON条件和Where条件方面有很大的区别。

逻辑查询处理

以下列表包含查询的一般形式,以及根据逻辑处理不同子句的顺序分配的步骤编号。

 
  1. (5) SELECT (5-2) DISTINCT (5-3) TOP(<top_specification>) (5-1) <select_list>
  2. (1) FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <on_predicate>
  3. | (1-A) <left_table> <apply_type> APPLY <right_table_expression> AS <alias>
  4. | (1-P) <left_table> PIVOT(<pivot_specification>) AS <alias>
  5. | (1-U) <left_table> UNPIVOT(<unpivot_specification>) AS <alias>
  6. (2) WHERE <where_predicate>
  7. (3) GROUP BY <group_by_specification>
  8. (4) HAVING <having_predicate>
  9. (6) ORDER BY <order_by_list>;

流程图逻辑查询处理

>(1)FROM:FROM阶段标识查询的源表和 处理表操作符。每个表运算符应用一系列 子阶段例如,连接中涉及的阶段是(1-J1) 笛卡尔积,(1-J2)ON过滤器,(1-J3)添加外排。 FROM 阶段生成虚拟表VT1。 >(1-J1)笛卡尔积:该阶段执行笛卡尔乘积 (交叉连接)在表操作符中涉及的两个表之间, 产生VT1-J1。 >(1-J2)ON过滤器:此阶段基于VT1-J1对行进行过滤 出现在ON子句(< on_predicate>)中的谓词。只要 谓词计算为TRUE的行将被插入 VT1-J2。 >(1-J3)添加外行:如果指定了OUTER JOIN(而不是 CROSS JOIN或INNER JOIN),来自保留的表或表的行 未找到匹配的字符串将从VT1-J2添加到行中 外排,生成VT1-J3。 >(2)WHERE:这个阶段根据VT1从VT1过滤行 谓词出现在WHERE子句()中。只要 谓词计算为TRUE的行将插入到VT2中。 >(3)GROUP BY:这个阶段按照VT2的行排列 在GROUP BY子句中指定的列列表中,生成VT3。 最终,每个组将有一个结果行。 >(4)HAVING:这个阶段根据VT3从VT3过滤组 谓词出现在HAVING子句(< have_predicate>)中。 仅插入谓词为TRUE的组 进入VT4。 >(5)SELECT:此阶段处理SELECT子句中的元素, 产生VT5。 >(5-1)评估表达式:此阶段计算表达式 SELECT列表,生成VT5-1。 >(5-2)DISTINCT:此阶段从VT5-1中删除重复的行, 产生VT5-2。 >(5-3)TOP:此阶段过滤指定的顶部数字或百分比 根据由ORDER定义的逻辑顺序从VT5-2的行 BY子句,生成表VT5-3。 >(6)ORDER BY:此阶段根据VT5-3排列 在ORDER BY子句中指定的列列表,生成游标 VC6。

从this excellent link起。

总结

以上是为你收集整理的全部内容,希望文章能够帮你解决所遇到的程序开发问题。

经验分享 程序员 微信小程序 职场和发展