当前位置: 首页 > news >正文

Sql语句执行顺序

昨天看到的,这不是一个什么多深的技术问题,多么牛叉的编程能力。这跟一个人的开发能力也没有非常必然的直接关系,但是知道这些会对你的SQL编写,排忧及优化上会有很大的帮助。它不是一个复杂的知识点,但是一个非常基础的SQL根基。

看下面的几段SQL语句:

SELECT ID,COUNT(ID) AS TOTAL

FROM STUDENT

GROUP BY ID

HAVING TOTAL>2
SELECT ID,COUNT(ID) AS TOTAL

FROM STUDENT

GROUP BY ID

ORDER BY TOTAL
SELECT FIRSTNAME+' '+LASTNAME AS NAME, COUNT(*) AS COUNT 

FROM STUDENT

GROUP BY NAME

你觉得哪一个不能够成功执行?

 

下面是SELECT语句的逻辑执行顺序:

  1. 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

MICROSOFT指出,SELECT语句的实际物理执行顺序可能会由于查询处理器的不同而与这个顺序有所出入。

 

示例一

SELECT ID,COUNT(ID) AS TOTAL

FROM STUDENT

GROUP BY ID

HAVING TOTAL>2

觉得这个SQL语句眼熟吗?对,非常基础的分组查询。但它不能执行成功,因为HAVING的执行顺序在SELECT之上。

实际执行顺序如下:

  1. FROM STUDENT
  2. GROUP BY ID
  3. HAVING TOTAL>2
  4. SELECT ID,COUNT(ID) AS TOTAL

很明显,TOTAL是在最后一句SELECT ID,COUNT(ID) AS TOTAL执行过后生成的新别名。因此,在HAVING TOTAL>2执行时是不能识别TOTAL的。

示例二

SELECT ID,COUNT(ID) AS TOTAL

FROM STUDENT

GROUP BY ID

ORDER BY TOTAL

这个的实际执行顺序是:

  1. FROM STUDENT
  2. GROUP BY ID
  3. SELECT ID,COUNT(ID) AS TOTAL
  4. ORDER BY TOTAL

这一次没有任何问题,能够成功执行。如果把ORDER BY TOTAL换成ORDER BY COUNT(ID)呢?

SELECT ID,COUNT(ID) AS TOTAL

FROM STUDENT

GROUP BY ID

ORDER BY COUNT(ID)

实际执行顺序:

  1. FROM STUDENT
  2. GROUP BY ID
  3. SELECT ID,COUNT(ID) AS TOTAL
  4. ORDER BY COUNT(ID)

没错,它是能够成功执行的,看SQL执行计划,它与上面ORDER BY TOTAL是一样的。ORDER BY 是在SELECT后执行,因此可以用别名TOTAL。

示例三

SELECT FIRSTNAME+' '+LASTNAME AS NAME, COUNT(*) AS COUNT 

FROM STUDENT

GROUP BY NAME

实际执行顺序:

FROM STUDENT

GROUP BY NAME

SELECT FIRSTNAME+' '+LASTNAME AS NAME,COUNT(*) AS COUNT

很明显,执行GROUP BY NAME时别名NAME还没有创建,因此它是不能执行成功的。

 

转载于:https://www.cnblogs.com/Eric-Zxl/p/3957521.html

相关文章:

  • Eclipse Java注释模板设置详解
  • 利用泛型减少Dao方法的数量
  • curl 浏览器模拟请求实战
  • 【BZOJ】1673: [Usaco2005 Dec]Scales 天平(dfs背包)
  • BM和KMP字符串匹配算法学习
  • MySql数据库3【优化1】表的优化
  • PHP学习路线图
  • JavaScript Cookie
  • 大数据时代,统计学方法有多大的效果?
  • 第三章:推荐系统冷启动与CB
  • 再学 GDI+[29]: TGPPen - 自定义复合画笔 - SetCompoundArray
  • WinAPI: PolyBezierTo - 绘制贝塞尔线(更新当前位置)
  • Delphi 与 DirectX 之 DelphiX(44): TDIB.DoAddColorNoise();
  • MVC与MVP(转)
  • IDisposable资源释放接口
  • 分享的文章《人生如棋》
  • 【面试系列】之二:关于js原型
  • C++类的相互关联
  • happypack两次报错的问题
  • java正则表式的使用
  • JDK 6和JDK 7中的substring()方法
  • jquery ajax学习笔记
  • REST架构的思考
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Spring Cloud Feign的两种使用姿势
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 大快搜索数据爬虫技术实例安装教学篇
  • 简单实现一个textarea自适应高度
  • 区块链分支循环
  • 删除表内多余的重复数据
  • 使用权重正则化较少模型过拟合
  • 新书推荐|Windows黑客编程技术详解
  • ​520就是要宠粉,你的心头书我买单
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core WebAPI中封装Swagger配置
  • .Net Memory Profiler的使用举例
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .Net程序帮助文档制作
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .sh 的运行
  • [ C++ ] STL_list 使用及其模拟实现
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [04]Web前端进阶—JS伪数组
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [Android View] 可绘制形状 (Shape Xml)
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [bzoj2957]楼房重建
  • [c++] 单例模式 + cyberrt TimingWheel 单例分析
  • [C++][基础]1_变量、常量和基本类型
  • [CSS]浮动
  • [HNOI2006]鬼谷子的钱袋