`
足至迹留
  • 浏览: 496882 次
  • 性别: Icon_minigender_1
  • 来自: OnePiece
社区版块
存档分类
最新评论

sql基础回顾-2 (join on和where执行顺序)

 
阅读更多
1. join中相比where优先推荐on
WHERE子句中使用的连接语句,在数据库语言中,被称为隐性连接。INNER JOIN……ON子句产生的连接称为显性连接。(其他JOIN参数也是显性连接)WHERE和INNER JOIN产生的连接关系,没有本质区别,结果也一样。但是!隐性连接随着数据库语言的规范和发展,已经逐渐被淘汰,比较新的数据库语言基本上已经抛弃了隐性连接,全部采用显性连接了。

无论怎么连接,都可以用join子句,但是连接同一个表的时候,注意要定义别名,否则产生错误!
参考http://blog.sina.com.cn/s/blog_54cd1aa30100plmx.html

2. 逻辑上一个query的执行顺序(不是实际)
1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE or WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP
说是“逻辑上” 顺序,因为实际执行时还要看索引,数据分布等,看最终优化器如何处理,最真实的顺序肯定是执行计划展示的顺序。

下面这段参考: http://www.phpddt.com/db/join-on-where.html
引用
SQL语句中join连表时on和where后都可以跟条件,那么对查询结果集,执行顺序,效率是如何呢?
通过查询资料发现:
区别:
on是对中间结果进行筛选,where是对最终结果筛选。

执行顺序:
先进行on的过滤, 而后才进行join。

效率:
如果是inner join, 放on和放where产生的结果一样, 但没说哪个效率速度更高? 如果有outer join (left or right), 就有区别了, 因为on生效在先, 已经提前过滤了一部分数据, 而where生效在后.
最后来了解下T-SQL对查询逻辑处理。
T-SQL逻辑查询的各个阶段(编号代表顺序):
(5)SELECT DISTINCT TOP(<top_specification>) <select_list>                     
(1)FROM <left_table> <join_type> JOIN <right_table> ON <on_predicate>
(2)WHERE <where_predicate>
(3)GROUP BY <group_by_specification>
(4)HAVING <having_predicate>
(6)ORDER BY <order_by_list>

T-SQL在查询各个阶级分别干了什么:
(1)FROM 阶段
    FROM阶段标识出查询的来源表,并处理表运算符。在涉及到联接运算的查询中(各种join),主要有以下几个步骤:
  a.求笛卡尔积不论是什么类型的联接运算,首先都是执行交叉连接(cross join),求笛卡儿积,生成虚拟表VT1-J1。

      b.ON筛选器。这个阶段对上个步骤生成的VT1-J1进行筛选,根据ON子句中出现的谓词进行筛选,让谓词取值为true的行通过了考验,插入到VT1-J2。

     c.添加外部行。如果指定了outer join,还需要将VT1-J2中没有找到匹配的行,作为外部行添加到VT1-J2中,生成VT1-J3。

    经过以上步骤,FROM阶段就完成了。概括地讲,FROM阶段就是进行预处理的,根据提供的运算符对语句中提到的各个表进行处理(除了join,还有apply,pivot,unpivot)

(2)WHERE阶段
     WHERE阶段是根据<where_predicate>中条件对VT1中的行进行筛选,让条件成立的行才会插入到VT2中。

(3)GROUP BY阶段
      GROUP阶段按照指定的列名列表,将VT2中的行进行分组,生成VT3。最后每个分组只有一行。

(4)HAVING阶段
      该阶段根据HAVING子句中出现的谓词对VT3的分组进行筛选,并将符合条件的组插入到VT4中。

(5)SELECT阶段
  这个阶段是投影的过程,处理SELECT子句提到的元素,产生VT5。这个步骤一般按下列顺序进行
        a.计算SELECT列表中的表达式,生成VT5-1。
        b.若有DISTINCT,则删除VT5-1中的重复行,生成VT5-2
        c.若有TOP,则根据ORDER BY子句定义的逻辑顺序,从VT5-2中选择签名指定数量或者百分比的行,生成VT5-3

(6)ORDER BY阶段
     根据ORDER BY子句中指定的列明列表,对VT5-3中的行,进行排序,生成游标VC6.


如果是inner join, 放on和放where产生的结果一样, 执行计划也是一样,但推荐使用on。但如果有outer join (left or right), 就有区别了, 因为on生效在先, 已经提前过滤了一部分数据, 而where生效在后,而且on对于outer join有不生效的情况,需要看and条件是作用在左表还是右表:http://www.cnblogs.com/hgwy/articles/1691689.html

参考:
http://www.phpddt.com/db/join-on-where.html
http://dba.stackexchange.com/questions/5038/sql-server-join-where-processing-order
http://blog.chinaunix.net/uid-27570589-id-3771152.html

这篇http://coolshell.cn/articles/3463.html也提到:
引用
如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。


3. merge join, hash join, nested join
很好的一篇文章:
https://msdn.microsoft.com/zh-cn/library/dn144699.aspx
1
1
分享到:
评论

相关推荐

    sql-map-2.dtd和sql-map-config-2.dtd

    本文将深入探讨与“sql-map-2.dtd”和“sql-map-config-2.dtd”相关的知识点,以及它们在Ibatis中的作用。 Ibatis是一个轻量级的ORM(对象关系映射)框架,它允许开发者将SQL语句直接写在配置文件中,通过XML映射...

    left_join_on_and与left_join_on_where的区别

    left_join_on_and与left_join_on_where的区别

    sql server 2012 T-SQl基础教程 源码和示例数据库

    2. **Chapter 03 - Joins - Solutions**:在这个章节,你将学习如何连接两个或更多表以获取跨表的数据,包括内连接(INNER JOIN)、外连接(LEFT JOIN, RIGHT JOIN, FULL JOIN)和自连接(SELF JOIN)的概念和实践。...

    join on 语句及扩展

    这里我们将深入探讨几种JOIN类型及其使用,以及ON和WHERE子句的区别。 1. INNER JOIN: INNER JOIN返回两个表中匹配的记录。这意味着如果某个记录在其中一个表中没有对应的匹配项,那么这个记录就不会出现在结果集中...

    maven 下载 sqljdbc4-4.0.jar

    3. 执行SQL语句:创建`Statement`或`PreparedStatement`对象,并调用其`executeQuery()`或`executeUpdate()`方法执行SQL。 4. 处理结果:如果执行的是查询语句,可以通过`ResultSet`对象获取结果。 5. 关闭连接:...

    azkaban-sql-script-2.5.0.tar.gz

    这个压缩包“azkaban-sql-script-2.5.0.tar.gz”包含的是Azkaban 2.5.0版本的SQL脚本,这些脚本可能用于在数据库中设置和配置Azkaban所需的表结构和权限。以下将详细介绍Azkaban的关键概念、功能以及与SQL脚本的关系...

    T-SQL语句执行的顺序

    了解T-SQL语句的执行顺序对于优化查询性能和编写更高效的代码至关重要。以下是对标题和描述中所述知识点的详细说明: 1. **SELECT**: SELECT语句用于从一个或多个表中选取数据。在T-SQL中,这是执行的第一步,它...

    sql执行顺序大总结

    今天,我们将深入探讨 SQL 执行顺序的每一个步骤,从 FROM 到 SELECT,了解每一个步骤的执行顺序和细节。 FROM 步骤 首先,从 FROM 子句开始执行,执行笛卡尔乘积,生成虚拟表 vt1。这个步骤会将前两个表进行笛卡尔...

    sql查询左连接on与where的区别(2).pdf

    2. where的执行顺序在join之后,它决定了哪些记录会被最终展示在结果集中。 3. on用于指定连接条件,并且可以利用右表的字段来过滤左表的记录。 4. where用于对已连接的结果集进行筛选,并且可以同时对左表和右表的...

    SQL语句执行深入讲解(MySQL架构总览-查询执行流程-SQL解析顺序)

    SQL语句的执行顺序通常并不与书写顺序一致。例如,对于以下SQL语句: ```sql SELECT DISTINCT FROM &lt;join_type&gt; JOIN ON &lt;join_condition&gt; WHERE &lt;where_condition&gt; GROUP BY HAVING ORDER BY LIMIT ``` 其...

    SQL语句执行顺序说明

    ### SQL语句执行顺序说明 #### 一、SQL语句准备执行阶段 当SQL语句进入Oracle的库缓存后,为了确保其能够被正确执行,Oracle会经历一系列的检查和准备过程。这一阶段主要涉及以下几个步骤: 1. **语法检查**:...

    SqlServer中Group By高级使用--Inner Join分组统计

    今天我们将深入探讨如何在SQL Server中使用Group By与Inner Join结合来实现更复杂的分组统计。 首先,理解Group By的基本用法至关重要。Group By语句将结果集按照一个或多个列进行分组,这样我们可以对每个组应用...

    SQL查询原理及执行顺序

    SQL(Structured Query Language)是一种用于管理关系型数据库的标准语言,其查询原理和执行顺序对于数据库性能优化至关重要。本文将深入探讨SQL查询的执行过程,帮助读者理解如何构建高效查询。 #### SQL语句执行...

    当数据库复杂查询执行顺序与编写顺序原理及sql案例:同时出现了where_group_by_having_order_by的时候_执行顺序和编写顺序

    当同时出现了where_group_by_having_order_by的时候_执行顺序和编写顺序时的用法

    SQL语句基础教程

    SQL语句基础教程旨在帮助新手和需要复习SQL的资料仓储业界老将,学习SQL基础知识和语法。 SQL指令 -------- SQL指令是SQL语言的基础,用于储存、读取、处理数据库中的资料。常用的SQL指令包括: * SELECT:从...

    SQL基础知识第2版.pdf

    例如,可以结合使用WHERE和GROUP BY来对特定条件下的数据进行分组统计,或者使用ORDER BY对结果进行排序。 为了加深对这些知识点的理解,建议在实际的数据库环境中尝试编写和执行这些SQL语句,并观察它们的行为和...

    sqljdbc4-4.0.jar

    《SQLSERVER数据库连接jar/jdbc包:sqljdbc4-4.0.jar详解》 在Java编程环境中,数据库连接是至关重要的部分,而`sqljdbc4-4.0.jar`则是微软为Java开发者提供的用于连接SQL Server数据库的驱动程序包。这个JDBC...

    inner join-outer join-cross join查询方式总结

    - 如果使用了GROUP BY,那么GROUP BY的排序顺序必须和SELECT中列出的字段顺序一致,否则可能会导致结果错乱。 通过以上内容的学习,我们可以更深入地理解不同类型的表连接方式及其应用场景,从而在实际工作中更加...

Global site tag (gtag.js) - Google Analytics