当前位置: 首页 > news >正文

根据mysql的执行顺序来写select

过滤顺序指的是mysql的逻辑执行顺序,个人觉得我们可以按照执行顺序来写select查询语句。

目录

  • 一、执行顺序
  • 二、小tips
  • 三、案例
    • 第一轮查询:统计每个num的出现次数
    • 第二轮查询:计算**最多次数**
    • 第三轮查询:找到所有出现次数为最多次数的所有数字,并找到这些数字中的最大值
    • 计算结果展示:
    • 补充说明
  • 四、结语

一、执行顺序

  1. FROM子句
    这是执行的第一步,数据库系统读取指定的表和视图,这是后续所有操作的基础。

  2. JOIN
    如果涉及多个表,则基于JOIN条件,将表中的行组合起来。

  3. WHERE子句:对行的过滤
    接下来,数据库系统会过滤掉不符合WHERE条件的行。这是在聚集函数(如COUNT、SUM等)应用之前进行的,因此只作用于原始数据。
    WHERE 子句后面不能直接接聚合函数(如 COUNT(), MAX(), SUM() 等)。WHERE 子句用于指定从基础数据表中选择哪些行的标准,这些标准必须是能够对每一行单独评估的布尔表达式。由于聚合函数是在行群(group)上操作的,而不是单独的行上,所以它们不能直接在 WHERE 子句中使用。
    总之,是对原始数据的每一行进行操作!!!没法联系多行进行判断,所以不能用聚集函数!!!!!

  4. GROUP BY子句
    将之前得到的结果集按照指定的列值进行分组,为聚集函数(如COUNT、SUM等)的应用做准备。

  5. HAVING子句:对组的过滤
    与WHERE类似,但它是在聚集函数应用后对分组的结果进行过滤,相比于where,涉及到了多行,所以可以使用聚集函数。
    可以简单理解成:where过滤掉行,having过滤掉组,均是接的布尔表达式。
    没有 GROUP BY 的上下文中单独使用 HAVING 是不常见的,而且可能不被所有SQL数据库支持。

  6. SELECT
    选取指定的列。
    如果使用了聚集函数,那么非聚集列必须出现在GROUP BY子句中,除非它们在聚集函数内部。比如使用了select max(num),它将从每一组中找到一个最大的num,而不是整张表中找
    关于增加一列:根据条件显示内容

    casewhen 条件1(布尔表达式) then 满足条件1要展示的结果when 条件2(布尔表达式) then 不满足条件1满足条件2的结果else 都不满足的结果
    end as 别名
    

二、小tips

  1. 子查询作为数据源,必须有别名,如果是在where、having语句中,则不拥有。

  2. 聚集函数嵌套的问题:
    不允许直接嵌套聚合函数:聚合函数(如AVG(), SUM(), MAX()等)通常不允许直接嵌套使用。也就是说,一个聚合函数的结果不能直接成为另一个聚合函数的输入,如MAX(COUNT(column))是不允许的。
    允许聚合结果被其他函数处理:聚合函数的结果可以被其他非聚合函数处理,如ROUND(AVG(column), 2)是允许的。这是因为ROUND函数在这里不是在进行聚合操作,而是在对聚合操作的单一结果值进行格式化或转换。

三、案例

假设目前数据库有一个表nums:

CREATE table nums(num INTEGER
);

插入样本数据:

insert into nums(num)
values(8),(8),(3),(3),(1),(2),(5),(6);

任务:找到nums表中出现次数最多的数字,如有多个,展示最大的结果。

下面开始按照过滤顺序具体实现:
我们将任务拆分为三轮:
第一轮:统计每个num的出现次数
第二轮:计算最多次数
第三轮:找到所有出现次数为最多次数的所有数字,并找到这些数字中的最大值
在每一轮中,将按照执行顺序一步步书写语句:

  1. FROM
  2. JOIN
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. SELECT
  7. DISTINCT
  8. ORDER BY
  9. LIMIT / OFFSET

强调一下,每一步操作都是基于前面执行的结果再操作的,比如where就只会对原始from和join后的结果对行进行过滤,不会对group by的结果做过滤,这一点很重要!!!

第一轮查询:统计每个num的出现次数

  1. FROM:找到表nums
	from nums
  1. JOIN
    不需要涉及多个表,略。
  2. WHERE
    不需要过滤掉任何行,所以略。
  3. GROUP BY
    需要找到每个数字出现的次数,自然需要分组,根据num分组:
	from numsgroup by num
  1. HAVING
    不需要略掉任何组,所以略。
  2. SELECT
    需要得到统计结果:
	select count(num) as frequencyfrom numsgroup by num

这里起一个别名,因为后续查询里,这个数字需要被用到,所以记得取别名
7. DISTINCT

8. ORDER BY

9. LIMIT / OFFSET

第二轮查询:计算最多次数

  1. FROM
    这里需要找到出现次数中的最大值,所以第一轮查询的结果,将作为这一轮查询的数据源。
