在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

在我看来,逻辑似乎是不同的,尽管您总是会得到相同的结果集,但是我想知道是否存在任何条件下您将得到两个不同的结果集(或者它们将始终返回完全相同的两个结果集) )

最佳答案

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

我将始终喜欢执行以下操作。

  • 始终将联接条件保留在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>;
    

    流程图逻辑查询处理

    sql - 在JOIN和WHERE中过滤查询之间的区别?-LMLPHP
  • (1)FROM:FROM阶段标识查询的源表,
    进程表运算符。每个表运算符应用一系列
    子阶段。例如,联接中涉及的阶段是(1-J1)
    笛卡尔乘积,(1-J2)ON过滤器,(1-J3)添加外部行。来自
    阶段生成虚拟表VT1。
  • (1-J1)笛卡尔积:此阶段执行笛卡尔积
    (交叉连接)表运算符涉及的两个表之间,
    生成VT1-J1。
  • (1-J2) ON筛选:此阶段基于以下条件筛选VT1-J1中的行
    出现在ON子句中的谓词()。只要
    谓词评估为TRUE的行插入
    VT1-J2。
  • (1-J3)添加外部行:如果指定了OUTER JOIN(相对于
    CROSS JOIN或INNER JOIN),保留表中的行
    找不到匹配项的对象将被添加到VT1-J2的行中,如下所示:
    外排,生成VT1-J3。
  • (2)在哪里:此阶段基于VT1筛选行
    谓词出现在WHERE子句()中。只要
    谓词评估为TRUE的行插入VT2。
  • (3)GROUP BY:此阶段将VT2中的行按组排列
    在GROUP BY子句中指定的列列表上,生成VT3。
    最终,每个组将有一个结果行。
  • (4)HAVING:此阶段基于以下条件过滤来自VT3的组:
    出现在HAVING子句中的谓词()。
    仅插入谓词评估为TRUE的组
    进入VT4。
  • (5)SELECT:此阶段处理SELECT子句中的元素,
    生成VT5。
  • (5-1)评估表达式:此阶段评估表达式
    SELECT列表,生成VT5-1。
  • (5-2)DISTINCT:此阶段从VT5-1中删除重复的行,
    生成VT5-2。
  • (5-3)TOP:此阶段过滤指定的最高数字或百分比
    VT5-2中的行基于ORDER定义的逻辑顺序
    BY子句,生成表VT5-3。
  • (6)ORDER BY:此阶段根据VT5-3对行进行排序
    ORDER BY子句中指定的列列表,生成游标
    VC6。

  • 从书“T-SQL Querying (Developer Reference)”中引用

    09-28 10:16