MySQL高级语句深度解析与应用实践

一、窗口函数:数据分析的利器

1. 窗口函数基础概念

窗口函数(Window Function)是MySQL 8.0引入的强大特性,它可以在不减少行数的情况下对数据进行聚合计算和分析

SELECT employee_name,department,salary,RANK() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank
FROM employees;

核心组件:
PARTITION BY:定义窗口分区(类似GROUP BY但不聚合)
ORDER BY:确定窗口内行的排序
frame_clause:定义窗口框架(ROWS/RANGE BETWEEN)

2. 常用窗口函数分类

排名函数

ROW_NUMBER():连续编号(1,2,3…)
RANK():并列排名会跳过后续序号(1,2,2,4…)
DENSE_RANK():并列排名不跳号(1,2,2,3…)

聚合函数

SUM()/AVG()/COUNT()/MIN()/MAX() OVER()

分布函数

PERCENT_RANK():相对排名百分比
CUME_DIST():累积分布值

前后函数

LAG(column, n):访问前n行数据
LEAD(column, n):访问后n行数据
FIRST_VALUE()/LAST_VALUE():窗口首尾值

3.高级窗口框架控制

SELECT date,revenue,AVG(revenue) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as moving_avg
FROM sales;

框架类型:
ROWS:物理行偏移
RANGE:逻辑值范围
GROUPS:MySQL 8.0.2+支持,按组偏移

二、Common Table Expressions (CTE):提升查询可读性

基础CTE语法

WITH department_stats AS (SELECT department,AVG(salary) as avg_salary,COUNT(*) as emp_countFROM employeesGROUP BY department
)
SELECT * FROM department_stats WHERE avg_salary > 5000;

递归CTE实现层次查询

WITH RECURSIVE org_hierarchy AS (-- 基础查询(锚成员)SELECT id, name, manager_id, 1 as levelFROM employeesWHERE manager_id IS NULLUNION ALL-- 递归查询(递归成员)SELECT e.id, e.name, e.manager_id, h.level + 1FROM employees eJOIN org_hierarchy h ON e.manager_id = h.id
)
SELECT * FROM org_hierarchy;

应用场景:
组织结构图
产品分类树
社交网络关系

CTE优化技巧

MATERIALIZED:强制物化CTE结果
MERGE:将CTE合并到主查询
限制递归深度:SET @@cte_max_recursion_depth = 100;

三、高级JSON处理:应对半结构化数据

JSON创建与修改

-- 创建JSON
SELECT JSON_OBJECT('name', name, 'salary', salary) as emp_json
FROM employees;-- 修改JSON
UPDATE products 
SET attributes = JSON_SET(attributes, '$.color', 'blue')
WHERE id = 1001;

JSON路径查询

SELECT product_id,JSON_EXTRACT(attributes, '$.dimensions.width') as width,attributes->>'$.manufacturer' as manufacturer
FROM products
WHERE JSON_CONTAINS(attributes, '"wireless"', '$.features');

JSON聚合函数

SELECT department,JSON_ARRAYAGG(JSON_OBJECT('id', id, 'name', name)) as employees
FROM staff
GROUP BY department;

四、索引优化高级技巧

函数索引(MySQL 8.0+)

-- 创建基于表达式的索引
CREATE INDEX idx_name_lower ON employees ((LOWER(name)));-- 使用时必须完全匹配索引表达式
SELECT * FROM employees WHERE LOWER(name) = 'john';

不可见索引

-- 创建不可见索引(优化器忽略)
CREATE INDEX idx_temp ON orders (customer_id) INVISIBLE;-- 测试后决定是否可见
ALTER TABLE orders ALTER INDEX idx_temp VISIBLE;

降序索引优化

-- 创建降序索引
CREATE INDEX idx_created_desc ON log_entries (created_at DESC);-- 适合ORDER BY ... DESC查询
SELECT * FROM log_entries ORDER BY created_at DESC LIMIT 100;

五、高级事务处理

保存点(Savepoint)控制

START TRANSACTION;
INSERT INTO orders (...) VALUES (...);
SAVEPOINT order_created;
UPDATE inventory SET quantity = quantity - 1;
-- 发生错误时
ROLLBACK TO SAVEPOINT order_created;
COMMIT;

多版本并发控制(MVCC)深度优化

-- 使用特定隔离级别
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;-- 优化长时间事务
SET TRANSACTION READ ONLY;

锁优化策略

-- 行锁升级为表锁(慎用)
LOCK TABLES orders WRITE;-- 使用SKIP LOCKED处理高并发
SELECT * FROM jobs 
WHERE status = 'pending'
ORDER BY priority DESC
LIMIT 1 FOR UPDATE SKIP LOCKED;

六、性能分析高级技术

执行计划深度解读

