数据库中的SELECT语句逻辑执行顺序分析 |
本文标签:SELECT语句,逻辑执行顺序 引言 这不是一个什么多深的技术问题,多么牛叉的编程能力 。这跟一个人的开发能力也没有非常必然的直接关系,但是知道这些会对你的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 几个示例 示例一: 复制代码 代码如下: SELECT ID,COUNT(ID) AS TOTAL FROM STUDENT GROUP BY ID HAVING TOTAL>2 觉得这个SQL语句眼熟吗?对,非常基础的分组查询 。但它不能执行成功,因为HAVING的执行顺序在SELECT之上 。 实际执行顺序如下: 1.FROM STUDENT 示例二 复制代码 代码如下: SELECT ID,COUNT(ID) AS TOTAL FROM STUDENT GROUP BY ID ORDER BY TOTAL 这个的实际执行顺序是: 1.FROM STUDENT 复制代码 代码如下: SELECT ID,COUNT(ID) AS TOTAL FROM STUDENT GROUP BY ID ORDER BY COUNT(ID) 实际执行顺序: 1.FROM STUDENT 没错,它是能够成功执行的,看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还没有创建,因此它是不能执行成功的 。 总结 回忆起曾经随意问过一些人这个问题,不管谁说不知道时我们都会故意嘲笑一翻,当然此嘲笑非彼嘲笑 。但事实证明还是有一些人不会注意到这个知识点,在此贴出来只是做为一个友好的提醒 。 |