引言
这不是一个什么多深的技术问题,多么牛叉的 编程能力。这跟一个人的开发能力也没有非常必然的直接关系,但是知道这些会对你的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 COUNT(ID) ORDER BY TOTAL
你觉得哪一个 不能够成功执行?
言归正传
下面是SELECT语句的逻辑执行顺序: FROMONJOINWHEREGROUP BYWITH CUBE or WITH ROLLUPHAVINGSELECTDISTINCTORDER BYTOP MICROSOFT指出,SELECT语句的实际物理执行顺序可能会由于查询处理器的不同而与这个顺序有所出入。几个示例
示例一
SELECT ID,COUNT(ID) AS TOTAL FROM STUDENT GROUP BY ID HAVING TOTAL>2觉得这个SQL语句眼熟吗?对,非常基础的分组查询。但它不能执行成功,因为HAVING的执行顺序在SELECT之上。实际执行顺序如下: FROM STUDENTGROUP BY IDHAVING TOTAL>2SELECT 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 COUNT(ID) ORDER BY TOTAL这个的实际执行顺序是: FROM STUDENTGROUP BY COUNT(ID)SELECT ID,COUNT(ID) AS TOTALORDER BY 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还没有创建,因此它是不能执行成功的。