当前位置: 首页 > news >正文

sql专题 之 sql的执行顺序

文章目录

  • sql的执行顺序
    • sql语句的格式
    • 实际的执行顺序:
    • 虚拟表 vs 数据集
      • 虚拟表
    • 结果集
    • 总结
    • 嵌套查询在sql查询中的执行顺序

前文我们了解了sql常用的语句,这次我们对于这些语句来个小思索
戳这里→ sql专题 之 常用命令

sql的执行顺序

SQL语句的执行顺序是数据库查询优化和结果生成的关键

sql语句的格式

	select distinct 要查的字段,sum(列字段),开窗函数from  左表l [left|inner] join  右表r on 连接条件where 筛选条件1 and 筛选条件2group by 分组的字段having 组的条件order by 排序的字段limit 限制数量;

实际的执行顺序:

from  左表l ② [left|inner] join  右表r on 连接条件⑧ selectdistinct 要查的字段,sum(列字段),⑦ 开窗函数③ where 筛选条件1 and 筛选条件2group by 分组的字段⑥ having 组的条件⑩ order by 排序的字段⑪ limit 限制数量;
  • 1、from

    识别查询的数据源,即确定要查询的表。
    如果from子句中包含多个表,那么就会进行第二步

  • 2、join on

    对from句中的表进行连接操作。可以是内连接(inner join)、左连接(left join)、右连接(right join)。连接的结果会生成一个新的包含所需数据的虚拟表

  • 3、where … and

    对虚拟表中的记录进行进一步的筛选,以排除不符合条件的记录。筛选后的结果又会生成一个新的虚拟表

  • 4、group by

    对虚拟表中的数据按照一个或者多个行进行分组,分组后仍会生成一个新的虚拟表

  • 5、聚合函数:avg、sum、count等

    使用聚合函数对每个组进行计算,并得出每个组的统计信息,然后将计算结果添加到group by的虚拟表中

  • 6、having

    对分组之后的结果进行进一步的筛选,筛选后的结果会生成一个新的虚拟表

  • 7、开窗函数

    对分组后的结果进行窗口函数计算,并生成一个新的结果集

  • 8、select [distinct]

    在having生成的虚拟表中选出符合条件的列,并生成一个新的结果集。
    如果使用了别名,也会进行替换。

  • 9、distinct

    去除结果集中的重复行。
    去重后的结果也会生成一个新的结果集。

  • 10、order by

    对结果集中的数据进行排序。
    排序后的结果会生成一个游标(注意,不是表了。因为排序会改变数据的物理顺序)

  • 11、limit/offset:返回限定的数量

    返回限制的数据数量,或者返回指定从哪条记录开始返回。

虚拟表 vs 数据集

虚拟表

通常指一种不实际存储数据的表结构,可是是视图、派生表或临时表。基于其他表或者查询的结果动态生成

  • 视图:
    create view my_view as select * from  student where class_id is not null
    

    这里的my_view是一个视图,它是基于student表中class_id不为空的条件生成的一个虚拟表。
    视图的虚拟表结构可以被定义并存储在数据库中,供后续查询使用

  • 派生表
    select * from  student where class_id is not nullas s1
    

    s1为派生表,是基于student表中class_id不为空的条件动态生成的

  • 虚拟表的特点:
    • 虚拟表是基于其他表或查询的结果动态生成的,本身不存储数据
    • 数据库管理系统可以对虚拟表进行查询优化,因为它们通常是基于特定查询需求动态生成的。
    • 可以被定义并存储在数据库中,供后续查询重用。即可重用性

结果集

SQL查询执行后返回的数据集合称为结果集,它包含了符合查询条件的所有行和列。

select sno,name from  student where class_id is not null

这个查询会返回一个结果集,其中包含student表中满足class_id不为空的所有行和sno、name列

  • 特点:
    • 包含了查询返回的实际数据,这些数据可以是来自一个或多个表的行和列的组合。
    • 结果集通常是临时的。一旦查询执行完毕,结果集就会被释放(除非它被存储在某个地方,如变量、临时表或文件中)。
    • 可处理性的。结果集可以在编程语言中通过API进行处理,如遍历、排序、筛选等。

