zoukankan      html  css  js  c++  java
  • SELECT语句逻辑运行顺序,你知道吗?


    引言


    这不是一个什么多深的技术问题。多么牛叉的编程能力。这跟一个人的开发能力也没有很必定的直接关系,可是知道这些会对你的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语句的逻辑运行顺序:
    1. FROM
    2. ON
    3. JOIN
    4. WHERE
    5. GROUP BY
    6. WITH CUBE or WITH ROLLUP
    7. HAVING
    8. SELECT
    9. DISTINCT
    10. ORDER BY
    11. TOP
    MICROSOFT指出。SELECT语句的实际物理运行顺序可能会因为查询处理器的不同而与这个顺序有所出入。


    几个演示样例


    演示样例一

    SELECT ID,COUNT(ID) AS TOTAL
    FROM STUDENT
    GROUP BY ID
    HAVING TOTAL>2

    认为这个SQL语句眼熟吗?对,很基础的分组查询。但它不能运行成功,由于HAVING的运行顺序在SELECT之上。
    实际运行顺序例如以下:
    1. FROM STUDENT
    2. GROUP BY ID
    3. HAVING TOTAL>2
    4. 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

    这个的实际运行顺序是:
    1. FROM STUDENT
    2. GROUP BY ID
    3. SELECT ID,COUNT(ID) AS TOTAL
    4. 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)
    实际运行顺序:
    1. FROM STUDENT
    2. GROUP BY ID
    3. SELECT ID,COUNT(ID) AS TOTAL
    4. 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还没有创建,因此它是不能运行成功的。



    总结


    回顾起以前任意问过一些人这个问题,无论谁说不知道时我们都会有益嘲笑一翻,当然此嘲笑非彼嘲笑。但事实证明还是有一些人不会注意到这个知识点。在此贴出来仅仅是做为一个友好的提醒。






  • 相关阅读:
    输入输出重定向
    进程管理
    普通变量_环境变量_环境变量配置文件
    高级文件操作命令_文件查找
    软件包管理_rpm命令管理_yum工具管理_文件归档压缩_源码包管理
    用户管理_组管理_设置主机名_UGO_文件高级权限_ACL权限
    字符串是否包含中文
    SQL 优化
    JS数组
    RedisUtil 工具类
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6767926.html
Copyright © 2011-2022 走看看