SQL语句执行顺序相关问题

这篇具有很好参考价值的文章主要介绍了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执行顺序的逻辑是什么?

  1. from用于确定操作对象,放第一位毋庸置疑。
  2. join和on用于关联,后面的各种处理逻辑依附于关联后内部创建的临时表,先生成数据集,才能为后续处理做基础。
  3. where用于筛选,可以减少后续操作的数据量,提高查询性能。
  4. group by用于对数据进行分类汇总,不放where前面,是为了避免分组后的数据被where过滤掉(分组分了个寂寞),造成算力浪费和内存资源(数据量大还是很消耗算力和内存的)的问题。
  5. having用于对分组结果进行过滤,所以要在group by之后。
  6. select用于决定迭代显示那些列,而不是限制只有这些列才可以参与处理,上游的各种操作(如复杂的where条件)不能受select字段的影响,这也是where后面跟的字段,不必在select出现的原因。select的本意是处理数据后仅仅返回这些字段,而不是决定只有这些字段进行数据处理,所以必定要放偏后的位置。
  7. order by用于结果进行排序,肯定是结果处理后才排序的,理由和group by相似。
  8. limit用于限制返回结果的行数和偏移量,必须是等筛选完分组完拍完序之后再限制,否则可能导致结果有误。

为什么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?

//报错,Invalid use of group function
select field from table where avg(field) > 2
//需要修改为
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,详细的底层原理,文档并未说明。文章来源地址https://www.toymoban.com/news/detail-825434.html

到了这里,关于SQL语句执行顺序相关问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • MySQL Select 语句执行顺序

    一条 SQL 查询语句结构如下: 但真正的执行步骤如下,执行时,每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入: 1. FROM 在这一步,无论后面跟那种联接运算(LEFT JOIN、RIGHT JOIN等),都首先执行交叉联接(CROSS JOIN),计算笛卡尔积,生成虚拟表 VT-1 2. ON 根

    2024年02月05日
    浏览(10)
  • 【MySQL系列】- SELECT语句执行顺序

    【MySQL系列】- SELECT语句执行顺序

    2.1 执行FROM操作 这一步需要做的是对FROM子句前后的两张表进行笛卡尔积操作,也称作为交叉连接,生成虚拟表VT1。如果FROM子句前的表包含a行数据,FROM子句后的表中包含b行数据,那么虚拟表VT1将包含a*b行数据。 2.2 应用ON过滤器 SELECT查询共有3个过滤流程,分别是ON、WHERE、

    2024年02月08日
    浏览(11)
  • SQL 查询的执行顺序

    by emanjusaka from ​ https://www.emanjusaka.top/2023/09/sql-query-order 彼岸花开可奈何 本文欢迎分享与聚合,全文转载请留下原文地址。 了解 SQL 查询的执行顺序对我们解决一些问题很有帮助,有时我们可能会疑惑为什么不能对分组的结果进行筛选这样类似的问题?之前一直不是理解这个

    2024年02月10日
    浏览(14)
  • 二、SQL-5.DQL-9).执行顺序

    二、SQL-5.DQL-9).执行顺序

    先执行①from(定义emp的别名为e),再执行②where(调用别名e):  再执行④select:  给④select取别名ename,eage,此时把②where别名e.age改为eage: 报错,②where在④select之前执行,eage还没有定义   ④select在⑤order by之前执行,所有order by可以用select中定义的别名:

    2024年02月15日
    浏览(15)
  • SQL_DQL_执行顺序

    SELECT              字段列表                                         4                                                           1 FROM                 表名列表                                          1 WHERE               条件列表 (可以有多个条件

    2024年01月25日
    浏览(13)
  • 02 SQL更新语句执行流程

    与查询流程不一样的是,更新流程还涉及两个重要的日志模块。 ​ redo log(重做日志)和 binlog(归档日志) ​ redo log 物理日志 binlog 逻辑日志 WAL 的全称是 Write-Ahead Logging。 关键点就是 先写日志,再写磁盘 ,用来提升更新效率。 具体来说,当有一条记录需要更新的时候,

    2024年02月19日
    浏览(12)
  • MyBatis 中如何执行 SQL 语句

    MyBatis 中如何执行 SQL 语句

    MyBatis 是一个基于 Java 的持久层框架,它提供了多种方式来执行 SQL 语句,包括直接使用 SqlSession 执行、使用映射器(Mapper)执行、使用 SqlSessionTemplate 执行等。本文将介绍 MyBatis 中常见的 SQL 执行方式及其使用方法。 在 MyBatis 中,可以通过 SqlSession 对象直接执行 SQL 语句。S

    2024年02月13日
    浏览(9)
  • 数据库--SQL关键字的执行顺序

    数据库--SQL关键字的执行顺序

    数据库-- 数据类型 : http://t.csdn.cn/RtqMD 数据库-- 三大范式、多表查询、函数sql: http://t.csdn.cn/udJSG 数据库-- MySQL增删改查: http://t.csdn.cn/xkiti select   from   join   where   group by   having   order by   聚合函数   limit   top  以及逻辑运算符not  and    or    一: 语法顺序    

    2024年02月12日
    浏览(9)
  • MyBatis中相关SQL语句

    1.between... and... 2.and   or 3.like ---两种写法 完整示例:   前端传入cust_no为1019,后端实际查询语句 注意:由于一开始where语句只写了 if test=\\\"reportRule != null没有写reportRule != \\\'\\\'\\\" ,导致查询结果出错,所以我们如果用到动态查询的话,一定要搞清楚前端传的是空值还是null值,如

    2024年02月12日
    浏览(10)
  • GaussDB SQL查询语句执行过程解析

    本文分享自华为云社区《【GaussTech第2期】GaussDB SQL查询语句执行过程解析》,作者: GaussDB 数据库。 SQL于关系型数据库而言,重要性不言而喻。就像一个乐团的指挥,指导着作品的正确演绎和节奏的和谐统一。华为云GaussDB作为新一代关系型分布式数据库,具备卓越的技术性

    2024年04月24日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包