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

sql中,我试图根据ID过滤结果,并想知道是否存在任何逻辑差异
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。

this excellent link起。

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...