ToB企服应用市场:ToB评测及商务社交产业平台

标题: SQL语句执行顺序相关问题 [打印本页]

作者: 莫张周刘王    时间: 2024-4-27 16:11
标题: SQL语句执行顺序相关问题
注意本文是SQL执行顺序,不是MySQL Server内部执行流程。
MySQL并非像PostgreSQL(被认为是最接近 SQL 标准的数据库之一)一样严格按照SQL标准,MySQL执行引擎会根据查询的具体情况和优化策略来决定具体的执行顺序,所以SQL执行顺序是理论顺序。
书写顺序

select...from...join...on...where...group by...having...order by...limit...
执行顺序

from->join->on->where->group by->having->select->order by->limit
SQL书写顺序与执行顺序不一致的原因?

SQL语言设计受到了数学中的关系代数和元组演算的影响。这些数学理论中并没有考虑操作顺序,历史原因造成SQL书写上的差异。
中国的语法是姓在前名在后,英文的反过来。国内是年月日,英文是月日年,文化上的差异,也是造成SQL顺序别扭的原因之一。
SQL执行顺序的逻辑是什么?

为什么SQL执行不是先group by再where?

先分组再筛选,逻辑上说的过去,相当于整理好数据再筛选,类似于创建索引和使用索引的过程,这也是问题的由来。
如果group by放在where之前执行,则需要对大量数据进行分组,分组后还要对每个组进行筛选,事先分组好的部分数据又被过滤掉了,造成算力和内存浪费,可能导致内存不足或者性能问题,这不是一个优秀的选择,倒不如先筛选过滤大量数据,然后对少量数据分组。
为什么SQL执行要先select再order by?

尝试select field2 from table order by field1,select后面没跟order by后面的field1也不报错。
根据结果反推:select影响不到order by,所以先order by在select也说的过去。
但是:select字段的别名可以在order by中使用,如果反过来就达不到这样的效果了。
为什么MySQL的where比having效率更高?

mysql执行时,先执行from用于定位操作对象,然后就是where,可能百万条的数据经过where之后只剩下几十条,然后在进行之后的操作。而group by比where多了一个环节。
聚合函数参与筛选条件,为什么只能用having?
  1. //报错,Invalid use of group function
  2. select field from table where avg(field) > 2
  3. //需要修改为
  4. select field from table group by field having avg(field) > 2
复制代码
聚合函数(常见的avg、sum、count、min、max)需要在分组之后才能计算,执行到where时还没有分组,此时对分组进行数据处理,所以报错。相当于要喝一口还没生产的可乐,不符合事物的发展规律。
为什么使用聚合函数有分组的前提?

所谓聚合函数,就是对一组数据进行汇总计算,所以有分组的前提。即便没有使用group by显式声明,SQL也会对上游过来的数据集进行默认分组(隐式分组)。
为什么字段别名不能在where中使用?

where执行在select之前,此时别名未生效。
为什么group by和having执行顺序优先于select,却可以使用字段别名?

可以肯定进行了预加载,不然一定找不到别名,会报错的。
参考官网:https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
文章说:标准 SQL 也不允许在子句中使用别名,MySQL扩展了标准SQL以允许别名。标准 SQL 不允许在子句中使用别名,MySQL扩展了标准SQL,详细的底层原理,文档并未说明。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4