源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

数据库中的SELECT语句逻辑执行顺序分析

  • 时间:2020-08-06 15:05 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:数据库中的SELECT语句逻辑执行顺序分析
[b]引言[/b]   这不是一个什么多深的技术问题,多么牛叉的编程能力。这跟一个人的开发能力也没有非常必然的直接关系,但是知道这些会对你的SQL编写,排忧及优化上会有很大的帮助。它不是一个复杂的知识点,但是一个非常基础的SQL根基。不了解这些,你一直用普通水泥盖房子;掌握这些,你是在用高等水泥盖房子。   然而,就是这么一个小小的知识点,大家可以去调查一下周围的同事朋友,没准你会得到一个“惊喜”。   由于这篇文章是突然有感而写,下面随手编写的SQL语句没有经过测试。   看下面的几段SQL语句:
[u]复制代码[/u] 代码如下:
#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
你觉得哪一个不能够成功执行? [b]下面是SELECT语句的逻辑执行顺序:[/b] 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语句的实际物理执行顺序可能会由于查询处理器的不同而与这个顺序有所出入。 [b]几个示例[/b] [b]示例一: [/b]
[u]复制代码[/u] 代码如下:
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的。 [b]示例二 [/b]
[u]复制代码[/u] 代码如下:
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)呢?
[u]复制代码[/u] 代码如下:
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。 [b]示例三 [/b]
[u]复制代码[/u] 代码如下:
SELECT FIRSTNAME+' '+LASTNAME AS NAME, COUNT(*) AS COUNT   FROM STUDENT   GROUP BY NAME
 实际执行顺序:
[u]复制代码[/u] 代码如下:
FROM STUDENT   GROUP BY NAME   SELECT FIRSTNAME+' '+LASTNAME AS NAME,COUNT(*) AS COUNT
很明显,执行GROUP BY NAME时别名NAME还没有创建,因此它是不能执行成功的。 [b]总结[/b]   回忆起曾经随意问过一些人这个问题,不管谁说不知道时我们都会故意嘲笑一翻,当然此嘲笑非彼嘲笑。但事实证明还是有一些人不会注意到这个知识点,在此贴出来只是做为一个友好的提醒。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部