zoukankan      html  css  js  c++  java
  • SQL 查询并不是从 SELECT 开始的

    如果不喜欢以上五彩斑斓的图片形式,也可以看下面的文字:

    FROM/JOIN/ON
    WHERE
    GROUP BY
    HAVING
    SELECT(窗口函数即在此步骤执行)
    ORDER BY
    LIMIT

    上图可以解答你的如下疑惑:

    上图是 SQL 查询的语义说明。看懂这张图,便能迅速判断一个给定的 SQL 查询将会返回什么结果,也可以轻松解答如下疑问:

    • 可以对 GROUP BY 的结果进行WHERE 筛选吗?(不可以!因为 WHERE 在 GROUP BY 之前执行)
    • 可以对窗口函数的执行结果进行过滤吗?(不可以!因为窗口函数在 SELECT 步骤执行,而这步是在 WHERE 和 GROUP BY 之后)
    • 可以对 GROUP BY 的结果再执行 ORDER BY 操作吗? (可以!ORDER BY 基本上是最后一个步骤了,所以可以对任何操作的执行结果执行 ORDER BY)
    • LIMIT 执行在哪个步骤? (最后一步!)

    虽然如此,但实际上数据库引擎并非严格按照这个顺序运行查询,因为它们还会执行一系列的优化,以便提升查询速度。

    所以:

    • 当你想了解查询语句的有效性,或是想搞明白为什么会返回这样一个查询结果时,可以尝试用该图来解释;

    • 但是,使用该图是无法解释查询性能或索引相关问题的,它们会涉及到更多变量,因而也更为复杂。

    最容易搞混的:列别名

    比如:关联姓和名,并对其进行分组。SQL 语法是允许这样写:

    SELECT CONCAT(first_name, ' ', last_name) AS full_name, count(*)
    FROM table
    GROUP BY full_name

    上面的查询看起来像是在 SELECT 之后执行 GROUP BY,但其实 GROUP BY是先执行的,因为 GROUP BY 引用了 SELECT 中的 alias

    SELECT CONCAT(first_name, ' ', last_name) AS full_name, count(*)
    FROM table
    GROUP BY CONCAT(first_name, ' ', last_name)

    https://mp.weixin.qq.com/s/j2_8UXrwFtOcTor_Jl5SPA

    https://mp.weixin.qq.com/s/VXRENi7vswxNhGLw3ruaxA

    故乡明
  • 相关阅读:
    STM32-M0中断优先级介绍
    source insight之quicker.em宏的使用
    LORA---关于LORA的30个常见问题解答
    【原创】Mac上编译Hadoop1.0.3出现的一些问题
    Mac中下载JDK手动更新出现“只支持10.7.3以上的系统版本”问题解决方案
    【Java基础】Java内部类
    【Java基础】Java类及成员和修饰符的关系
    【Java基础】Java接口的总结
    【Java基础】抽象类和抽象方法的总结
    【Java基础】Java中的多态
  • 原文地址:https://www.cnblogs.com/luweiweicode/p/15292100.html
Copyright © 2011-2022 走看看