总结

  • 存储与生成:

    虚拟表通常不存储实际数据,而是基于其他表或查询动态生成;
    结果集是查询执行后实际返回的数据集合。

  • 持久性

    虚拟表可以存储在数据库中供后续查询重用
    结果集通常是临时的,一旦查询完成就会被释放。

  • 用途

    虚拟表常用于简化复杂查询、提高查询可读性和可维护性;
    结果集则是查询执行后的直接输出,用于数据处理和展示。

嵌套查询在sql查询中的执行顺序

以下的代码都是简化的,我们假设有开窗函数、group by、having、order by、limit等限制

  • 在 select 子句中的嵌套查询

    SELECT  sno,(SELECT AVG(score) FROM student) AS average_score
    FROM  student;# 上述sql语句执行起来性能不是很高,咱们在这里只是仅作为举例分析,切勿较真哈
    # 对上述查询的优化如下:
    WITH AverageScore AS ( SELECT AVG(score) AS avg_score  FROM student)
    SELECT  s.sno,  a.avg_score AS average_score
    FROM  student s, AverageScore a;
    

    优先执行嵌套中的子查询,然后是外层的顺序,按照咱们上方介绍的来

  • 在 WHERE 子句中的嵌套查询

    SELECT  sno, name
    FROM  student
    WHERE  class_id IN (select id FROM class WHERE class_teacher is not null);
    

    优先执行嵌套中的子查询,然后是外层的顺序,按照咱们上方介绍的来

SELECT  sno, name
FROMselect * from newStudent where sex="女"as s
where age>=18

from本来就优先,from中的嵌套更得优先了。

http://www.lryc.cn/news/483304.html

相关文章:

  • Vue3 -- 基于Vue3+TS+Vite项目【项目搭建及初始化】
  • CTF-RE: TEA系列解密脚本
  • 信号量和线程池
  • 【人工智能】10分钟解读-深入浅出大语言模型(LLM)——从ChatGPT到未来AI的演进
  • 「QT」几何数据类 之 QPointF 浮点型点类
  • 可能是全网第一个MySQL Workbench插件编写技巧
  • D62【python 接口自动化学习】- python基础之数据库
  • 探索美赛:从准备到挑战的详细指南
  • IP地址查询——IP归属地离线库
  • “倒时差”用英语怎么说?生活英语口语学习柯桥外语培训
  • Linux入门攻坚——37、Linux防火墙-iptables-3
  • 微服务架构面试内容整理-安全性-Spring Security
  • 新的服务器Centos7.6 安装基础的环境配置(新服务器可直接粘贴使用配置)
  • 深度学习:广播机制
  • 音视频入门基础:FLV专题(25)——通过FFprobe显示FLV文件每个packet的信息
  • Openstack7--安装消息队列服务RabbitMQ
  • day55 图论章节刷题Part07([53.寻宝]prim算法、kruskal算法)
  • LeetCode 93-复制 IP地址
  • 海底捞点单
  • It’s All About Your Sketch: Democratising Sketch Control in Diffusion Models
  • Java基础-组件及事件处理(下)
  • npm list -g --depth=0(用来列出全局安装的所有 npm 软件包而不显示它们的依赖项)
  • 深度学习:nn.Linear
  • 大数据新视界 -- 大数据大厂之 Impala 性能提升:高级执行计划优化实战案例(下)(18/30)
  • 常用的Anaconda Prompt命令行指令
  • 如何低成本、零代码开发、5分钟内打造一个企业AI智能客服?
  • 全网最全最新最细的MYSQL5.7下载安装图文教程
  • NoSQL数据库与关系型数据库的主要区别
  • ubuntu24.04安装matlab失败
  • Oracle 11g rac 集群节点的修复过程