码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • SQL底层执行原理


    文章目录

    • SQL92语法
    • SQL99语法
    • SQL语句的执行顺序
    • 相关链接

    SQL92语法

    SELECT ...
    FROM ...
    WHERE ... 
    GROUP BY ...
    HAVING ...
    ORDER BY ...
    LIMIT
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    SQL99语法

    SELECT ...
    FROM ... (LEFT / RIGHT) JOIN ... ON ...
    WHERE ... 
    GROUP BY ...
    HAVING ...
    ORDER BY ...
    LIMIT ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    SQL语句的执行顺序

    在这里插入图片描述
    SQL语句执行的先后顺序为:FROM -> CROSS JOIN ->ON -> (LEFT/RIGHT) JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT。

    1. FROM阶段。如果这个阶段存在多表查询,则还需要经历
      1.1. CROSS JOIN得到笛卡儿积,得到虚拟表vt1-1;
      1.2. ON进行筛选,得到虚拟表vt1-2;
      1.3. LEFT/RIGHT JOIN,添加外部行,得到vt1-3。
      FROM阶段后,得到原始数据,即虚拟表vt1。
    2. WHERE阶段,对vt1进行过滤,得到虚拟表vt2。
    3. GROUP BY阶段,对vt2分组,得到虚拟表vt3。
    4. HAVING阶段,对vt3进行过滤,得到虚拟表vt4。
    5. SELECT阶段,从vt4中提取想要的字段,得到虚拟表vt5。
    6. DISTINCT阶段,对vt5去重,得到vt6。
    7. ORDER BY阶段,按指定字段进行排序,得到vt7。
    8. LIMIT阶段,从vt7中取出指定行,得到vt8,即最终的结果。

    SQL语句的执行顺序很好地解释了:

    • 为什么 ORDER BY中可以使用列的别名,而WHERE中不可以使用列的别名(因为WHERE在前,SELECT其次,最后是ORDER BY)。
    • 为什么 如果过滤条件中包含聚合函数,必须用HAVING, 不能用WHERE(因为WHERE在GROUP BY前,HAVING在GROUP BY后)。
    • 为什么 如果过滤条件中没有聚合函数时,虽然WHERE、HAVING都可以用,但推荐使用WHERE,WHERE的执行效率会更高(因为FROM … WHERE … GROUP BY… 是先过滤再分组,而FROM… GROUP BY …HAVING…是先分组再过滤)。

    相关链接

    使用ORDER BY 排序
    使用HAVING过滤分组

  • 相关阅读:
    【实验技术笔记】细胞表型检测之细胞迁移(细胞划痕实验 + transwell实验)
    BIOMOD2模型、MaxEnt模型物种分布模拟,生物多样性生境模拟,论文写作
    IntelliJ IDEA中使用“Generate equals() and hashCode()“提供不同模板的区别
    小目标检测方法总结
    边缘计算开源平台综述
    构建你的Conda包:使用conda skeleton命令打造包的骨架
    【Linux】yum/git/gdb
    python+django高校教师科研成果管理系统pycharm源码lw
    电脑重装系统 win11 怎么关闭系统软件通知
    DataEase看中国:数据呈现中国农业经济发展情况
  • 原文地址:https://blog.csdn.net/qzw752890913/article/details/126467585
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号