EXPLAIN FORMAT=JSON 
SELECT * FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE region = 'APAC'
);-- 关键指标分析
/* 
"cost_info": {"query_cost": "10.25"  -- 总预估成本
},
"table_scan": {"rows_examined_per_scan": 1000,"rows_produced_per_join": 100,"filtered": "10.00"
}
*/

优化器提示(Optimizer Hints)

SELECT /*+ INDEX(orders idx_customer) */ *
FROM orders FORCE INDEX (idx_customer)
WHERE customer_id = 1001;

性能模式(Performance Schema)监控

-- 分析最耗资源的SQL
SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;-- 查看锁等待
SELECT * FROM performance_schema.events_waits_current
WHERE EVENT_NAME LIKE '%lock%';

七、实战案例:电商数据分析系统

用户购买路径分析

WITH user_journey AS (SELECT user_id,event_time,event_type,LAG(event_type, 1) OVER (PARTITION BY user_id ORDER BY event_time) as prev_event,LEAD(event_type, 1) OVER (PARTITION BY user_id ORDER BY event_time) as next_eventFROM user_eventsWHERE event_date = CURDATE()
)
SELECT prev_event,event_type,next_event,COUNT(*) as transition_count
FROM user_journey
GROUP BY prev_event, event_type, next_event
ORDER BY transition_count DESC;

实时库存预警

WITH inventory_status AS (SELECT product_id,current_stock,AVG(current_stock) OVER (PARTITION BY category_id) as category_avg,RANK() OVER (PARTITION BY warehouse_id ORDER BY current_stock) as stock_rankFROM inventory
)
SELECT product_id, current_stock
FROM inventory_status
WHERE current_stock < (0.2 * category_avg) ORstock_rank <= 5; -- 每个仓库库存最低的5个商品

建议

渐进式优化:先确保SQL正确性,再逐步应用高级优化
测试验证:所有优化必须通过真实数据验证
监控迭代:持续监控执行计划变化
适度使用:避免过度复杂化SQL逻辑
版本特性:充分利用MySQL 8.0+的新特性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习基础 4】 Pandas库

一、Pandas库简介 Pandas 是一个开源的 Python 数据分析库&#xff0c;主要用于数据清洗、处理、探索与分析。其核心数据结构是 Series&#xff08;一维数据&#xff09;和 DataFrame&#xff08;二维表格数据&#xff09;&#xff0c;可以让我们高效地操作结构化数据。Pandas …

ETCD --- ​租约(Lease)​详解

