关于sql和MySQL的语句执行顺序

今天做了一道面试题,问的是sql和MySql语句的执行顺序
那么先放上Sql语句执行顺序:
from 、 join 、 on 、where、 group by(开始使用select中的别名,后面的语句中都可以使用) 、 avg,sum… 、 having 、 select 、 distinct 、 order by 、 limit
那么再放上MySql语句的执行顺序:
开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果

例子:
select name, max as 总成绩

from tb_student

where name is not null

group by name

having max > 600

order by max;

在上面的示例中 SQL 语句的执行顺序如下:

(1). 首先执行 FROM 子句, 从 tb_student 表组装数据源的数据

(2). 执行 WHERE 子句, 筛选 tb_student 表中所有数据不为 NULL 的数据
(3). 执行 GROUP BY 子句, 把 tb_student 表按 “name” 列进行分组(注:这一步开始才可以使用select中的别名,他返回的是一个游标,而不是一个表,所以在where中不可以使用select中的别名,而having却可以使用)
(4). 计算 max() 聚集函数, 按 “总成绩” 求出总成绩中最大的一些数值

(5). 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的.

(6). 执行 ORDER BY 子句, 把最后的结果按 "max " 进行排序.

### MySQL 查询解析 在MySQL中,当接收到一条SQL语句时,服务器会先通过分析器对其进行处理。此过程涉及两个主要部分:预处理与解析。在这个阶段,SQL语句被分解成其组成部分,如关键字(`SELECT`, `UPDATE`, `DELETE`, `WHERE`, `ORDER BY`, `GROUP BY`等)其他元素,并构建出一个示该命令结构的内部数据结构—即所谓的解析树[^1]。 对于相同的查询语句,如果存在任何形式上的差异,比如大小写的区别或是额外的空间字符,则会被视为两条独立的SQL指令对待,这意味着它们各自都需要经历完整的编译流程并生成各自的执行计划[^2]。 ### MySQLSQL 执行顺序 通常情况下,标准SQL语句按照如下逻辑顺序执行: 1. **FROM**: 首先确定操作的数据源; 2. **ON**: 如果有JOIN条件的话,在这里应用这些条件; 3. **OUTER**: 对于外连接而言,此时决定哪些记录应当保留下来; 4. **WHERE**: 接着过滤掉不符合特定条件的行; 5. **GROUP BY**: 将剩余的结果集按指定列分组; 6. **HAVING**: 进一步筛选基于聚合函数计算后的结果; 7. **SELECT**: 提取所需的字段或达式的值; 8. **DISTINCT**: 去除重复项; 9. **ORDER BY**: 最终对输出结果排序; 10. **LIMIT/OFFSET**: 控制返回的最大数量以及偏移量; 需要注意的是上述步骤并非总是严格按照这样的物理执行次序来进行优化,实际运行过程中可能会有所调整以提高性能效率。 ### 操作符优先级 关于SQL内的运算符优先级,它遵循一定的层次关系,其中算术运算符具有较高的优先级别,而比较逻辑运算符则相对较低一些。具体来说: - 算数运算 (`* / %`) > 加减法(`+ -`) - 比较运算 (e.g., `<`, `>`, `=`, `!=`, `<=`, `>=`) - 逻辑非 (`NOT`) - 逻辑与 (`AND`) - 逻辑或 (`OR`) 为了确保预期的行为模式,建议使用括号明确指出期望的操作序列[^4]。 ### SQL语法规范 编写清晰有效的SQL语句非常重要,良好的实践包括但不限于以下几个方面: - 使用统一的小写字母书写所有的SQL关键词,除非数据库对象名称本身含有大写字母; - 维持一致性,避免不必要的空白字符或换行符影响到SQL解释器的工作方式; - 当涉及到复杂的子查询或者其他嵌套结构的时候,适当利用缩进来增强可读性维护性; - 正确引用标识符(例如名、列名),特别是在跨多个架构的情况下更要注意这一点; - 利用注释来描述复杂查询的目的及其工作原理,方便后续理解调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值