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


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

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

        

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

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

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

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

    MySql执行顺序理解

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

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

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

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

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

    6. 执行 group by 子句进行分组。分组会把子句组合成唯一值并且每个唯一值只包含一行,生成vt5。一旦执行group by,后面的所有步骤只能操作vt5中的列(group by的子句包含的列)和聚合函数。
           温馨提示:这一步开始才可以使用select中的别名,它返回的是一个游标,而不是一张表,所以在where中不可以使用select中的别名,而having却可以。

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

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

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

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

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

    12. 执行 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 语句的执行顺序如下:

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

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

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

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

    5. 执行 GROUP BY 子句, 按 student_id 列进行分组。
      温馨提示:这一步开始才可以使用select中的别名,它返回的是一个游标,而不是一张表,所以在where中不可以使用select中的别名,而having却可以。

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

    7. 执行 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

    1. https://blog.51cto.com/13593129/2357192?source=dra
    2. https://www.cnblogs.com/liangbaikai00/p/13392695.html
  • 相关阅读:
    通过crontab命令创建任务
    linux 通过at命令创建任务
    在linux中如何实现定时发送邮件到指定邮箱,监测任务
    python发送邮件
    序列化分析
    文件写入
    导入excel成一个list集合不支持大文件倒入(优化点在于分批分线程导入)
    react重学
    关于java集合排序
    fiddler还是浏览器的问题
  • 原文地址:https://www.cnblogs.com/east7/p/14217030.html
Copyright © 2020-2023  润新知