SELECT value FROM table1 JOIN table2 ON table1.id = table2.id WHERE table1.id = 1
和
SELECT value FROM table1 JOIN table2 ON table1.id = table2.id AND table1.id = 1
对我来说,似乎逻辑是不同的,虽然你总是会得到相同的结果集,但我想知道是否有任何条件,你会得到两个不同的结果集(或者它们总是返回完全相同的两个结果集)
解决方法
我会永远喜欢做以下事情。
>始终将Join条件保留在ON子句中
>总是把过滤器放在where子句中
这使查询更易读。
所以我会用这个查询:
SELECT value FROM table1 INNER JOIN table2 ON table1.id = table2.id WHERE table1.id = 1
然而,当您使用OUTER JOIN’S时,将过滤器保持在ON条件和Where条件方面有很大的区别。
逻辑查询处理
以下列表包含查询的一般形式,以及根据逻辑处理不同子句的顺序分配的步骤编号。
(5) SELECT (5-2) DISTINCT (5-3) TOP(<top_specification>) (5-1) <select_list> (1) FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <on_predicate> | (1-A) <left_table> <apply_type> APPLY <right_table_expression> AS <alias> | (1-P) <left_table> PIVOT(<pivot_specification>) AS <alias> | (1-U) <left_table> UNPIVOT(<unpivot_specification>) AS <alias> (2) WHERE <where_predicate> (3) GROUP BY <group_by_specification> (4) HAVING <having_predicate> (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。