手机
当前位置:查字典教程网 >编程开发 >mysql数据库 >数据库中的SELECT语句逻辑执行顺序分析
数据库中的SELECT语句逻辑执行顺序分析
摘要:引言这不是一个什么多深的技术问题,多么牛叉的编程能力。这跟一个人的开发能力也没有非常必然的直接关系,但是知道这些会对你的SQL编写,排忧及优...

引言

这不是一个什么多深的技术问题,多么牛叉的编程能力。这跟一个人的开发能力也没有非常必然的直接关系,但是知道这些会对你的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语句逻辑执行顺序分析】相关文章:

mysql执行时间为负数的原因分析

MySQL最常见的操作语句小结

MySQL数据库varchar的限制规则说明

MYSQL数据库中的现有表增加新字段(列)

MySQL数据库优化推荐的编译安装参数小结

日期相加的查询SQL语句

MySQL数据库远程连接开启方法

WordPress如何修改Mysql数据库的表前缀

关于SQL嵌套的误解分析

根据mysql慢日志监控SQL语句执行效率

精品推荐
分类导航