一、租约的核心概念 1. ​租约(Lease)​ 一个租约是一个有时间限制的“授权”,绑定到键值对上。每个租约有一个唯一的ID(64位整数),通过etcdctl或客户端API创建。创建租约时需指定TTL(Time-To-Live),即租约的有效期(单位:秒)。客户端需定期向etcd发送续约(KeepAl…

33.[前端开发-JavaScript基础]Day10-常见事件-鼠标事件-键盘事件-定时器-案例

1 window定时器 window定时器方法 setTimeout的使用 setInterval的使用 2 轮播消息提示 案例实战一 – 轮播消息提示 3 关闭隐藏消息 案例实战二 – 关闭隐藏消息 4 侧边栏展示 案例实战三 – 侧边栏展示 5 tab切换实现 案例实战四 – 登录框&#xff08;作业&#xff09;…

react ant design树穿梭框实现搜索并展开到子节点、同级节点选择及同时选择数量限制功能

功能点&#xff1a; 点击节点前的箭头&#xff0c;可以手动展开或折叠该节点的子节点。在搜索框中输入关键词&#xff0c;匹配的节点及其父节点会自动展开。清空搜索框后&#xff0c;恢复到用户手动控制的展开状态。勾选节点时仍然遵守 "最多勾选 6 个节点" 和 &quo…

阿里云云效 Maven

阿里云云效 Maven 官网&#xff1a;https://developer.aliyun.com/mvn/guide 阿里云Maven中央仓库为 阿里云云效 提供的公共代理仓库&#xff0c;帮助研发人员提高研发生产效率&#xff0c;使用阿里云Maven中央仓库作为下载源&#xff0c;速度更快更稳定。 阿里云云效 是企业…

Go 语言标准库中Channels,Goroutines详细功能介绍与示例

在 Go 语言中&#xff0c;Goroutines&#xff08;协程&#xff09;和 Channels&#xff08;通道&#xff09;是并发编程的核心组件。它们共同协作&#xff0c;简化了并发任务的管理和数据同步。以下通过详细示例说明它们的用法和常见模式。 1. Goroutines&#xff08;协程&…

如何在 Postman 中正确设置 Session 以维持用户状态?

在 Postman 里面设置有 session 的请求。如果你还不知道什么是 session&#xff0c;那么请看这里—— session 是一种记录客户端和服务器之间状态的机制&#xff0c;用于保持用户的登录状态或者其他数据&#xff0c;从而让用户在不同页面之间保持一致的体验。 Postman 设置带 …

DQN与PPO在算法层面的核心区别

DQN与PPO在算法层面的核心区别 1. 学习目标不同 DQN(基于价值): 核心:学习动作价值函数 Q ( s , a ) Q(s, a)

Linux: 网络,arp的数量为什么会对交换机/路由器有性能的影响

这个问题也是非常普遍的问题。比如最近比较火的一个OVS相关的问题: ARP request packets put high pressure on the pinctrl thread in ovn-controller 另一个在工作种也遇到了相似的问题,当一个网络里发了同时发了小一百个GARP之后,路由器的gateway就会有ARP处理延迟。 A…

解析 HTML 网站架构规范

2025/3/28 向全栈工程师迈进&#xff01; 一、网页基本的组成部分 网页的外观多种多样&#xff0c;但是除了全屏视频或游戏&#xff0c;或艺术作品页面&#xff0c;或只是结构不当的页面以外&#xff0c;都倾向于使用类似的标准组件。 1.1页眉 通常横跨于整个页面顶部有一…

Golang 当中 byte 和 rune 类型的区别

文章目录 Golang 当中 byte 和 rune 类型的区别类型定义与用途字符串处理差异内存占用典型引用场景 Golang 当中 byte 和 rune 类型的区别 在 Golang 中&#xff0c;rune 和 byte 类型的区别主要体现在字符处理的方式和编码支持上。 类型定义与用途 byte 类型 本质是 uint8…

vue将页面导出成word

方法一&#xff1a;使用 html-docx-js html-docx-js 是一个轻量级的库&#xff0c;可以将 HTML 转换为 Word 文档。 安装依赖 首先安装 html-docx-js&#xff1a; Bash深色版本 npm install html-docx-js --save创建导出逻辑 在 Vue 组件中实现导出功能的代码如下&#xff1…

Three.js 快速入门教程【二十】3D模型加载优化实战:使用gltf-pipeline与Draco对模型进行压缩,提高加载速度和流畅性

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…

前端框架入门:Angular

Angular 是由 Google 维护的前端框架,适用于构建单页应用(SPA)。它使用TypeScript 作为主要开发语言,并提供了强大的模块化、依赖注入(DI)、路由管理等特性。 一、Angular 基础 1. Angular 介绍 Angular 是一个组件化、模块化、双向数据绑定的前端框架,适用于构建复杂…

基于51单片机的速度检测报警器proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1I7roZEjrk349Is_YdMcsxQ 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C51 是一款常用的 8 位单片机&#xff0c;由 Atmel 公司&#xff08;现已被 Microchip 收…

具身系列——Diffusion Policy算法实现CartPole游戏

代码原理分析 1. 核心思想 该代码实现了一个基于扩散模型&#xff08;Diffusion Model&#xff09;的强化学习策略网络。扩散模型通过逐步去噪过程生成动作&#xff0c;核心思想是&#xff1a; • 前向过程&#xff1a;通过T步逐渐将专家动作添加高斯噪声&#xff0c;最终变成…

DeepSeek 本地化部署教程

1 概述 1.1 配置参考图 科普&#xff1a; B&#xff0c;Billion&#xff08;十亿&#xff09;&#xff0c;是 “参数量” 的单位。 模型量超过 一亿&#xff0c;可称之为 “大模型”。 2 软件安装 2.1 下载 Ollama 官方主页&#xff1a;https://ollama.com/download主页截图…

matlab打开两个工程

1、问题描述 写代码时&#xff0c;需要实时参考别人的代码&#xff0c;需要同时打开2个模型&#xff0c;当模型在同一个工程内时&#xff0c;这是可以直接打开的&#xff0c;如图所示 2、解决方案 再打开一个MATLAB主窗口 这个时候就可以同时打开多个模型了 3、正确的打开方…

mac 下配置flutter 总是失败,请参考文章重新配置flutter 环境MacOS Flutter环境配置和安装

一、安装和运行Flutter的系统环境要求 想要安装并运行 Flutter&#xff0c;你的开发环境需要最低满足以下要求&#xff1a; 操作系统:macOS磁盘空间:2.8 GB(不包括IDE/tools的磁盘空间)。工具:Flutter使用git进行安装和升级。我们建议安装Xcode&#xff0c;其中包括git&#x…

第4.1节:使用正则表达式

1 第4.1节&#xff1a;使用正则表达式 将正则表达式用斜杠括起来&#xff0c;就能用作模式。随后&#xff0c;该正则表达式会与每条输入记录的完整文本进行比对。&#xff08;通常情况下&#xff0c;它只需匹配文本的部分内容就能视作匹配成功。&#xff09;例如&#xff0c;以…