SQL语句执行过程

在学习编程的时候要善于思考,思考为什么这样做?这样做的好处是什么?这种做法和那种做法区别在哪里?学会提出问题,带着问题去学习,对你去理解这个知识会有很大的帮助。

最近我在学习MySQL,在学习的过程中就遇到了一些问题。如下
1.为什么WHERE后面不能跟组合函数?
2.WHERE和HAVING的区别是什么,用谁好?
3.为什么HAVING后最好不跟非聚合函数的过滤条件?

这些疑问只需要了解sql语句的执行过程就可解决,,如下:

SELECT …,…,…(存在聚合函数)
FROM … (LEFT / RIGHT) JOIN … ON 多表的连接条件
WHERE 多表的连接条件 AND 不包含聚合函数的过滤条件
GROUP BY …,…
HAVING 包含聚合函数的过滤条件
ORDER BY …,… (ASC/DESC)
LIMIT …,…

SQL语句执行过程: FROM → ON → LEFT/RIGHT JOIN → WHERE → GORUP BY → HAVING → SELECT → ORDER BY → LIMIT

文字描述过程:
FROM 子句:指定要查询的表
JOIN 子句:用于将多个表连接起来
WHERE 子句:用于筛选符合条件的记录
GROUP BY 子句:用于将结果按照指定的列进行分组
HAVING 子句:用于筛选分组后的结果
SELECT 子句:用于选择要查询的列
DISTINCT 子句:用于去重
ORDER BY 子句:用于对结果进行排序
LIMIT 子句:用于限制返回的记录数量

解释:
从上述执行原理可知,为何推荐用WHERE,WHERE执行在前面,先去过滤了一遍数据,得到的数据就少了。HAVING在分组的后面,那么得先分组后才能进行筛选。(这也解释了为何WHERE不能用分组函数,HAVING为何不用不包含聚合函数的过滤条件)

以下内容是询问AI生成的,答案的准确性还有待验证(有时间会去阅读可靠的文献,确认后会再来修改)

问题:如果第一步 form 就生成虚拟表,那不就相当于是全表扫描了,where 里面的索引条件要怎么生效?

注意
需要注意的是,这只是一般情况下的执行顺序,实际上在执行查询时,数据库管理系统会根据具体的情况进行优化和调整,以提高查询的性能和效率。看下sql语句的执行原理就会明白

sql执行原理

  1. 语法分析:数据库管理系统首先对 SQL 语句进行语法分析,检查语法是否正确,如果存在语法错误,则会抛出错误信息。

  2. 查询优化:在语法分析之后,数据库管理系统会对 SQL 语句进行查询优化,以确定最优的查询计划。在查询优化阶段,数据库管理系统会考虑多个因素,如表的大小、索引的使用、查询条件的复杂性等等,以确定最佳的查询执行方式。

  3. 执行查询:在确定了最优的查询计划之后,数据库管理系统会开始执行查询操作。在执行查询操作的过程中,数据库管理系统会扫描表或者使用索引来获取数据,并将查询结果返回给用户。

  4. 事务处理:如果 SQL 语句涉及到事务处理,数据库管理系统会在执行查询操作之前开启一个事务,并在查询操作结束后提交或者回滚事务。

  5. 锁定和并发控制:在多用户环境下,数据库管理系统需要进行锁定和并发控制,以确保数据的一致性和完整性。在执行查询操作的过程中,数据库管理系统会对相关的数据进行锁定,以防止其他用户对数据进行修改。

  6. 回滚和提交:如果 SQL 语句执行成功,数据库管理系统会提交事务,并将数据保存到数据库中。如果 SQL 语句执行失败,数据库管理系统会回滚事务,并将数据恢复到执行 SQL 语句之前的状态。

总之,SQL 语句的执行原理是一个复杂的过程,需要考虑多个因素,如语法分析、查询优化、执行查询、事务处理、锁定和并发控制、回滚和提交等等。只有在这些方面都得到了充分的考虑和处理,才能够确保 SQL 语句的正确性和可靠性。

那么问题的答案就很明确了
如果第一步 form 就生成虚拟表,那么 where 里面的索引条件是无法生效的,因为它们还没有被应用到表上。为了让 where 里面的索引条件生效,我们需要先根据索引条件查询表,然后再根据查询结果生成虚拟表。这样可以避免全表扫描,提高查询效率。

具体来说,如果 where 里面的条件涉及到了表的索引字段,那么我们可以先根据索引字段查询表,得到符合条件的行,然后再根据这些行生成虚拟表。如果 where 里面的条件没有涉及到索引字段,那么我们只能先生成虚拟表,然后再根据 where 条件过滤出符合条件的行。这种情况下,我们可以使用其他的优化技术,比如分区表等,来提高查询效率。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值