引言
这不是一个什么多深的技术问题。多么牛叉的编程能力。这跟一个人的开发能力也没有很必定的直接关系,可是知道这些会对你的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还没有创建,因此它是不能运行成功的。
总结
回顾起以前任意问过一些人这个问题,无论谁说不知道时我们都会有益嘲笑一翻,当然此嘲笑非彼嘲笑。但事实证明还是有一些人不会注意到这个知识点。在此贴出来仅仅是做为一个友好的提醒。