from(select count(num) as frequencyfrom numsgroup by num) table_temp

根据前面小tips的第一条,子查询的结果如果是作为数据源,那么一定要取别名,否则会报错,别名前面可加as,也可以不加。
2. JOIN
不需要,略。
3. WHERE
虽然需要找到最高次数,看似可以在这一步对行级过滤,但是where对每一行操作时,只能看到当前行的数据,所以它不能使用max这种聚集函数得到全表的最大值,所以这一步略。
4. GROUP BY
不需要再分组了,略。
5. HAVING
没有分组了,所以它略。
6. SELECT
找到最大值,所以增加select max(frequency)

select max(frequency)from(select count(num) as frequencyfrom numsgroup by num) as table_temp
  1. DISTINCT
  2. ORDER BY
  3. LIMIT / OFFSET

第三轮查询:找到所有出现次数为最多次数的所有数字,并找到这些数字中的最大值

  1. FROM
    是对全表进行查询,找到出现次数为最大次数的结果,所以数据源是全表。
from nums
  1. JOIN
    略。
  2. WHERE
    无法对原始数据直接做过滤,因为此时还不能从第一步得到的结果中知道每个数字的次数,所以略。
  3. GROUP BY
    为得到次数,再一次做分组
from nums
group by num
  1. HAVING
    对每一组做过滤,保留次数等于最大次数的组,判断的条件是count(num)=最大次数,最大次数为第二轮查询的结果,所以将结果嵌套进来:
from nums
group by num
having count(num)=(
select max(frequency)from(select count(num) as frequencyfrom numsgroup by num) as table_temp
)
  1. SELECT
    目前得到了多个组结果,每个组的数字都满足出现次数等于最大次数,将数字选出来,即使用select num
select num
from nums
group by num
having count(num)=(
select max(frequency)from(select count(num) as frequencyfrom numsgroup by num) as table_temp
)
  1. DISTINCT
    不需要去重,略。
  2. ORDER BY
    为了找到最大值的结果,对目前的num结果降序,增加order by num desc
select num
from nums
group by num
having count(num)=(
select max(frequency)from(select count(num) as frequencyfrom numsgroup by num) as table_temp
)
order by num desc
  1. LIMIT / OFFSET
    选择排序第一的结果limit 1,它是最大值
select num
from nums
group by num
having count(num)=(
select max(frequency)from(select count(num) as frequencyfrom numsgroup by num) as table_temp
)
order by num desc
limit 1

计算结果展示:

在这里插入图片描述

补充说明

关于为什么要拆分步骤一和步骤二,为什么不直接写:

	select max(count(num))from numsgroup by num

会报错,原因见小tips的第二点

四、结语

我觉得我应该说清楚了where和having的区别了,也讲清楚了聚集函数为什么不能再where中使用🤔,按照执行顺序来写select语句,逻辑很清晰,不容易出错。

相关文章:

根据mysql的执行顺序来写select

过滤顺序指的是mysql的逻辑执行顺序,个人觉得我们可以按照执行顺序来写select查询语句。 目录 一、执行顺序二、小tips三、案例第一轮查询:统计每个num的出现次数第二轮查询:计算**最多次数**第三轮查询:找到所有出现次数为最多次…...

spring 和spring boot的区别

Spring是一个开源的Java开发框架,旨在简化Java应用程序的开发。它提供了一个综合的编程和配置模型,用于构建各种类型的应用程序,从简单的命令行工具到复杂的企业级Web应用程序。 Spring Boot是Spring框架的一个扩展,旨在简化Spri…...

Day84:服务攻防-端口协议桌面应用QQWPS等RCEhydra口令猜解未授权检测

目录 端口协议-口令爆破&未授权 弱口令爆破 FTP:文件传输协议 RDP:Windows远程桌面协议 SSH:Linux安全外壳协议 未授权案例(rsync) 桌面应用-QQ&WPS&Clash QQ RCE 漏洞复现 WPS RCE 漏洞复现 Clas* RCE 漏洞复现 知识点…...

视频分块上传Vue3+SpringBoot3+Minio

文章目录 一、简化演示分块上传、合并分块断点续传秒传 二、更详细的逻辑和细节问题可能存在的隐患 三、代码示例前端代码后端代码 一、简化演示 分块上传、合并分块 前端将完整的视频文件分割成多份文件块,依次上传到后端,后端将其保存到文件系统。前…...

深入浅出 -- 系统架构之单体到分布式架构的演变

一、传统模式的技术改革 在很多年以前,其实没有严格意义上的前后端工程师之分,每个后端就是前端,同理,前端也可以是后端,即Ajax、jQuery技术未盛行前的年代。 起初,大部分前端界面很简单,显示的…...

每日一题 第七十期 洛谷 [蓝桥杯 2020 省 AB2] 回文日期

[蓝桥杯 2020 省 AB2] 回文日期 题目描述 2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 yyyymmdd 的格式写成一个 8 8 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。…...

蓝桥杯第十四届C++A组(未完)

