sql语句执行顺序是什么

天哪,这个 SQL 执行顺序……说实话真的很混乱。
让我们尝试一下。

1 . FROM 子句首先查找数据源。
例如,如果您编写 FROM 员工,它将在员工表中搜索。
如果连接多个表,则必须这样编写 JOIN:tab1 JOIN tab2 ON tab1 .id = tab2 .id。
此时,您可以给该表起一个别名,例如FROM Employee AS emp,稍后您可以使用emp来引用Employee表。
完成此步骤后,您将知道您的数据来自哪里。

2 WHERE 子句用于过滤数据。
例如,WHERE salary > 5 000 选择工资大于 5 000 的项目。
如果不选择任何内容,则可以编写 WHERE 1 =1 ,这将始终为 true。
此阶段不能直接使用 COUNT() 等函数。
比如WHERE COUNT() > 1 0肯定不行,会报错。
这种功能条件应该放在HAVING后面。

3 GROUP BY 和 HAVING 一起使用。
第一个 GROUP BY 部门,按部门分组。
分组完成后,HAVING AVG(salary) > 8 000 过滤掉平均工资> 8 000的组。
分组时最好不要将无用的字段放入SELECT中,除​​非它们是像COUNT()这样的函数参数。

4 聚合函数计算,分组然后开始计算。
例如,SUM(salary) 计算每个组的总工资。
COUNT() 等都是这样玩的。

5 在 SELECT 子句中,选择要最后显示的字段。
例如,SELECT name, SUM(salary) 显示姓名和总工资。
如果您想要全部,请写 SELECT。
如果您在 SELECT 中写入的字段不在 GROUP BY 中并且不使用聚合函数,则数据库会因为语法错误而责骂您。
除非你也写在GROUP BY里。

6 ORDER BY 子句,这就是顺序。
默认为从小到大(升序)。
要从大到小(降序)排序,您需要添加 DESC,如 ORDER BY 工资 DESC。
排序是在最后一步根据 SELECT 中写入的字段完成的。

补充一下,这个顺序和我们写SQL时使用的顺序不同。
通常,您先编写 SELECT,然后编写 FROM,然后编写 WHERE。
但实际运行时,必须遵循前面提到的顺序。
首先使用 FROM 查找数据,然后使用 WHERE 过滤,然后使用 GROUP BY 分组,使用 HAVING 过滤分组结果,然后计算聚合函数,最后使用 SELECT 选择字段,最后使用 ORDER BY 排序。

理解这个顺序可以让你在编写SQL时省去麻烦。
例如,尽可能将过滤条件放在 WHERE 中,而避免 HAVING。
如果可能的话,最小化计算将带来更好的性能。

SQL语句执行顺序相关问题

总之,SQL语句的执行顺序其实很简单,只是很多人不注意而已。
书写顺序和执行顺序的差异是由于数学理论和文化差异的影响。
我们先来说说最重要的事情。
执行顺序为 from -> join -> on -> where -> groupby -> getting -> select -> orderby -> limit。
起初我认为 groupby 应该在 where 之前执行,但后来我发现这是一个错误。
这是因为先过滤后分组,减少了数据量,提高了效率。
再等一分钟。
在MySQL中,where比has更有效率。
因为where过滤数据较早,所以在groupby之后需要处理的数据相对较少。
聚合函数需要在分组后进行计算,因此只有需要参与过滤条件时才可以使用聚合函数。
很多人没有注意到这一点,但值得一试。
综上所述,了解SQL执行的顺序对于查询优化和调试非常有用。

一条 SQL 查询语句如何执行的

SQL执行过程分为7 步,由服务器和引擎配合完成。

1 .连接器:建立TCP连接,验证用户名和密码。
语言:首先,客户端连接MySQL并检查谁在使用它以及他们是否有权限。

2 查询缓存:MySQL8 .0已废弃,到达则直接返回结果。
大白话:之前运行的SQL保存在内存中,使用过一次就记住,下次直接提供结果。

3 分析器:解析SQL并查看其是否正确。
语言:将“SELECT FROM T WHERE ID=1 0”转为MySQL可以理解的结构。

4 优化器:选择最佳路径并查看索引表连接。
大白话:哪个索引更快,先查哪个表,复杂的SQL变得更简单。

5 Executor:使用引擎接口检查数据。
白话:作为最优方案,调用InnoDB或者MyISAM接口来查找数据。

6 存储引擎:实际访问数据。
语言:InnoDB从索引树中找到ID=1 0的行并添加公钥。

7 返回结果:数据发送回客户端。
大白话:执行器封装数据,通过连接器传回客户端。

你自己考虑一下。