龙都娱乐»龙都娱乐»SELECT语句逻辑执行顺序 你知道吗?

SELECT语句逻辑执行顺序 你知道吗?

来源:DePaul 发布时间:2014-05-08 阅读次数:

 引言

  这不是一个什么多深的技术问题,多么牛叉的编程能力。这跟一个人的开发能力也没有非常必然的直接关系,但是知道这些会对你的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还没有创建,因此它是不能执行成功的。

     总结

      回忆起曾经随意问过一些人这个问题,不管谁说不知道时我们都会故意嘲笑一翻,当然此嘲笑非彼嘲笑。但事实证明还是有一些人不会注意到这个知识点,在此贴出来只是做为一个友好的提醒。
    QQ群:WEB龙都娱乐官方群(515171538),验证消息:10000
    微信群:加小编微信 849023636 邀请您加入,验证消息:10000
    提示:更多精彩内容关注微信公众号:全栈龙都娱乐中心(fsder-com)
    sql
    网友评论(共0条评论) 正在载入评论......
    理智评论文明上网,拒绝恶意谩骂 发表评论 / 共0条评论
    登录会员中心
    龙都娱乐