精华内容
下载资源
问答
  • 目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及MySQL语句执行顺序: sql和mysql执行顺序,发现内部机制是一样的。最大区别是在别名的引用上。 一、sql执行顺序 (1)from ...
  • 主要介绍了MySQL语句执行顺序和编写顺序实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • MySQL语句执行顺序和编写顺序

    千次阅读 多人点赞 2019-02-22 14:44:49
    select语句完整语法: SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE &...

    select语句完整语法:

    SELECT 
    DISTINCT <select_list>
    FROM <left_table>
    <join_type> JOIN <right_table>
    ON <join_condition>
    WHERE <where_condition>
    GROUP BY <group_by_list>
    HAVING <having_condition>
    ORDER BY <order_by_condition>
    LIMIT <limit_number>
    
    执行顺序:
    from →join →on →where →group by→having→select→order by→limit
    
    (1)各个关键词的作用:

    from:需要从哪个数据表检索数据
    join:联合多表查询返回记录时,并生成一张临时表
    on:在生成临时表时使用的条件
    where:过滤表中数据的条件
    group by:如何将上面过滤出的数据分组
    having:对上面已经分组的数据进行过滤的条件
    select:查看结果集中的哪个列,或列的计算结果
    order by :按照什么样的顺序来查看返回的数据
    limit:限制查询结果返回的数量

    (2)on与where的用法区别:

    a.on后面的筛选条件主要是针对的是关联表【而对于主表刷选条件不适用】。
    b.如果是想再连接完毕后才筛选就应把条件放置于where后面。对于关联表我们要区分对待。如果是要条件查询后才连接应该把查询件放置于on后。
    c.对于主表的筛选条件应放在where后面,不应该放在on后面

    (3)having和where的用法区别:

    a.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。
    b.where肯定在group by 之前,即也在having之前。
    c.where后的条件表达式里不允许使用聚合函数,而having可以。

    (4)count用法

    使用count(列名)当某列出现null值的时候,count(*)仍然会计算,但是count(列名)不会。

    展开全文
  • 关于sql和MySQL语句执行顺序(必看!!!)

    万次阅读 多人点赞 2016-03-29 12:15:09
    目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及MySQL语句执行顺序: sql和mysql执行顺序,发现内部机制是一样的。最大区别是在别名的引用上。 一、sql执行顺序 (1)from (3)...

    今天遇到一个问题就是mysql中insert into 和update以及delete语句中能使用as别名吗?目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及MySQL语句执行顺序:

    sql和mysql执行顺序,发现内部机制是一样的。最大区别是在别名的引用上。 


    一、sql执行顺序 

    1. from 
    2. join 
    3. on 
    4. where 
    5. group by(开始使用select中的别名,后面的语句中都可以使用)
    6.  avg,sum.... 
    7. having 
    8. select 
    9. distinct 
    10. order by
    11. limit 


    从这个顺序中我们不难发现,所有的 查询语句都是从from开始执行的,在执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入。 


    第一步:首先对from子句中的前两个表执行一个笛卡尔乘积,此时生成虚拟表 vt1(选择相对小的表做基础表)。 
    第二步:接下来便是应用on筛选器,on 中的逻辑表达式将应用到 vt1 中的各个行,筛选出满足on逻辑表达式的行,生成虚拟表 vt2 。
    第三步:如果是outer join 那么这一步就将添加外部行,left outer jion 就把左表在第二步中过滤的添加进来,如果是right outer join 那么就将右表在第二步中过滤掉的行添加进来,这样生成虚拟表 vt3 。

    第四步:如果 from 子句中的表数目多余两个表,那么就将vt3和第三个表连接从而计算笛卡尔乘积,生成虚拟表,该过程就是一个重复1-3的步骤,最终得到一个新的虚拟表 vt3。 

    第五步:应用where筛选器,对上一步生产的虚拟表引用where筛选器,生成虚拟表vt4,在这有个比较重要的细节不得不说一下,对于包含outer join子句的查询,就有一个让人感到困惑的问题,到底在on筛选器还是用where筛选器指定逻辑表达式呢?on和where的最大区别在于,如果在on应用逻辑表达式那么在第三步outer join中还可以把移除的行再次添加回来,而where的移除的最终的。举个简单的例子,有一个学生表(班级,姓名)和一个成绩表(姓名,成绩),我现在需要返回一个x班级的全体同学的成绩,但是这个班级有几个学生缺考,也就是说在成绩表中没有记录。为了得到我们预期的结果我们就需要在on子句指定学生和成绩表的关系(学生.姓名=成绩.姓名)那么我们是否发现在执行第二步的时候,对于没有参加考试的学生记录就不会出现在vt2中,因为他们被on的逻辑表达式过滤掉了,但是我们用left outer join就可以把左表(学生)中没有参加考试的学生找回来,因为我们想返回的是x班级的所有学生,如果在on中应用学生.班级='x'的话,left outer join会把x班级的所有学生记录找回(感谢网友康钦谋__康钦苗的指正,所以只能在where筛选器中应用学生.班级='x' 因为它的过滤是最终的。 

    第六步:group by 子句将中的唯一的值组合成为一组,得到虚拟表vt5。如果应用了group by,那么后面的所有步骤都只能得到的vt5的列或者是聚合函数(count、sum、avg等)。原因在于最终的结果集中只为每个组包含一行。这一点请牢记。 

    第七步:应用cube或者rollup选项,为vt5生成超组,生成vt6. 
    第八步:应用having筛选器,生成vt7。having筛选器是第一个也是为唯一一个应用到已分组数据的筛选器。 
    第九步:处理select子句。将vt7中的在select中出现的列筛选出来。生成vt8. 

    第十步:应用distinct子句,vt8中移除相同的行,生成vt9。事实上如果应用了group by子句那么distinct是多余的,原因同样在于,分组的时候是将列中唯一的值分成一组,同时只为每一组返回一行记录,那么所以的记录都将是不相同的。 

    第十一步:应用order by子句。按照order_by_condition排序vt9,此时返回的一个游标,而不是虚拟表。sql是基于集合的理论的,集合不会预先对他的行排序,它只是成员的逻辑集合,成员的顺序是无关紧要的。对表进行排序的查询可以返回一个对象,这个对象包含特定的物理顺序的逻辑组织。这个对象就叫游标。正因为返回值是游标,那么使用order by 子句查询不能应用于表表达式。排序是很需要成本的,除非你必须要排序,否则最好不要指定order by,最后,在这一步中是第一个也是唯一一个可以使用select列表中别名的步骤。 

    第十二步:应用top选项。此时才返回结果给请求者即用户。 

     

    二、mysql的执行顺序 


    1、SELECT语句定义 

    一个完成的SELECT语句包含可选的几个子句。SELECT语句的定义如下: 
    SQL代码 

    <SELECT clause> [<FROM clause>] [<WHERE clause>] [<GROUP BY clause>] [<HAVING clause>] [<ORDER BY clause>] [<LIMIT clause>] 

    SELECT子句是必选的,其它子句如WHERE子句、GROUP BY子句等是可选的。 
    一个SELECT语句中,子句的顺序是固定的。例如GROUP BY子句不会位于WHERE子句的前面。 

    2、SELECT语句执行顺序 

    SELECT语句中子句的执行顺序与SELECT语句中子句的输入顺序是不一样的,所以并不是从SELECT子句开始执行的,而是按照下面的顺序执行: 

    开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果 

    每个子句执行后都会产生一个中间结果,供接下来的子句使用,如果不存在某个子句,就跳过 
    对比了一下,mysql和sql执行顺序基本是一样的, 标准顺序的 SQL 语句为: 

    select 考生姓名, max(总成绩) as max总成绩 
    
    from tb_Grade 
    
    where 考生姓名 is not null 
    
    group by 考生姓名 
    
    having max(总成绩) > 600 
    
    order by max总成绩 


     在上面的示例中 SQL 语句的执行顺序如下: 

       (1). 首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据 

       (2). 执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据 

       (3). 执行 GROUP BY 子句, 把 tb_Grade 表按 "学生姓名" 列进行分组(注:这一步开始才可以使用select中的别名,他返回的是一个游标,而不是一个表,所以在where中不可以使用select中的别名,而having却可以使用,感谢网友  zyt1369  提出这个问题)
       (4). 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值 

       (5). 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的. 

       (7). 执行 ORDER BY 子句, 把最后的结果按 "Max 成绩" 进行排序. 

     

    希望此篇文章能让大家对mysql执行顺序有一个了解,另外为大家推荐两篇MySQL优化的文章:

    MySQL优化之推荐使用规范

    MySQL优化之my.conf配置详解

    大家可关注我的微信公众号:裸睡的猪,后期会为大家推荐更多有用的文章!


     

    展开全文
  • Mysql 语句执行顺序

    万次阅读 多人点赞 2016-04-26 21:51:48
    纸上得来终觉浅 1.这样一个问题,作为一个开发人员需要掌握数据库的哪些东西? 在开发中涉及到数据库,基本上只用到了sql语句,如何写sql...1)Mysql执行顺序,这个是写sql的核心,之前遇到的一些错误就是因为对其不了

    纸上得来终觉浅

    1.这样一个问题,作为一个开发人员需要掌握数据库的哪些东西?  在开发中涉及到数据库,基本上只用到了sql语句,如何写sql以及对其进行优化就比较重要,那些mysql的厚本书籍针对的是DBA,我们只需要学习其中的sql就可以了。

    2.既然会写sql是目标,那么怎么才能写好sql.学习下面几点:

    1)Mysql的执行顺序,这个是写sql的核心,之前遇到的一些错误就是因为对其不了解;

    2)如何进行多表查询,优化,这个是很重要的部分;

    3)sql语句的函数,sql提供的函数方便了很多操作;

    3.这篇对Mysql语句执行顺序的学习做了总结:

    1)Mysql语法顺序,即当sql中存在下面的关键字时,它们要保持这样的顺序:

    select[distinct]
    from
    join(如left join)
    on
    where
    group by
    having
    union
    order by
    limit

     
    

    2)Mysql执行顺序,即在执行时sql按照下面的顺序进行执行:

    from
    on
    join
    where
    group by
    having
    select
    distinct
    union
    order by
    3)针对上面的Mysql语法顺序和执行顺序,循序渐进进行学习:

    建立如下表格orders:


    注:下面所有语句符合语法顺序(也不可能不符合,因为会报错^_^),只分析其执行顺序:(join和on属于多表查询,放在最后展示)

    语句一:

    select a.Customer
    from orders a
    where a.Customer='Bush' or a.Customer = 'Adams'
    分析一:首先是from语句找到表格,然后根据where得到符合条件的记录,最后select出需要的字段,结果如下:


    语句二groupby:groupby要和聚合函数一起使用

    select a.Customer,sum(a.OrderPrice)
    from orders a
    where a.Customer='Bush' or a.Customer = 'Adams'
    group by a.Customer
    分析二:在from,where执行后,执行group by,同时也根据group by的字段,执行sum这个聚合函数。这样的话得到的记录对group by的字段来说是不重复的,结果如下:

    语句三having:

    select a.Customer,sum(a.OrderPrice)
    from orders a
    where a.Customer='Bush' or a.Customer = 'Adams'
    group by a.Customer
    having sum(a.OrderPrice) > 2000
    分析三:由于where是在group之前执行,那么如何对group by的结果进行筛选,就用到了having,结果如下:


    语句四distinct: (为测试,先把数据库中Adams那条记录的OrderPrice改为3000)

    select distinct sum(a.OrderPrice)
    from orders a
    where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
    group by a.Customer
    having sum(a.OrderPrice) > 1700
    分析四:将得到一条记录(没有distinct,将会是两条同样的记录):


    语句五union:完全是对select的结果进行合并(默认去掉重复的记录):

    select distinct sum(a.OrderPrice) As Order1
    from orders a
    where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
    group by a.Customer
    having sum(a.OrderPrice) > 1500
    union
    select distinct sum(a.OrderPrice) As Order1
    from orders a
    where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
    group by a.Customer
    having sum(a.OrderPrice) > 2000
    分析五:默认去掉重复记录(想保留重复记录使用union all),结果如下:


    语句六order by:

    select distinct sum(a.OrderPrice) As order1
    from orders a
    where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
    group by a.Customer
    having sum(a.OrderPrice) > 1500
    union
    select distinct sum(a.OrderPrice) As order1
    from orders a
    where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
    group by a.Customer
    having sum(a.OrderPrice) > 2000
    order by order1
    分析:升序排序,结果如下:


    语句七limit:

    select distinct sum(a.OrderPrice) As order1
    from orders a
    where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
    group by a.Customer
    having sum(a.OrderPrice) > 1500
    union
    select distinct sum(a.OrderPrice) As order1
    from orders a
    where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
    group by a.Customer
    having sum(a.OrderPrice) > 2000
    order by order1
    limit 1
    分析七:取出结果中的前1条记录,结果如下:


    语句八(上面基本讲完,下面是join 和 on):

    select distinct sum(a.OrderPrice) As order1,sum(d.OrderPrice) As order2
    from orders a
    left join (select c.* from Orders c) d 
    on a.O_Id = d.O_Id
    where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
    group by a.Customer
    having sum(a.OrderPrice) > 1500
    union
    select distinct sum(a.OrderPrice) As order1,sum(e.OrderPrice) As order2
    from orders a
    left join (select c.* from Orders c) e 
    on a.O_Id = e.O_Id
    where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
    group by a.Customer
    having sum(a.OrderPrice) > 2000
    order by order1
    limit 1
    分析八:上述语句其实join on就是多连接了一张表,而且是两张一样的表,都是Orders。 执行过程是,在执行from关键字之后根据on指定的条件,把left join指定的表格数据附在from指定的表格后面,然后再执行where字句。

    注:

    1)使用distinct要写在所有要查询字段的前面,后面有几个字段,就代表修饰几个字段,而不是紧随distinct的字段;

    2)group by执行后(有聚合函数),group by后面的字段在结果中一定是唯一的,也就不需要针对这个字段用distinct;

    下篇讲如何进行多表查询

    展开全文
  • mysql语句执行顺序

    千次阅读 2018-04-29 17:42:56
    MySQL语句执行顺序MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作。其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对...

    MySQL的语句执行顺序

    MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作。其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是只有最后一个虚拟的表才会被作为结果返回。如果没有在语句中指定某一个子句,那么将会跳过相应的步骤。

    下面我们来具体分析一下查询处理的每一个阶段

    FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1
    ON: 对虚表VT1进行ON筛选,只有那些符合<join-condition>的行才会被记录在虚表VT2中。
    JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。
    WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合<where-condition>的记录才会被插入到虚拟表VT4中。
    GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.
    CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.
    HAVING: 对虚拟表VT6应用having过滤,只有符合<having-condition>的记录才会被 插入到虚拟表VT7中。
    SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。
    DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.
    ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10.
    LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回


    转载自http://www.cnblogs.com/rollenholt/p/3776923.htm

    展开全文
  • MySQL语句执行顺序

    2017-12-07 16:32:34
    MySQL语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作。其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是...
  • 以前有过一篇关于MySQL查询语句执行过程,这里总结一下update语句执行过程。由于update涉及到数据的修改,所以,很容易推断,update语句比select语句会更复杂一些。 1,准备 创建一张test表 CREATE TABLE `...
  • mysql语句的书写顺序和执行顺序有很大差异。 书写顺序,mysql的一般书写顺写为: select <要返回的数据列> from <表名> <join> join on where group by <分组条件> having <分组后的筛选条件> ...
  • 分页查询 LINIT 联合查询 UNION [ALL] 查询语句执行顺序总结 表的概念
  • 1.SELECT语句处理顺序 2.where 后条件执行先后顺序 1.SELECT语句处理顺序 (1)from (2)on (3)join (4)where (5)group by (开始使用select中的别名,后面的语句中都可以使用) (6)avg,sum.... (7)having (8...
  • 【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java...常见SQL顺序讲解 查询中.
  • 【数据库SQL系列】sql语句执行顺序,你理解了吗

    万次阅读 多人点赞 2020-01-13 15:29:00
    1.序言 记得前几年,还是初级的时候,面试官问到,请你讲一下sql语句的执行顺序。当时我以为就是按照sql...2.1 为什么要了解sql语句执行顺序 了解一个sql语句的执行顺序,可以让我们清楚到sql执行时的操作顺序,进...
  • MySQL执行过程以及顺序

    千次阅读 2019-10-10 14:26:09
    前言:MySQL在我们的开发中基本每天都要面对的,作为开发中的数据...MySQL服务端是如何处理请求的,又是如何执行sql语句的?本篇博客将来探讨这个问题: 本篇博客的目录 一:MySQL执行过程 二:MySQL执行过程中的状态 三...
  • 无论什么语言,不管什么框架,在这个大数据的时代,最终都会和数据库打...今天我们一起讨论一下mysql查询语句执行顺序,这对项目开发中编写sql语句非常重要,知道sql语句里各个关键字的作用,从此写sql不是问题!!!
  • MySQL语句执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作。其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对...
  • MySql执行顺序及执行计划

    万次阅读 多人点赞 2019-03-06 12:41:12
    一、mySql执行顺序 mysql执行sql的顺序从 From 开始,以下是执行的顺序流程 1、FROM table1 left join table2 on 将table1和table2中的数据产生笛卡尔积,生成Temp1 2、JOINtable2 所以先是确定表,再确定关联...
  • MySQL】--SQL语句执行顺序

    千次阅读 2020-07-22 19:22:50
    SQL语句执行顺序 一个完整的SQL语句框架如下: SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_...
  • 主要给大家介绍了SQL语句执行的相关内容,文中一步步给大家深入的讲解,包括MySQL架构总览->查询执行流程->SQL解析顺序,需要的朋友可以参考下
  • 引言 到目前为止,已经总结了常见的SQL子句,包括 SELECT 、FROM、JOIN ...ON、...除了上述这些子句,下面将会介绍另一个比较常用的子句 LIMIT ,并且总结一下SQL 语句执行顺序。 一、LIMIT 子句 LIMIT 子句...
  • SQL语句执行顺序

    千次阅读 2018-07-26 23:30:15
    SQL语句执行顺序 查询语句中select from where group by having order by的执行顺序   1.查询中用到的关键词主要包含六个,并且他们的顺序依次为  select--from--where--group by--having--order by   ...
  • Mysql----SQL查询语句执行顺序

    千次阅读 2016-08-22 16:17:17
    SQL查询语句执行顺序
  • MySQL查询语句各关键字的执行顺序

    千次阅读 2018-08-20 21:21:50
    一、书写顺序和执行顺序 书写sql语句时各关键字的顺序: select from where group by having order by 执行顺序: from where group by having select order by 二、实例分析 SELECT lord 主公ID,...
  • MySQL数据据库中我们经常使用SQL SELECT语句来查询数据,那么关于它的执行顺序,下面小编来带大家简单了解一下
  • MySQL查询语句执行顺序WHERE、JOIN等

    千次阅读 2018-12-12 23:36:37
    执行顺序 from join on where group by (从此处开始可以使用select中指定的别名) avg、sum、max having select distinct order by 举例 select sum(goods.number) from order left join goods on goods.order_id ...
  • 本文将从MySQL总体架构—>查询执行流程—>语句执行顺序来探讨一下其中的知识。 一、MySQL架构总览: 架构最好看图,再配上必要的说明文字。 下图根据参考书籍中一图为原本,再在其上添加上了自己的理解。   从...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 145,678
精华内容 58,271
关键字:

mysql语句执行顺序

mysql 订阅