SELECT语句逻辑执行顺序 你知道吗?
2018-07-13 08:47:49来源:编程学习网 阅读 ()
引言
这不是一个什么多深的技术问题,多么牛叉的编程能力。这跟一个人的开发能力也没有非常必然的直接关系,但是知道这些会对你的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语句的逻辑执行顺序:
- FROM
- ON
- JOIN
- WHERE
- GROUP BY
- WITH CUBE or WITH ROLLUP
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- TOP
MICROSOFT指出,SELECT语句的实际物理执行顺序可能会由于查询处理器的不同而与这个顺序有所出入。
几个示例
示例一
SELECT ID,COUNT(ID) AS TOTAL FROM STUDENT GROUP BY ID HAVING TOTAL>2
觉得这个SQL语句眼熟吗?对,非常基础的分组查询。但它不能执行成功,因为HAVING的执行顺序在SELECT之上。
实际执行顺序如下:
- FROM STUDENT
- GROUP BY ID
- HAVING TOTAL>2
- 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
这个的实际执行顺序是:
- FROM STUDENT
- GROUP BY ID
- SELECT ID,COUNT(ID) AS TOTAL
- 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)
实际执行顺序:
- FROM STUDENT
- GROUP BY ID
- SELECT ID,COUNT(ID) AS TOTAL
- 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还没有创建,因此它是不能执行成功的。
总结
回忆起曾经随意问过一些人这个问题,不管谁说不知道时我们都会故意嘲笑一翻,当然此嘲笑非彼嘲笑。但事实证明还是有一些人不会注意到这个知识点,在此贴出来只是做为一个友好的提醒。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:SQLserver的存储过程
- MySQL replace函数怎么替换字符串语句 2020-03-09
- SQL如何查询语句优化 2020-02-26
- 关于laravel后台模板laravel-admin select框的使用详解 2019-10-08
- MySQL语句大全,每天跟着操作一遍,不信你不懂! 2019-08-29
- mysql如何删除重复记录语句 2019-08-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash