数据库中的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还没有创建,因此它是不能执行成功的。

总结

回忆起曾经随意问过一些人这个问题,不管谁说不知道时我们都会故意嘲笑一翻,当然此嘲笑非彼嘲笑。但事实证明还是有一些人不会注意到这个知识点,在此贴出来只是做为一个友好的提醒。

标签:SELECT语句,执行顺序
0
投稿

猜你喜欢

  • pymongo中group by的操作方法教程

    2021-03-23 05:44:40
  • SQL Server 2005 还原数据库错误解决方法

    2024-01-14 05:45:43
  • python在非root权限下的安装方法

    2023-12-05 20:28:35
  • MySQL在Linux系统中隐藏命令行中的密码的方法

    2024-01-20 03:38:34
  • 10个python爬虫入门实例(小结)

    2021-04-21 01:08:57
  • Python中如何添加自定义模块

    2023-06-09 23:24:38
  • 基于Python代码实现Apriori 关联规则算法

    2021-01-25 11:53:45
  • sqlserver2005利用临时表和@@RowCount提高分页查询存储过程性能示例分享

    2024-01-21 05:41:06
  • SQL语句删除2条重复数据一条保留一条

    2012-07-11 15:51:44
  • Golang详细讲解常用Http库及Gin框架的应用

    2023-08-25 23:14:41
  • Sql server2005 优化查询速度50个方法小结

    2024-01-26 16:51:52
  • OpenCV半小时掌握基本操作之直线检测

    2023-12-27 12:31:29
  • 各种页面定时跳转(倒计时跳转)代码总结

    2023-09-05 00:12:01
  • Python循环实现n的全排列功能

    2022-08-15 21:04:08
  • MySQL数据库优化技术之索引使用技巧总结

    2024-01-21 16:24:22
  • mysql如何查询两个日期之间最大的连续登录天数

    2024-01-14 09:26:22
  • 编写一个JS组件来说说call和apply的用法

    2008-11-23 17:11:00
  • 本地文件上传到七牛云服务器示例(七牛云存储)

    2023-09-17 09:00:05
  • 浅谈几种常用的JS类定义方法

    2024-04-22 12:56:56
  • 淘宝首页代码调整

    2011-04-22 12:44:00
  • asp之家 网络编程 m.aspxhome.com