广告
返回顶部
首页 > 资讯 > 精选 >join on和where执行顺序是什么
  • 880
分享到

join on和where执行顺序是什么

2023-07-05 09:07:19 880人浏览 泡泡鱼
摘要

这篇文章主要讲解了“join on和where执行顺序是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“join on和where执行顺序是什么”吧

这篇文章主要讲解了“join on和where执行顺序是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“join on和where执行顺序是什么”吧!

    join on和where执行顺序

    1、join中相比where优先推荐on

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

    2. 逻辑上一个query的执行顺序(不是实际) 

    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 
    说是“逻辑上” 顺序,因为实际执行时还要看索引,数据分布等,看最终优化器如何处理,最真实的顺序肯定是执行计划展示的顺序。

    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条件是作用在左表还是右表。

    扩展:SQL执行顺序join在where前面

    • 取a表和b表join的数据sql

    原本意图是取a表的昨日分区数据和b表的昨日分区数据进行join,但是发现加上and b.dt = '${daily}'的条件后就取不到在a表中存在的数据了

    select substr(a.create_time,1,7) create_month,a.service_id,a.unit_number,a.company_name,coalesce(b.unified_social_credit_code,'unknown') unified_social_credit_code,a.company_id,b.company_id as company_id_b,a.dt,b.dtfrom clouduser.dz_company a left join clouduser.dz_company_detail b on a.company_id = b.company_idwhere a.dt = '${daily}' --and b.dt = '${daily}'and substr(a.create_time,1,7) = '2022-09'and a.company_name = '浙江港都电子有限公司';

    运行结果

    join on和where执行顺序是什么

    • 原因是where执行是在join之后,join出来的临时表中,由于在b表中没有匹配到数据,所以b.dt为null,这时候执行where b.dt = '${daily}'的条件筛选不到这条数据。

    • 优化方法

    现在子查询中将b表的昨日分区查询出来,再和a表join

    withr1 as (select * from clouduser.dz_company_detail where dt = '2022-10-17'),r2 as (select substr(a.create_time,1,7) create_month,a.service_id,a.unit_number,a.company_name,coalesce(b.unified_social_credit_code,'unknown') unified_social_credit_code,a.company_id,b.company_id as company_id_bfrom clouduser.dz_company a left join r1 b on a.company_id = b.company_idwhere a.dt = '${daily}' --and b.dt = '${daily}'and substr(a.create_time,1,7) = '2022-09'and a.company_name = '浙江港都电子有限公司')select * from r2;

    执行结果

    join on和where执行顺序是什么

    可以看到正常查询出a表中的数据了

    感谢各位的阅读,以上就是“join on和where执行顺序是什么”的内容了,经过本文的学习后,相信大家对join on和where执行顺序是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    --结束END--

    本文标题: join on和where执行顺序是什么

    本文链接: https://www.lsjlt.com/news/350863.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • join on和where执行顺序是什么
      这篇文章主要讲解了“join on和where执行顺序是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“join on和where执行顺序是什么”吧...
      99+
      2023-07-05
    • 关于join on和where执行顺序分析
      目录join on和where执行顺序1、join中相比where优先推荐on2. 逻辑上一个query的执行顺序(不是实际) 扩展:SQL执行顺序join在where前面join...
      99+
      2023-03-06
      join on和where执行顺序 join on和where SQL执行顺序
    • 关于join on和where执行顺序分析
      目录join on和where执行顺序1、join中相比where优先推荐on2. 逻辑上一个query的执行顺序(不是实际) 扩展:SQL执行顺序jo...
      99+
      2023-03-06
      join on和where执行顺序 join on和where SQL执行顺序
    • mysql查询语句join、on、where的执行顺序
      目录一、典型SELECT语句完整的执行顺序二、from三、on四、on 条件与where 条件1、使用位置2、使用对象3、选择与使用五、join 流程mysql 的执行顺序 一、典型SELECT...
      99+
      2022-11-19
      mysql查询语句执行顺序 mysql join mysql on mysql where
    • where子句的执行顺序是什么
      本篇内容介绍了“where子句的执行顺序是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
      99+
      2022-10-18
    • Oracle中where条件执行顺序是什么
      这篇文章将为大家详细讲解有关Oracle中where条件执行顺序是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。问题:SYS@proc>...
      99+
      2022-10-19
    • mysql中的join和where优先级顺序是什么
      这篇“mysql中的join和where优先级顺序是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql中...
      99+
      2023-07-05
    • MYSQL之on和where的区别是什么
      这篇“MYSQL之on和where的区别是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MYSQL之on和wh...
      99+
      2023-07-05
    • sql和mysql执行顺序是什么
      这篇文章主要介绍了sql和mysql执行顺序是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。sql和mysql执行顺序,内部机制是一样的,最...
      99+
      2022-10-18
    • MySQL查询条件中on和where的区别是什么
      今天就跟大家聊聊有关MySQL查询条件中on和where的区别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。MySQL 语句执行顺序...
      99+
      2022-10-18
    • mysql的执行顺序是什么
      mysql的执行顺序是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、执行顺序根据查询指定的表格,from计算笛卡尔积。on根据join_condition过滤数据。...
      99+
      2023-06-14
    • golang defer的执行顺序是什么
      在Go语言中,defer语句用于注册延迟调用,延迟调用会在函数执行完毕后被执行,无论函数是正常返回还是发生异常。 当有多个defer...
      99+
      2023-10-22
      golang
    • switch语句执行顺序是什么
      switch语句执行顺序是按照case标签的顺序进行判断,从上到下逐个比较。当找到与表达式匹配的case标签时,会执行该case标签...
      99+
      2023-09-16
      switch
    • java过滤器执行顺序是什么
      Java过滤器的执行顺序是根据过滤器的配置顺序来确定的。在web.xml文件中,过滤器的配置顺序决定了它们的执行顺序。当一个请求被发...
      99+
      2023-08-11
      java
    • ​mysql中语句执行顺序是什么
      这篇文章给大家分享的是有关mysql中语句执行顺序是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操...
      99+
      2022-10-18
    • SQL查询的执行顺序是什么
      本篇内容主要讲解“SQL查询的执行顺序是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SQL查询的执行顺序是什么”吧!很多 SQL 查询都是以 SELEC&...
      99+
      2022-10-19
    • JS异步的执行顺序是什么
      这篇文章主要介绍“JS异步的执行顺序是什么”,在日常操作中,相信很多人在JS异步的执行顺序是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS异步的执行顺序是什么”的疑惑有所帮助!接下来,请跟着小编一起来...
      99+
      2023-07-02
    • java代码块的执行顺序是什么
      Java代码块的执行顺序如下: 静态代码块:静态代码块在类加载时执行,并且只执行一次。它用来初始化静态变量或执行一些只需执行一次...
      99+
      2023-10-24
      java
    • java构造器的执行顺序是什么
      这篇文章给大家介绍java构造器的执行顺序是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1,在没有静态块的情况下,子类的对象创建时,父类的无参构造器-->子类的构造器(产生对象的构造器,如果是无参则执行的是...
      99+
      2023-06-17
    • ASP.NET MVC过滤器执行顺序是什么
      小编给大家分享一下ASP.NET MVC过滤器执行顺序是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!规则一:不同类型的过滤器有一个先后顺序即执行顺序是:授权过滤器->动作过滤器->结果过滤器-&...
      99+
      2023-06-29
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作