sql专题 之 sql的执行顺序

文章目录

前文我们了解了sql常用的语句,这次我们对于这些语句来个小思索

戳这里→ sql专题 之 常用命令

sql的执行顺序

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

sql语句的格式

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

实际的执行顺序:

复制代码
	① from  左表l 
	② [left|inner] join  右表r on 连接条件
	⑧ select 
		⑨ distinct 要查的字段,
		⑤ sum(列字段),
		⑦ 开窗函数
	③ where 筛选条件1 and 筛选条件2
	④ group 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 null) as 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

    FROM (select * from newStudent where sex="女")as s

    where age>=18

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

相关推荐
岁岁种桃花儿7 分钟前
AI超级智能开发系列从入门到上天第四篇:AI应用方案设计
java·服务器·开发语言
2401_8331977314 分钟前
为你的Python脚本添加图形界面(GUI)
jvm·数据库·python
执笔画情ora27 分钟前
oracle数据库优化-表碎片优化性能。
数据库·oracle
架构师沉默33 分钟前
Java 终于有自己的 AI Agent 框架了?
java·后端·架构
程序员爱酸奶34 分钟前
ThreadLocal内存泄漏深度解析
java
givemeacar39 分钟前
Spring Boot中集成MyBatis操作数据库详细教程
数据库·spring boot·mybatis
skiy41 分钟前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
czlczl2002092543 分钟前
JVM创建对象过程
java·开发语言
IvorySQL1 小时前
PostgreSQL 技术日报 (3月24日)|当 MVCC 成本被重新审视
数据库·postgresql·开源
2401_895521341 小时前
PostgreSQL_安装部署
数据库·postgresql