【规律题】平方差 题目描述 给定 L, R,问 L ≤ x ≤ R 中有多少个数 x 满足存在整数 y,z 使得 。 输入格式 输入一行包含两个整数 L, R,用一个空格分隔。 输出格式 输出一行包含一个整数满足题目给定条件的 x 的数量。 样例输入 1 5 样例输出 …...

职场口才提升之道

职场口才提升之道 在职场中,口才的重要性不言而喻。无论是与同事沟通协作,还是向上级汇报工作,亦或是与客户洽谈业务,都需要具备良好的口才能力。一个出色的职场人,除了拥有扎实的专业技能外,还应具备出色…...

【算法练习】28:选择排序学习笔记

一、选择排序的算法思想 弄懂选择排序算法,先得知道两个概念:未排序序列,已排序序列。 原理:以升序为例,选择排序算法的思想是,先将整个序列当做未排序的序列,以序列的第一个元素开始。然后从左…...

【关于窗口移动求和的两种计算方法】

窗口移动计算方法 例子方法1方法2运行结果: 例子 在很多算法中都会涉及到窗口滑动,比如基于新息序列更新的自适应卡尔曼滤波器算法中便会使用到。 已知一个数列:OCV [1;2;3;4;5;6;7;8;9;10;11;12;13;14;15],定义窗口长度为5,每次…...

Win10文件夹共享(有密码的安全共享)(SMB协议共享)

前言 局域网内(无安全问题,比如自己家里wifi)无密码访问,参考之前的操作视频 【电脑文件全平台共享、播放器推荐】手机、电视、平板播放硬盘中的音、视频资源 下面讲解公共网络如办公室网络、咖啡厅网络等等环境下带密码的安全…...

Client sent an HTTP request to an HTTPS server

背景 最近踩坑了 我发现域名:8000可以访问我的服务 但是域名:443却不行,这很反常 结果发现是nginx配置的问题,需要把http改成https! 原因 如果你的后端服务(运行在8000端口上)已经配置了SS…...

Springboot传参要求

Web.java(这里定义了一个实体类交Web) public class Web{ private int Page; public int getPage() {return Page;}public void setPage(int page) {Page page;} } 1、通过编译器自带的getter、Setter传参 。只是要注意参数的名字是固定的,不能灵活改变。 传参的…...

数字乡村创新实践探索:科技赋能农业现代化与乡村治理体系现代化同步推进

随着信息技术的飞速发展,数字乡村作为乡村振兴的重要战略方向,正日益成为推动农业现代化和乡村治理体系现代化的关键力量。科技赋能下的数字乡村,不仅提高了农业生产的效率和品质,也为乡村治理带来了新的机遇和挑战。本文旨在探讨…...

C语言——找单身狗1

题目描述: 在一个整形数组中,只有一个数字出现一次,其他数组都是成对出现的,找出那个只出现一次的数字。 例如: 数组中:1,2,3,4,5,4,3…...

Day82:服务攻防-开发组件安全Solr搜索Shiro身份Log4j日志本地CVE环境复现

目录 J2EE-组件Solr-本地demo&CVE 命令执行(CVE-2019-17558) 远程命令执行漏洞(CVE-2019-0193) Apache Solr 文件读取&SSRF (CVE-2021-27905) J2EE-组件Shiro-本地demo&CVE CVE_2016_4437 Shiro-550Shiro-721(RCE) CVE-2020-11989(身…...

网络协议——VRRP(虚拟路由冗余协议)原理与配置

1. VRRP概述 单网关出现故障后下联业务中断,配置两个及以上的网关时由于IP地址冲突,导致通讯时断时续甚至通信中断。VRRP组播类的网络层协议 2. 协议版本 VRRP v2: 支持认证,仅适用于IPv4网络 VRRP v3: 不支持认证, 适用于IPv4和IPv6两种网…...

Elasticsearch:我们如何演化处理二进制文档格式

作者:来自 Elastic Sean Story 从二进制文件中提取内容是一个常见的用例。一些 PDF 文件可能非常庞大 — 考虑到几 GB 甚至更多。Elastic 在处理此类文档方面已经取得了长足的进步,今天,我们很高兴地介绍我们的新工具 —— 数据提取服务&…...

第八讲 Sort Aggregate 算法

我们现在将讨论如何使用迄今为止讨论过的 DBMS 组件来执行查询。 1 查询计划【Query Plan】 我们首先来看当一个查询【Query】被解析【Parsed】后会发生什么? 当 SQL 查询被提供给数据库执行引擎,它将通过语法解析器进行检查,然后它会被转换…...

clickhouse MPPDB数据库--新特性使用示例

clickhouse 新特性: 从clickhouse 22.3至最新的版本24.3.2.23,clickhouse在快速发展中,每个版本都增加了一些新的特性,在数据写入、查询方面都有性能加速。 本文根据clickhouse blog中的clickhouse release blog中,学…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

Web后端基础(基础知识)

BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...