• 技术文章 >数据库 >mysql教程

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

    伊谢尔伦伊谢尔伦2016-11-24 11:21:21原创544

     引言

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

     总结

      回忆起曾经随意问过一些人这个问题,不管谁说不知道时我们都会故意嘲笑一翻,当然此嘲笑非彼嘲笑。但事实证明还是有一些人不会注意到这个知识点,在此贴出来只是做为一个友好的提醒。

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:mysql selece
    上一篇:mysql在大型网站的应用架构演变 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 一文聊聊MySQL中的插入意向锁• 深入理解MySQL索引优化器工作原理• 简单聊聊MySQL中join查询• MySQL性能优化全攻略- 相关数据库命令_MySQL• 与datafile相关的表和视图_MySQL
    1/1

    PHP中文网