数据库中的SELECT语句逻辑执行顺序分析
作者:junjie 发布时间:2024-01-28 06:32:18
引言
这不是一个什么多深的技术问题,多么牛叉的编程能力。这跟一个人的开发能力也没有非常必然的直接关系,但是知道这些会对你的SQL编写,排忧及优化上会有很大的帮助。它不是一个复杂的知识点,但是一个非常基础的SQL根基。不了解这些,你一直用普通水泥盖房子;掌握这些,你是在用高等水泥盖房子。
然而,就是这么一个小小的知识点,大家可以去调查一下周围的同事朋友,没准你会得到一个“惊喜”。
由于这篇文章是突然有感而写,下面随手编写的SQL语句没有经过测试。
看下面的几段SQL语句:
#1
SELECT ID,COUNT(ID) AS TOTAL
FROM STUDENT
GROUP BY ID
HAVING TOTAL>2
#2
SELECT ID,COUNT(ID) AS TOTAL
FROM STUDENT
GROUP BY ID
ORDER BY TOTAL
#3
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还没有创建,因此它是不能执行成功的。
总结
回忆起曾经随意问过一些人这个问题,不管谁说不知道时我们都会故意嘲笑一翻,当然此嘲笑非彼嘲笑。但事实证明还是有一些人不会注意到这个知识点,在此贴出来只是做为一个友好的提醒。


猜你喜欢
- require 方法的加载规则优先从缓存中加载核心模块路径形式的模块第三方模块一、优先从缓存中加载main.js:执行加载a.js模块req
- 当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values(null,'张
- 一、背景Python 是一门易于学习、功能强大的编程语言。它提供了高效的高级数据结构,还能简单有效地面向对象编程。Python 优雅的语法和
- Python中列表(list)的实现其实是一个数组,当要查找某一个元素的时候时间复杂度是O(n),使用list.index()方法,但是随着
- 在这个abc.php文件中写入如下代码。<?php phpinfo(); ?>你将会看到一个网页,网页内容通常,如下图所示:用中
- 文件的io操作的缓冲行为分为全缓冲:同系统及磁盘块大小有关,n个字节后执行一次写入操作行缓冲:遇到换行符执行一次写操作无缓冲:立刻执行写操作
- 什么是list?list 是一个序列!一串数据,这个串可以追加数据。我们可以把它看成大型商场内,儿童游玩串串车,它就像一趟一趟车厢一样,可以
- 使用celery在django项目中实现异步发送短信在项目的目录下创建celery_tasks用于保存celery异步任务。在celery_
- 现在能用自动化实现的,尽量使用自动化程序去操作,代替人工去操作,更有效率。今天说下用python结合adb命令去实现安卓手机端的通话压力测试
- 前两天特意装了一下IETester,用以方便测试,装好后使用发现IE8有两个地方需要大家注意。IE5MAC的过滤器对IE8 Beta 1版同
- HTTP Request的Header信息1、HTTP请求方式如下表:GET向Web服务器请求一个文件POST向Web服务器发送数据让Web
- 注:以下文章原文来自于Dr Charles Severance 的 《Python for Informatics》11.3 组合查询和抽取
- 本文实例讲述了Laravel框架视图和模型操作方法。分享给大家供大家参考,具体如下:视图简介:视图包含了应用程序渲染的HTML数据,并将应用
- 学了几天正则,差不多该总结整理写成果了,之前就想写语法高亮匹配来着,不过水平不够,看着例子都不理解。那么我们来分析下两位大神 次碳酸钴 和
- 本文实例总结了php随机取mysql记录方法。分享给大家供大家参考。具体分析如下:在php中要随机取mysql记录我们可以直接使用mysql
- 花了两个多钟在看 ThinkPHP 框架,不想太过深入的知道它的所有高深理论。单纯想知道怎么可以用起来,可以快捷的搭建一个网站。所以是有选择
- 引言skimage提供了io模块,顾名思义,这个模块是用来图片输入输出操作的。为了方便练习,也提供一个data模块,里面嵌套了一些示例图片,
- 无意中在csdn上看到一帖有关绘制杨辉三角的sql表达式,感觉很有意思。后来自己想下不借助临时表,根据杨辉三角的组合数计算方法C(n,m)=
- UEditor效果图一、简介UEditor是一个开源免费的编辑器,由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,
- 今天记录一下pandas筛选出一个表中满足另一个表中所有条件的数据。例如:list1 结构:名字,ID,颜色,数量,类型。list1 = [