• SQL执行顺序


    看到一篇讲sql语句执行顺序的文章,觉得比较有意思,自己测试之后和大家分享一下
    让我们通过一个有趣的统计,来看看SQL语句的执行顺序。
    正好有一些数据资源,那选取大家应该会比较有兴趣的话题,哪个星座的空姐最多?
    选取的表CREW_V
    因为一般一个星座的开始都是在当月的20到23号,因为在做统计的时候,我在每个出生日期-22天,这样,就可能通过月份来代表星座
    例如处女座是在8月23号到9月23号,那-22天后,只要统计出来生日在8月的,就可以粗略的认为这个人是处女座
     
    看下面的几段SQL语句:
    --统计空姐的出生月份
    SELECT TO_CHAR(BIRTH_DT-22, 'MM' ), COUNT(TO_CHAR(BIRTH_DT-22'MM' )) AS BIRTH
      FROM CREW_V
      WHERE SEX = 'F'
       AND NON_CREW_IND = 'N'
      GROUP BY BIRTH
    --统计空姐的出生月份,当月出生人数大于100的才记录
    SELECT TO_CHAR(BIRTH_DT-22, 'MM' ),
           COUNT (TO_CHAR(BIRTH_DT-22, 'MM' )) AS BIRTH
      FROM CREW_V
      WHERE SEX = 'F' AND NON_CREW_IND = 'N'
      GROUP BY TO_CHAR(BIRTH_DT-22, 'MM' )
    HAVING COUNT (BIRTH) > 100
     
    --按照月份出生的人数排序
    SELECT TO_CHAR(BIRTH_DT-22, 'MM' ), COUNT(TO_CHAR(BIRTH_DT-22, 'MM')) AS BIRTH
      FROM CREW_V
     WHERE SEX = 'F'
       AND NON_CREW_IND = 'N'
     GROUP BY TO_CHAR(BIRTH_DT-22, 'MM' )
     ORDER BY BIRTH
     
     
     
    你觉得哪一个能够成功执行?
     

    示例一

    SELECT TO_CHAR(BIRTH_DT, 'MM' ), COUNT(TO_CHAR(BIRTH_DT, 'MM' )) AS BIRTH
      FROM CREW_V
      WHERE SEX = 'F'
       AND NON_CREW_IND = 'N'
      GROUP BY BIRTH
    实际执行顺序:
    1、FROM CREW_V
    2、WHERE SEX = 'F' AND NON_CREW_IND = 'N'
    3、GROUP BY BIRTH
    4、SELECT TO_CHAR(BIRTH_DT, 'MM' ), COUNT(TO_CHAR(BIRTH_DT, 'MM' )) AS BIRTH
     
    很明显,执行GROUP BY BIRTH时别名BIRTH还没有创建,因此它是不能执行成功的。
     
    示例二
    SELECT TO_CHAR(BIRTH_DT, 'MM' ),
           COUNT (TO_CHAR(BIRTH_DT, 'MM' )) AS BIRTH
      FROM CREW_V
      WHERE SEX = 'F' AND NON_CREW_IND = 'N'
      GROUP BY TO_CHAR(BIRTH_DT, 'MM' )
    HAVING COUNT (BIRTH) > 100
     
    这是非常基础的分组查询。但它不能执行成功,因为HAVING的执行顺序在SELECT之上。
    实际执行顺序如下:
    1. FROM CREW_V
    2.  WHERE SEX = 'F' AND NON_CREW_IND = 'N'
    3. GROUP BY TO_CHAR(BIRTH_DT, 'MM' )
    4. HAVING COUNT (BIRTH) > 100
    5. SELECT TO_CHAR(BIRTH_DT, 'MM' ), COUNT (TO_CHAR(BIRTH_DT, 'MM' )) AS BIRTH
    很明显,BIRTH是在最后一句SELECT TO_CHAR(BIRTH_DT, 'MM' ), COUNT (TO_CHAR(BIRTH_DT, 'MM' )) AS BIRTH执行过后生成的新别名。
    因此,在HAVING COUNT (BIRTH) > 100执行时是不能识别BIRTH的。
     
    示例三
    SELECT TO_CHAR(BIRTH_DT, 'MM' ), COUNT(TO_CHAR(BIRTH_DT, 'MM')) AS BIRTH
      FROM CREW_V
     WHERE SEX = 'F'
       AND NON_CREW_IND = 'N'
     GROUP BY TO_CHAR(BIRTH_DT, 'MM' )
     ORDER BY BIRTH
    这一次没有任何问题,能够成功执行。
    1、 FROM CREW_V
    2、 WHERE SEX = 'F'  AND NON_CREW_IND = 'N'
    3、 GROUP BY TO_CHAR(BIRTH_DT, 'MM' )
    4、 SELECT TO_CHAR(BIRTH_DT, 'MM' ), COUNT(TO_CHAR(BIRTH_DT, 'MM')) AS BIRTH
    5、 ORDER BY BIRTH
     

    下面是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

    下面给大家分享一点私密的数据

  • 相关阅读:
    Xcode工程编译错误之iOS开发之The Xcode build system has crashed. Please close and reopen your workspace
    flutter学习之二Material Design设计规范
    Instruments之Xcode Analyze 代码静态检查及问题解决
    【Flutter学习】之MaterialApp和Scaffold组件使用详解
    ItunesConnect:"Missing Push Notification Entitlement"警告-----以及解决方法
    iOS 微信打开第三方应用(Universal Links 和 URL Schemes)
    关于代理服务器的原理及用法
    Xcode工程编译错误之iOS开发之Sending '__strong typeof (xxx)' (aka 'xxxx *__strong') to parameter of incompatible type 'id<xxx>'
    HL AsySocket 服务开发框架
    feign hystrix 线程池伸缩控制
  • 原文地址:https://www.cnblogs.com/pfxiong/p/3745421.html
Copyright © 2020-2023  润新知