书写顺序

  1. select[distinct]

  2. from

  3. join(如left join)

  4. on

  5. where

  6. group by

  7. having

  8. union

  9. order by

  10. limit

执行顺序

mysql执行sql的顺序从 From 开始,以下是执行的顺序流程

1、FROM table1 left join table2 on 将table1和table2中的数据产生笛卡尔集生成vt1

2、JOIN table2 所以先是确定表,再确定关联条件

3、ON table1.column = table2.column确定表的绑定条件 由vt1产生中间表vt2

4、WHERE 对中间表vt2产生的结果进行过滤 产生中间表vt3

5、GROUP BY 对中间表vt3进行分组,产生中间表vt4

6、HAVING 对分组后的记录进行聚合 产生中间表vt5

7、SELECT 对中间表vt5进行列筛选,产生中间表vt6

8、DISTINCT 对中间表 vt6进行去重,产生中间表vt7

9、ORDER BY 对vt7中的数据进行排序,产生中间表vt8

10、LIMIT 对中间表vt8进行分页,产生中间表vt9

从这个顺序中我们不难发现,所有的 查询语句都是从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选项。此时才返回结果给请求者即用户。

SQL执行顺序与书写顺序相关推荐

  1. SQL查询语句的书写顺序、执行顺序和注意事项

    SQL查询语句的书写顺序.执行顺序和注意事项 1,SQL查询语句常用关键字 select .from.where.group by.having.order by select :指定查看结果集中的那 ...

  2. SQL入门之第十六讲——总结下之前的SQL语句书写顺序

    SQL语句的书写顺序与执行顺序不是一致的 1.SQL语句的书写顺序 语句的书写顺序是比较重要的,如果顺序不对去执行也是会报错的. 之前的SELECT.WHERE.ORDER BY.LIMIT.JOIN ...

  3. mysql命令书写顺序_MySQL SQL语句书写顺序和执行顺序

    SQL语句书写顺序和执行顺序 (7) SELECT (8) DISTINCT (1) FROM (3) JOIN (2) ON (4) WHERE (5) GROUP BY (6) HAVING (9 ...

  4. SQL语句执行顺序及书写建议

    查询语句中select from where group by having order by的执行顺序 1.查询中用到的关键词主要包含六个,并且他们的顺序依次为 select--from--wher ...

  5. [Mysql] SQL的书写顺序与执行顺序

    1.SQL书写顺序 -- 完整的SELECT语句(书写顺序) SELECT [DISTINCT] 字段或表达式列表 FROM 表名 JOIN(LEFT JOIN, RIGHT JOIN) ON 连接条 ...

  6. SQL语句的书写顺序和执行顺序

    sql语句的书写顺序: select >> from >> where >> group by >> having >> order by ...

  7. sql语句的书写顺序以及执行顺序

    1. 书写顺序 按以下的顺序书写sql语句 SELECT 查询列表. FROM 表 1 [连接类型] JOIN 表2 ON 连接条件 WHERE 筛选条件 GROUP BY 分组列表 HAVING 分 ...

  8. Hive SQL执行顺序

    1.执行顺序 在 hive 和 mysql 中都可以通过 explain+sql 语句,来查看执行顺序.对于一条标准 sql 语句,它的书写顺序是这样的: select - from - where ...

  9. MySQL 学习笔记(17)— SQL 执行顺序

    以查询语句为例,我们看下面的查询语句: (6)SELECT [DISTINCT | ALL] col1, col2, agg_func(col3) AS alias (1) FROM t1 JOIN ...

最新文章

  1. svm c++实现_机器学习笔记——SVM向量机
  2. 生成彩条的MATLAB代码
  3. 无法激活安全认证服务
  4. 便捷式计算机无线功能按钮,TP-Link TL-MR13U便携式无线路由器Client模式设置
  5. golang 的交叉编译
  6. MSSQL实践-数据库备份加密
  7. 安卓设置原生alert设置圆角_安卓手机设置充电提示音全新最全教程
  8. php fpm core,在php-fpm下,服务器间歇出现core dump 追踪到php代码是include一个php文件...
  9. exists sql用法_《SQL进阶教程》笔记(3)
  10. python学习大纲-Python学习大纲,全网最清晰学习思路
  11. 我的爬虫(一)之抓取优美图库图片
  12. windows 2008 server R2 服务器docker安装
  13. android远程主机强迫关闭了一个现有的连接,远程主机强迫关闭了一个现有的连接解决方法...
  14. 【机器视觉】机器人及视觉检测系统在螺丝检测包装生产线上的应用
  15. 你的时间都去哪了?(一)数据分析指标
  16. Vue v-modle理解
  17. 程序员笔试题收集汇总(三)
  18. 激励人生成功的10句经典英文
  19. 一些 差分线的 线距 和 线宽
  20. 软件设计师-设计模式

热门文章

  1. 交互设计超全学习清单:3本书,2个播客,6门视频课程,8个优秀网站
  2. 后端java通过Base64加密再前端js进行解密
  3. Android之CardView
  4. DRAM DDR4DDR5 UDIMMRDIMM的内存测试固件开发的经验总结
  5. 5V升压充电8.4V芯片
  6. STM32的最小系统组成
  7. 方根法公式_初中数学根式运算法则公式
  8. Emulator: emulator: INFO: QtLogger.cpp:68: Critical: Uncaught ReferenceError: $ is not defined (qrc:
  9. 【面试】被问“怎么进行接口测试”的知识点大全
  10. 弹幕插件easyDanmaku.js使用详解