在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

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

普雷迪普

答案没有区别,但是:

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

  • 始终保持联接条件ON条款
  • 始终放置过滤器的inwhere子句

这使查询更具可读性

因此,我将使用以下查询:

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筛选器:此阶段基于ON子句(<on_predicate>)中出现的谓词筛选VT1-J1中的行。仅将谓词评估为TRUE的行插入VT1-J2。
  • (1-J3)添加外部行:如果指定了OUTER JOIN(与CROSS JOIN或INNER JOIN相反),则将保留表中未找到匹配项的行添加到VT1-J2中的行作为外部行,生成VT1-J3。
  • (2)WHERE:此阶段基于WHERE子句()中的谓词过滤VT1中的行。仅将谓词评估为TRUE的行插入VT2。
  • (3)GROUP BY:此阶段根据GROUP BY子句中指定的列列表将VT2中的行按组排列,从而生成VT3。最终,每个组将有一个结果行。
  • (4)HAVING:此阶段基于HAVING子句(<having_predicate>)中出现的谓词从VT3中筛选组。仅将谓词评估为TRUE的组插入VT4。
  • (5)SELECT:此阶段处理SELECT子句中的元素,生成VT5。
  • (5-1)评估表达式:此阶段评估SELECT列表中的表达式,生成VT5-1。
  • (5-2)DISTINCT:此阶段从VT5-1中删除重复的行,从而生成VT5-2。
  • (5-3)TOP:此阶段根据ORDER BY子句定义的逻辑顺序,从VT5-2过滤指定的行数或最高百分比,从而生成表VT5-3。
  • (6)ORDER BY:此阶段根据ORDER BY子句中指定的列列表对VT5-3中的行进行排序,生成游标VC6。

它从《T-SQL查询(开发人员参考)一书中引用

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

子查询中ON和WHERE之间的区别

来自分类Dev

ElasticSearch中的查询和过滤器之间的区别

来自分类Dev

实体框架查询中&&和where条件之间的区别

来自分类Dev

laravel中where和or or Where之间的区别

来自分类Dev

Elasticsearch范围查询和范围过滤器之间的区别

来自分类Dev

XSLT 脚本中“where”和“if”之间的区别

来自分类Dev

在LEFT JOIN中使用“ ON .. AND”和“ WHERE”之间的区别

来自分类Dev

在LEFT JOIN中使用“ ON .. AND”和“ WHERE”之间的区别

来自分类Dev

列名称中的联接查询和选择查询之间的区别

来自分类Dev

javascript中的每个和过滤器之间的区别?

来自分类Dev

Sencha touch中过滤器和查找之间的区别

来自分类Dev

“ INNER JOIN”过滤条件在查询中的位置;ON或WHERE子句

来自分类Dev

JOIN ON与WHERE中的Oracle SQL查询过滤器

来自分类Dev

where子句和join的区别

来自分类Dev

JPA查询中的联接和路径导航之间的区别

来自分类Dev

内部联接查询与内部联接..on和where子句查询之间的区别?

来自分类Dev

内部联接查询与内部联接..on和where子句查询之间的区别?

来自分类Dev

布尔查询和术语查询之间的区别

来自分类Dev

布尔查询和术语查询之间的区别

来自分类Dev

在WHERE子句中使用过滤条件和JOIN条件有什么区别

来自分类Dev

Join和使用子查询执行相同操作之间有什么区别?

来自分类Dev

SQL-具有两个表和一个JOIN的WHERE之间的区别

来自分类Dev

INNER JOIN与mysql中的max和where子句的子查询

来自分类Dev

srcset和媒体查询之间的区别?

来自分类Dev

R中&和&&&之间的区别

来自分类Dev

Python中[]和[[]]之间的区别

来自分类Dev

Slim中“ /”和“!/”之间的区别

来自分类常见问题

Bash中的$ {}和$()之间的区别

来自分类Dev

C ++中+ =和= +之间的区别

Related 相关文章

  1. 1

    子查询中ON和WHERE之间的区别

  2. 2

    ElasticSearch中的查询和过滤器之间的区别

  3. 3

    实体框架查询中&&和where条件之间的区别

  4. 4

    laravel中where和or or Where之间的区别

  5. 5

    Elasticsearch范围查询和范围过滤器之间的区别

  6. 6

    XSLT 脚本中“where”和“if”之间的区别

  7. 7

    在LEFT JOIN中使用“ ON .. AND”和“ WHERE”之间的区别

  8. 8

    在LEFT JOIN中使用“ ON .. AND”和“ WHERE”之间的区别

  9. 9

    列名称中的联接查询和选择查询之间的区别

  10. 10

    javascript中的每个和过滤器之间的区别?

  11. 11

    Sencha touch中过滤器和查找之间的区别

  12. 12

    “ INNER JOIN”过滤条件在查询中的位置;ON或WHERE子句

  13. 13

    JOIN ON与WHERE中的Oracle SQL查询过滤器

  14. 14

    where子句和join的区别

  15. 15

    JPA查询中的联接和路径导航之间的区别

  16. 16

    内部联接查询与内部联接..on和where子句查询之间的区别?

  17. 17

    内部联接查询与内部联接..on和where子句查询之间的区别?

  18. 18

    布尔查询和术语查询之间的区别

  19. 19

    布尔查询和术语查询之间的区别

  20. 20

    在WHERE子句中使用过滤条件和JOIN条件有什么区别

  21. 21

    Join和使用子查询执行相同操作之间有什么区别?

  22. 22

    SQL-具有两个表和一个JOIN的WHERE之间的区别

  23. 23

    INNER JOIN与mysql中的max和where子句的子查询

  24. 24

    srcset和媒体查询之间的区别?

  25. 25

    R中&和&&&之间的区别

  26. 26

    Python中[]和[[]]之间的区别

  27. 27

    Slim中“ /”和“!/”之间的区别

  28. 28

    Bash中的$ {}和$()之间的区别

  29. 29

    C ++中+ =和= +之间的区别

热门标签

归档