精华内容
下载资源
问答
  • 1.书写顺序 (8)SELECT (6) avg,sum (9)DISTINCT <select_list> (1)FROM <table> (3)<join_type> JOIN <join_table> (2)ON <join_condition> (4)WHERE <where_condition> (5)...

    1.书写顺序

    (8)SELECT
    (6) avg,sum
    (9)DISTINCT <select_list>
    (1)FROM <table>
    (3)<join_type> JOIN <join_table>
    (2)ON <join_condition>
    (4)WHERE <where_condition>
    (5)GROUP BY <group_by_list>
    (7)HAVING <having_condition>
    (10)ORDER BY <order_by_condition>
    (11)LIMIT <limit_number>

    2.执行顺序

    每个语句前面的数字代表执行的顺序

    具体流程如下:

    第一步:首先对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选项。此时才返回结果给请求者即用户。 


     

    展开全文
  • SQL查询语句的书写顺序和执行顺序

    千次阅读 2019-12-13 21:59:54
    1、一个完整SQL查询语句的书写顺序 -- "mysql语句编写顺序" 1 select distinct * 2 from 表(或结果集) 3 where … 4 group by …having… 5 order by … 6 limit start,count -- 注:1、2属于最基本语句,必须含有。...

    1、一个完整SQL查询语句的书写顺序

    -- "mysql语句编写顺序"
    1 select distinct *
    2 from(或结果集)
    3 where4 group byhaving5 order by6 limit start,count
    -- 注:1、2属于最基本语句,必须含有。
    -- 注:1、2可以与3、4、5、6中任一搭配,也可以与3、4、5、6中多个同时搭配。
    

    2、一个完整的SQL语句执行顺序

    在这里插入图片描述
    上图的解释如下:
    在这里插入图片描述

    3、关于select和having执行顺序谁前谁后的说明

    在这里插入图片描述

    • 谁要是有说服我的说法,麻烦留言告知我一下,谢谢。
    展开全文
  • SQL语句书写顺序和执行顺序(7) SELECT(8) DISTINCT (1) FROM (3) JOIN (2) ON (4) WHERE (5) GROUP BY (6) HAVING (9) ORDER BY (10) LIMIT 书写顺序从上向下依次书写,即:SELECT→FROM→JOIN→ON→WHERE→GROUP BY...

    SQL语句书写顺序和执行顺序

    (7) SELECT

    (8) DISTINCT

    (1) FROM

    (3) JOIN

    (2) ON

    (4) WHERE

    (5) GROUP BY

    (6) HAVING

    (9) ORDER BY

    (10) LIMIT

    书写顺序从上向下依次书写,即:

    SELECT →FROM → JOIN → ON → WHERE → GROUP BY → HAVING → ORDER BY→ LIMIT

    而执行顺序按照左侧编号进行。即:

    FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT →DISTINCT → ORDER BY→ LIMIT

    MySql执行顺序理解

    加载 from关键词后面跟的表,计算笛卡尔积,生成虚拟表vt1。这也是sql执行的第一步:表示要从数据库中执行哪些表。

    筛选关联表中满足on表达式的数据,保留主表数据,并生成虚拟表vt2。join表示要关联的表,on代表连接条件。

    如果使用的是外连接,执行on的时候,会将主表中不符合on条件的数据也加载进来,作为外部行。

    如果from子句中涉及多张表,则重复第一步到第三步,直至所有的表都加载完毕,更新vt3。

    执行where表达式,筛选出符合条件的数据生成vt4。

    执行 group by 子句进行分组。分组会把子句组合成唯一值并且每个唯一值只包含一行,生成vt5。一旦执行group by,后面的所有步骤只能操作vt5中的列(group by的子句包含的列)和聚合函数。

    温馨提示:这一步开始才可以使用select中的别名,它返回的是一个游标,而不是一张表,所以在where中不可以使用select中的别名,而having却可以。

    执行聚合函数,例如sum、avg等,生成vt6。

    执行having表达式,筛选vt6中的数据。having是唯一一个可以在分组后执行的条件筛选表达式,生成vt7。

    执行SELECT,从vt7中筛选列,生成vt8。

    执行distinct,对vt8去重,生成vt9。

    其实执行过group by后就没必要再去执行distinct,因为分组后,每组只会有一条数据,并且每条数据都不相同。

    按照order_by_condition 对vt9进行排序,此处亦可以使用别名。这个过程比较耗费资源。

    执行 limit 语句,取出指定条数的结果集返回给客户端。

    实例

    select g.student_id, sum(成绩) as sum成绩

    from t_grade g INNER JOIN t_student s on g.student_id = s.id

    where s.clasz = '高一1班'

    group by g.student_id

    having sum成绩 > 600

    order by sum成绩

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

    首先执行 FROM 子句, 从表 t_grade 和 t_student 组装数据源的数据,执行一个笛卡尔乘积,此时生成虚拟表 vt1。

    接下来便是应用on筛选器,on 中的逻辑表达式将应用到 vt1 中的各个行,筛选出满足 on 逻辑表达式的结果集,生成虚拟表 vt2。

    由于是 inner join,故把两张表过滤的行添加进来,生成虚拟表vt3。

    执行 WHERE 子句, 筛选 vt3中高一1班所有数据。

    执行 GROUP BY 子句, 按 student_id 列进行分组。

    温馨提示:这一步开始才可以使用select中的别名,它返回的是一个游标,而不是一张表,所以在where中不可以使用select中的别名,而having却可以。

    使用聚合函数 sum() 计算各位同学的总成绩。

    执行 HAVING 子句, 筛选课程总成绩大于 600 分的学生。

    知识扩展

    on和where的区别

    简单地说,当有外关联表时,on主要是针对外关联表进行筛选,主表保留;当不是外关联表时,二者作用相同。例如在左外连时,首先执行on,筛选掉外连表中不符合on表达式的数据,而where的筛选是对on关联后的结果集进行筛选。

    limit 分页

    若每页显示条目数记为pageSize,显示的页数记为page,则有:

    SELECT * FROM table_name LIMIT (page-1)* pageSize, pageSize

    结束语

    了解了MySQL中SQL的执行顺序,对我们开发者大有裨益,可以写出更健壮的代码。

    本文总结了mysql的书写顺序和执行顺序,理解这些有助于优化sql语句,有助于掌握 MySQL 中的 sql 语句从写出来到最终执行的轨迹,有助于深入和细致的认识 sql,提高数据库理解能力。同时,对于复杂sql的执行过程、编写都会有一定程度的意义。

    以上就是这篇文章的全部内容了,希望本文对大家的学习或者工作具有一定的参考和学习价值;如果有疑问,大家可以在评论区留言交流,也希望大家多多点赞关注。谢谢大家对楼兰的胡杨的支持!

    Reference

    展开全文
  • SQL查询语句的书写顺序执行顺序和注意事项 1,SQL查询语句常用关键字 select 、from、where、group by、having、order by select :指定查看结果集中的那个列或列的计算结果 from :从哪张表查询数据 where :...
  • 文章目录SQL语句书写顺序和执行顺序 SQL语句书写顺序和执行顺序 //书写顺序 select 查询列表(字段)⑦ from 表 ① 连接类型Join 表2 ② on 连接条件 ③ where 筛选条件 ④ group by 分组列表 ⑤ having 分组后的...
  • 一同学去面试,面试官让说一下sql执行顺序,他尽然答错了,面试也就到此结束了!实属不应该。。。
  • mysql语句的书写顺序和执行顺序有很大差异。 书写顺序,mysql的一般书写顺写为: select <要返回的数据列> from <表名> <join> join on where group by <分组条件> having <分组后的筛选条件> ...
  • sql语句执行书写顺序

    千次阅读 2018-09-05 14:58:49
    查询语句中select from where group by having order by的执行顺序 1.查询中用到的关键词主要包含六个,并且他们的顺序依次为 select–from–where–group by–having–order by 其中select...
  • SQL书写顺序 select field_name_list from table_name where filter_expression group by field_name_list having filter_expression order by field_name_list limit start, size; 执行顺序 from 表 where ...
  • SQL语句的执行顺序

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

    千次阅读 2018-07-20 15:06:04
    一、语法顺序和执行顺序  (1)SQL语句的语法顺序:   SELECT[DISTINCT]  FROM  JOIN  ON  WHERE  GROUP BY  HAVING  UNION  ORDER BY  LIMIT  (2)SQL的执行顺序 ...
  • 一、sql编写顺序 1、SELECT DISTINCT <select list> 2、FROM <left_table><join_type> 3、JOIN <right_table> ON <join_condition> 4、WHERE <where_condition> 5、...
  • 其中selectfrom是必须的,其他关键词是可选的,他们的执行顺序与sql语句的书写顺序并不是一致的,他们的执行顺序为: from--where--group by--having--select--order by, from:需要从哪个数据表检索数据 where...
  • 补充: 1,笛卡尔积,左表的第一行, 右表的所有行进行关联。 左表的第二行,再右表的所有行做关联,这样… 所有的行所有行就用关系了。 ...6,如果有子查询可以优先执行子查询中的东西 ...
  • SQL语句的书写顺序和解析顺序

    千次阅读 2018-02-06 17:32:52
    sql语句的书写顺序:select ---> from --->where ---> group by ---> having ---> order by 其中wherehaving是不能同时使用的,并且havinggroup by 是联合使用的 sql语句的解析顺序 : from --->where --
  • 之所以引出sql书写顺序和执行顺序,源于具体要解决的问题是:一个账号对应多个角色,每个角色都有等级,需要查询每一个账号下等级最大的那个角色id,且最大等级大于20?错误方案:select char_id ,levelfrom tbl_char...
  • 查询中用到的关键词主要由6个,分别是:select、from、where、group by、having、order by书写顺序:顺序与上一行一致。不过其中selectfrom为必须,其他关键词是可选执行顺序:from、where、group by、having、...
  • 查询中用到的关键词主要包含六个,并且他们的书写顺序为 select--from--where--group by--...其中selectfrom是必须的,其他关键词是可选的,这六个关键词的执行顺序与书写顺序并不是一样的,执行顺序为 from-
  • 虽然SQL书写顺序是固定的,但在MySQL引擎中执行的顺序并不完全和书写顺序一致。除了上述这些子句,下面将会介绍另一个比较常用的子句 LIMIT ,并且总结一下SQL 语句的执行顺序。 一、LIMIT 子句 LIMIT 子句...
  • 写的顺序:select ... from... where.......执行顺序:from... where...group by... having.... select ... order by...MYSQL中:写的顺序:select ... from... wher... 写的顺序:select ... from..
  • 书写顺序 select[distinct] from join(如left join) on where group by having union order by limit 执行顺序 mysql执行sql的顺序从 From 开始,以下是执行...
  • 书写和执行顺序:where、group by、having、order by 当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是: 1.执行where xx对全表数据做筛选,返回第1个结果集。 2.针对第1个结果...
  • 书写顺序 SELECT DISTINCT FROM JOIN ON WHERE GROUP BY HAVING ORDER BY LIMIT 执行顺序 FROM ON JOIN WHERE GROUP BY HAVING SELECT DISTINCT ORDER BY LIMIT
  • FROM : HOMESQL 是一种声明式语言SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉计算机如何能够得到结果。...SQL 语句的语法顺序是:SELECT[DISTINCT]FROMWHEREGROUP BYHAVI...
  • sql执行顺序

    千次阅读 2019-01-27 17:35:05
    书写顺序 select - from - where - group by - having - order by 执行顺序 from - where - group by - having - select - order by where 从右到左 过滤掉最大数量记录的条件放在末尾 group by 从左到右 需要过滤的...
  • SQL查询中用到的关键词:select、distinct、from、join、on、where、group by、having、sum、count、max、avg、order by、limit书写顺序:​ select->distinct->from->join->on->where->group ...
  • sql 查询语句执行顺序

    千次阅读 2021-05-29 20:50:09
    了解 sql执行顺序是很必要的,执行顺序不同可能查询到的结果最后也会不一样。 select 语句的完整语法如下: SELECT    DISTINCT < select_field >   FROM < ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,681
精华内容 11,472
关键字:

sql书写顺序和执行顺序