首页 > 数据库 >SQL语句执行顺序相关问题

SQL语句执行顺序相关问题

时间:2024-02-12 10:55:23浏览次数:34  
标签:语句 ... 顺序 group 分组 SQL where select

注意本文是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,详细的底层原理,文档并未说明。

标签:语句,...,顺序,group,分组,SQL,where,select
From: https://www.cnblogs.com/phpphp/p/18013733

相关文章

  • 第二十天:mysql基本语法
    一、语法标准1、数据库对象和命名数据库的组件(对象):数据库、表、索引、视图、用户、存储过程、函数、触发器、事件调度器等命名规则:必须以字母开头,后续可以包括字母,数字和三个特殊字符(#_$)不要使用MySQL的保留字2、SQL语句分类DDL:DataDefinationLanguage数据定义......
  • 【数据库】postgressql设置数据库执行超时时间
    在这篇文章中,我们将深入探讨PostgreSQL数据库中的一个关键设置:SETstatement_timeout。这个设置对于管理数据库性能和优化查询执行时间非常重要。让我们一起来了解它的工作原理以及如何有效地使用它。什么是statement_timeout?statement_timeout是一个PostgreSQL服务器参数,用于设......
  • 第十九天:Mysql基础入门
    一、关系型数据库基础1、数据的分类结构化的数据   非结构化的数据  半结构化数据2、关系型数据库RDBMS (1)常用关系数据库 MySQL:MySQL,MariaDB,PerconaServerPostgreSQL:简称为pgsql,EnterpriseDBOracleMSSQLServerDB23、数......
  • 十四、MySQL与Django之Model基础
    数据库Django默认支持sqlite、mysql、oracel、postgresql等数据库1、sqlitedjango默认使用sqlite数据库Django.db.backends.sqlite3DATABASES={'default':{'ENGINE':'django.db.backends.sqlite3','NAME':os.path.join(BA......
  • PHP项目&TP框架&SQL&XSS&架构&路由&调试&写法
    开发基础-TP框架-入口&调试&路由&写法等参考手册-TP5开发手册-为了掌握了解框架首页文件看APP_PATH定义-为了后期分析核心代码全局搜索:THINK_VERSION,为了后期分析此版本是否存在漏洞。参考手册-本地代码案例对比,为了后期分析定位代码块或测试漏洞。配置文件开关(app_debug,a......
  • Elasticsearch实现Mysql的Like效果
    在Mysql数据库中,模糊搜索通常使用LIKE关键字。然而,随着数据量的不断增加,Mysql在处理模糊搜索时可能面临性能瓶颈。因此,引入Elasticsearch作为搜索引擎,以提高搜索性能和用户体验成为一种合理的选择。1、客户的诉求在ES中,影响搜索结果的因素多种多样,包括分词器、Match搜索、Term搜......
  • Flink CDC引起的Mysql元数据锁
    记一次FlinkCDC引起的Mysql元数据锁事故,总结经验教训。后续在编写FlinkCDC任务时,要处理好异常,避免产生长时间的元数据锁。同时出现生产问题时要及时排查,不能抱有侥幸心理。1、事件经过某天上午,收到系统的告警信息,告警提示:同步Mysql的某张表数据到Elasticsearch异常,提示连不......
  • NET项目&DLL反编译&MSSQL监控&VS搜索&注入&上传
    知识点1.NET普通源码&编译源码2.DLL反编译&后缀文件&指向3.代码审计-SQL注入&文件上传ASPX文件->CSASPX.CSDLL反编译后寻找看核心代码分析漏洞CSASPX.CSDLL反编译文件->ASPX文件寻找确定漏洞进行调试测试代码审计时要把这个反编译文件提取导入到IDE中后期搜索关......
  • 一次打通FlinkCDC同步Mysql数据
    业务痛点离开了业务谈技术都是耍流氓。我们来聊聊基于业务的痛点,衍生出来的多种数据同步方案。业务中常见的需要数据同步的场景1、多个库的表合并到一张表。不同的业务线或者微服务在不同的数据库里开发,但是此时有些报表需要将多个库的类似的数据合并后做查询统计。或者,某些历......
  • 【数据库】对大数据量数据集,PostgreSQL分组统计数量,限定每组最多数量
    一、背景介绍在处理大数据量数据集时,我们经常需要进行分组统计。例如,我们需要统计每个城市的人口数量、每个年龄段的人数等。在PostgreSQL中,我们可以使用row_number()函数结合over(partitionby)子句来实现这个功能。同时,为了限定每组最多数量,我们可以使用row_num<=100......