大家好!今天我们要深入探讨 MySQL 中一些非常重要的高级主题——内置函数视图存储过程触发器索引事务锁机制。无论你是刚开始学习数据库的新手,还是经验丰富的开发者,掌握这些知识点都将极大提升你的开发效率和数据管理能力。


一. 内置函数

什么是内置函数?

内置函数 是 MySQL 提供的用于处理各种数据类型和计算需求的预定义函数。它们可以帮助我们简化复杂的操作,提高代码的可读性和执行效率。

核心内容:
  • 聚合函数
  • 数学函数
  • 字符串函数
  • 日期函数
  • 控制流函数
  • 窗口函数

1. 聚合函数

聚合函数用于对一组值进行计算并返回单个值。

-- 统计每个部门的员工数量
SELECT dept_id, COUNT(*) AS 员工数量 FROM employees GROUP BY dept_id;-- 连接每个部门的员工姓名,按部门(dept_id)对员工姓名进行分组拼接
SELECT dept_id, GROUP_CONCAT(name SEPARATOR ',') AS 员工姓名 FROM employees GROUP BY dept_id;

注意:

  • COUNT 统计数量。
  • GROUP_CONCAT 将多个值连接成一个字符串。

2. 数学函数

数学函数用于数值计算。

-- 绝对值
SELECT ABS(-10); -- 10-- 向上取整
SELECT CEIL(3.14); -- 4-- 四舍五入
SELECT ROUND(3.14159, 2); -- 3.14

注意:

  • ABS 返回绝对值。
  • CEIL 向上取整。
  • ROUND 四舍五入,可以指定保留小数位数。

3. 字符串函数

字符串函数用于处理字符串。

-- 连接字符串
SELECT CONCAT('Hello', ' World'); -- 'Hello World'-- 截取子字符串
SELECT SUBSTRING('MySQL', 1, 3); -- 'MyS'-- 替换字符串
SELECT REPLACE('MySQL', 'My', 'Your'); -- 'YourSQL'

注意:

  • CONCAT 连接多个字符串。
  • SUBSTRING 截取子字符串,起始位置从1开始。
  • REPLACE 替换字符串中的部分内容。

4. 日期函数

日期函数用于处理日期和时间。

-- 当前日期时间
SELECT NOW(); -- 例如:2023-11-11 12:34:56-- 日期加法
SELECT DATE_ADD('2023-11-11', INTERVAL 1 DAY); -- 2023-11-12-- 计算日期差
SELECT DATEDIFF('2023-11-11', '2023-10-01'); -- 41

注意:

  • NOW() 返回当前日期和时间。
  • DATE_ADD 和 DATE_SUB 分别用于日期加减。
  • DATEDIFF 计算两个日期之间的天数差。

5. 窗口函数

窗口函数用于计算基于一组行的聚合值,不会将多行压缩为一行。

-- 创建示例表
CREATE TABLE sales(id INT PRIMARY KEY COMMENT '员工ID,主键',employee VARCHAR(50) COMMENT '员工姓名',department VARCHAR(50) COMMENT '所属部门,如 Tech、Sales等',salary DECIMAL(10,2) COMMENT '薪资金额,单位:元',sale_date DATE COMMENT '销售记录日期'
);-- 插入示例数据
INSERT INTO sales VALUES 
(1, 'Alice', 'Tech', 7000, '2023-01-15'),
(2, 'Bob', 'Tech', 8000, '2023-02-20');-- 行号函数
SELECT employee, department, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM sales;

注意:

  • ROW_NUMBER() 为每行分配唯一的连续序号。
  • RANK() 和 DENSE_RANK() 用于排名,支持并列排名。
  • 可以使用 PARTITION BY 对结果进行分组。

二. 视图(Views)

什么是视图?

视图 是虚拟表,是基于查询结果的可视化表。它可以帮助我们简化复杂查询,限制数据访问,并提供数据独立性。

核心内容:
  • 创建视图
  • 修改视图
  • 更新视图
  • 删除视图

1. 创建视图

-- 创建视图
CREATE VIEW v_employee_dept AS 
SELECT e.id, e.name, d.name AS dept_name, e.salary 
FROM employees e 
INNER JOIN departments d ON e.dept_id = d.id;

2. 修改视图

-- 修改视图
CREATE OR REPLACE VIEW v_employee_dept AS 
SELECT e.id, e.name, d.name AS dept_name, e.salary, e.hire_date 
FROM employees e 
INNER JOIN departments d ON e.dept_id = d.id;

3. 更新视图

-- 更新视图
UPDATE v_employee_dept SET salary = 10000 WHERE name = '张三';

4. 删除视图

-- 删除视图
DROP VIEW v_employee_dept;

三. 存储过程、存储函数与触发器

什么是存储过程和存储函数?

存储过程 是一组预编译的 SQL 语句,保存在数据库中,可通过名称调用。存储函数 是返回值的存储过程,可以在 SQL 语句中调用。

核心内容:
  • 创建存储过程
  • 创建存储函数
  • 触发器

1. 创建存储过程

DELIMITER //
CREATE PROCEDURE get_employee_by_dept(IN dept_name VARCHAR(50))
BEGINSELECT e.id, e.name, e.salary FROM employees e INNER JOIN departments d ON e.dept_id = d.id WHERE d.name = dept_name;
END //
DELIMITER ;-- 调用存储过程
CALL get_employee_by_dept('技术部');

2. 创建存储函数

-- 设置全局参数
SET GLOBAL log_bin_trust_function_creators = TRUE;DELIMITER //
CREATE FUNCTION get_dept_avg_salary(dept_name VARCHAR(50)) RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGINDECLARE avg_sal DECIMAL(10,2);SELECT AVG(e.salary) INTO avg_sal FROM employees e INNER JOIN departments d ON e.dept_id = d.id WHERE d.name = dept_name;RETURN avg_sal;
END //
DELIMITER ;-- 调用存储函数
SELECT get_dept_avg_salary('技术部');

3. 触发器

触发器是在表上定义的特殊存储过程,当表发生 INSERTUPDATEDELETE 操作时自动执行。

-- 创建日志表
CREATE TABLE employee_log(id INT PRIMARY KEY AUTO_INCREMENT,operation VARCHAR(20),employee_id INT,operation_time DATETIME
);-- 创建触发器
DELIMITER //
CREATE TRIGGER after_employee_insert AFTER INSERT ON employees FOR EACH ROW
BEGININSERT INTO employee_log(operation, employee_id, operation_time)VALUES('INSERT', NEW.id, NOW());
END //
DELIMITER ;

四. 索引、存储引擎、事务与锁

什么是索引?

索引 是提高查询性能的重要手段,MySQL 支持多种索引类型,包括普通索引、唯一索引、主键索引、组合索引和全文索引。

-- 创建索引
CREATE INDEX idx_employee_name ON employees(name);-- 创建唯一索引
CREATE UNIQUE INDEX idx_employee_email ON employees(email);-- 查看索引
SHOW INDEX FROM employees;

1. 创建索引

-- 创建组合索引
CREATE INDEX idx_dept_salary ON employees(dept_id, salary);

2. 存储引擎

存储引擎是 MySQL 用于存储和管理数据的底层组件,常见的存储引擎有 InnoDB 和 MyISAM。

-- 创建 MyISAM 引擎的日志表
CREATE TABLE test_myisam(id INT PRIMARY KEY,name VARCHAR(50)
) ENGINE=MyISAM;

3. 事务

事务是一组原子性的 SQL 操作,要么全部执行成功,要么全部执行失败。事务具有 ACID 特性:原子性、一致性、隔离性和持久性。

-- 开始事务
START TRANSACTION;-- 执行操作
UPDATE employees SET salary = salary + 1000 WHERE dept_id = 1;
INSERT INTO employee_log(operation, employee_id, operation_time) 
VALUES ('SALARY_INCREASE', 1, NOW());-- 提交事务
COMMIT;

4. 锁机制

锁是 MySQL 用于并发控制的机制,分为表锁和行锁。

-- 表锁
LOCK TABLES employees WRITE;-- 行锁
SELECT * FROM employees WHERE id = 1 FOR UPDATE;

五. 性能优化

如何进行性能优化?

性能优化的步骤包括查看 SQL 执行频率、定位低效率执行 SQL、分析执行计划、优化索引和优化 SQL 语句。

核心内容:
  • 查看 SQL 执行频率
  • 定位低效率执行 SQL
  • 分析执行计划
  • 优化索引
  • 优化 SQL 语句

1. 查看 SQL 执行频率

-- 查看 SQL 执行频率
SHOW GLOBAL STATUS LIKE 'Com_%';

2. 定位低效率执行 SQL

-- 查看正在执行的慢查询
SHOW PROCESSLIST;

3. 分析执行计划

-- 分析执行计划
EXPLAIN SELECT * FROM employees WHERE dept_id = 1;

4. 优化索引

避免索引失效,选择合适的索引列,覆盖索引等策略。

-- 索引失效示例
SELECT * FROM employees WHERE YEAR(hire_date) = 2020; -- 索引失效-- 优化后
SELECT * FROM employees WHERE hire_date >= '2020-01-01' AND hire_date < '2021-01-01'; -- 索引有效

六. 总结与最佳实践

总结

功能说明
聚合函数对一组值进行计算并返回单个值
数学函数用于数值计算
字符串函数处理字符串
日期函数处理日期和时间
窗口函数计算基于一组行的聚合值
视图虚拟表,基于查询结果
存储过程预编译的 SQL 语句
存储函数返回值的存储过程
触发器自动执行的存储过程
索引提高查询性能
存储引擎数据存储和管理的底层组件
事务原子性的 SQL 操作
锁机制并发控制

 最佳实践

  • 合理使用内置函数:根据业务需求选择合适的函数。
  • 灵活运用视图:简化复杂查询,限制数据访问。
  • 优化存储过程和函数:提高代码的可维护性和执行效率。
  • 合理使用索引:避免索引失效,选择合适的索引列。
  • 事务和锁机制:确保数据的一致性和并发控制。

一句话总结:

MySQL 的高级特性和性能优化功能帮助我们构建高效、可靠的数据管理系统,让我们的应用更加健壮和高效。


结语

通过这篇博客,我们详细讲解了 MySQL 中高级特性和性能优化的核心概念和使用方法。无论你是刚刚开始学习数据库,还是已经在实际项目中应用,掌握这些知识点都能让你的数据管理更加得心应手。

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

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

相关文章

Linux学习:基于环形队列的生产者消费者模型

目录1. 环形队列的概念与实现方法1.1 环形队列的概念1.2 环形队列的一般实现方法2. 多线程相关的信号量概念与接口2.1 信号量类型2.2 信号量的初始化与销毁2.3 信号量的P申请、V释放操作3. 基于环形队列实现p、c模型的设计方案3.1 环形队列&#xff08;ringqueue&#xff09;作…

【左程云算法07】队列和栈-链表数组实现

目录 ​编辑1&#xff09;队列的介绍 核心操作 3&#xff09;队列的链表实现和数组实现 使用数组实现队列 2&#xff09;栈的介绍 核心操作 4&#xff09;栈的数组实现 使用语言内置的实现 使用数组手动实现栈 5&#xff09;环形队列的实现 leecode622 代码解析 视频…

Docker 清理完整指南:释放磁盘空间的最佳实践

前言 随着 Docker 使用时间的增长,系统中会积累大量的容器、镜像、数据卷和构建缓存,占用大量磁盘空间。本文将详细介绍如何有效清理 Docker 资源,释放磁盘空间,保持系统整洁。 Docker 资源类型 Docker 主要占用磁盘空间的资源包括: 容器 (Containers):运行中和已停止…

零基础快速了解掌握Linux防火墙-Iptables

一、 Iptables概述Iptables 是一个用户空间程序&#xff0c;可以用于设置和管理 Linux 操作系统的内核级防火墙。它通过表、链和 规则组成&#xff0c;可以灵活地根据不同的需求进行配置。iptables 具有以下特点&#xff1a;Iptables 作为内核级别的防火墙&#xff0c;具有高效…

12公里无人机图传模组:从模糊到超高清的飞跃,抗干扰能力全面升级

在无人机行业飞速发展的今天&#xff0c;高清图像传输已成为衡量无人机性能的重要标志之一。过去&#xff0c;无人机在长距离飞行时常常面临信号衰减、图像模糊&#xff0c;甚至数据丢失的问题&#xff0c;影响了用户的体验与应用效果。为了打破这一瓶颈&#xff0c;业内专家不…

从 “模板” 到 “场景”,用 C++ 磨透拓扑排序的实战逻辑

文章目录前言&#xff1a;《算法磨剑: 用C思考的艺术》 专栏《C&#xff1a;从代码到机器》 专栏《Linux系统探幽&#xff1a;从入门到内核》 专栏正文&#xff1a;[B3644 【模板】拓扑排序 / 家谱树](https://www.luogu.com.cn/problem/B3644)【解法】【参考代码】[P2712 摄像…

盲盒抽卡机小程序:从0到1的蜕变之路

盲盒抽卡机小程序从概念提出到最终上线&#xff0c;经历了从0到1的蜕变过程。这个过程充满了挑战与机遇&#xff0c;也凝聚了开发团队的智慧和汗水。本文将分享盲盒抽卡机小程序的开发历程&#xff0c;探讨其背后的技术实现和市场策略。需求分析&#xff1a;明确目标用户与市场…

分层-三层架构

文章目录介绍代码拆分Dao层server层controller层运行结果介绍 在我们进行程序设计以及程序开发时&#xff0c;尽可能让每一个接口、类、方法的职责更单一些&#xff08;单一职责原则&#xff09;。 单一职责原则&#xff1a;一个类或一个方法&#xff0c;就只做一件事情&#…

Vue2 VS Vue3

vue3 是的&#xff0c;Vue 3 确实取消了基于 JavaScript 原型的 Vue 和 VueComponent 构造函数&#xff08;即你提到的 vm 和 vc&#xff09;&#xff0c;取而代之的是一种完全不同的、基于普通对象和代理&#xff08;Proxy&#xff09;的实例管理方式。 这是一个颠覆性的改变…

Vue3入门到实战,最新版vue3+TypeScript前端开发教程,Vue3简介,笔记02

笔记02 一、Vue3简介 1.1、Vue3发布日期&#xff1a; 2020年9月18日 1.2、Vue3做了哪些升级&#xff1a; 1.2.1、性能的提升 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 打包大小减少41%初次渲染快55%更新渲染快133%内容减少54% 1.2.2、源码的优化…

.net core webapi/mvc阿里云服务器部署 - 错误解决

错误及解决方案缺少web.config配置HTTP 错误 500.19 - Internal Server Error检查 IIS 配置1. 确保 .NET Core Hosting Bundle 已安装2. 检查 应用程序池 配置3. 检查 IIS MIME 类型检查文件权限1. 确保 IIS 用户 有权限访问网站目录2. 检查 web.config 文件权限启用详细错误日…

多输入(input)多输出(output)验证

#作者&#xff1a;程宏斌 文章目录前言Flb 1.9.4 INCLUDE配置测试测试方案测试配置文件测试命令Flb 3.0.2 INCLUDE配置测试测试方案测试配置文件启动命令结论结论一&#xff1a;结论二&#xff1a;前言 需要设计并执行一组测试用例&#xff0c;这些测试用例将包括以子文件形式…

行业学习【电商】:垂直电商如何理解?以专业宠物平台为例

声明&#xff1a;以下部分内容含AI生成 “宠物等爱好者的专业平台”指的是垂直电商的一个具体例子。 “垂直电商” 就是指不卖所有东西&#xff0c;只深耕某一个特定领域&#xff08;即“垂直”领域&#xff09;的电商平台。 “宠物爱好者的专业平台”就是这样一个专门为养宠…

GPT(Generative Pre-trained Transformer)模型架构与损失函数介绍

目录 一、核心架构&#xff1a;Transformer Decoder 1. 核心组件&#xff1a;仅解码器&#xff08;Decoder-Only&#xff09;的堆叠 2. 输入表示&#xff1a;Token 位置 3. 输出 二、训练过程&#xff1a;两阶段范式 阶段一&#xff1a;预训练&#xff08;Pre-training&…

GitHub 热榜项目 - 日榜(2025-09-10)

GitHub 热榜项目 - 日榜(2025-09-10) 生成于&#xff1a;2025-09-10 统计摘要 共发现热门项目&#xff1a;15 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜呈现三大技术热点&#xff1a;LLM智能体应用爆发&#xff08;如parlant、AutoAgent&#xff09;&a…

论文阅读:arxiv 2023 Large Language Models are Not Stable Recommender Systems

总目录 大模型相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 https://arxiv.org/pdf/2312.15746 速览 破解大语言模型在推荐系统中的不稳定性 该论文聚焦于大语言模型&#xff08;LLMs&#xff09;在推荐系统中的应用问题&#xff0c;指出…

Linux的使用——FinalShell下载使用及连接云服务器的教程

一、注册免费阿里云服务器 1. 进入阿里云服务器官网 阿里云-计算&#xff0c;为了无法计算的价值https://www.aliyun.com/?spm5176.ecscore_server.console-base_top-nav.dlogo.39144df5uvPLOm 2. 点击免费试用 这里我已经试用过了&#xff0c;大家选择合适的云服务器点击立…

如何清理 Docker 占用的巨大磁盘空间

我相信很多人在使用 Docker 一段时间后&#xff0c;都会遇到一个常见问题&#xff1a;磁盘空间被迅速吃光&#xff0c;尤其是在进行频繁的镜像构建、测试和运行容器时。以我自己为例&#xff0c;在 Ubuntu 24.04设备上&#xff0c;docker system df -v 一看&#xff0c;Docker …

【CMake】缓存变量

目录 一. 缓存变量 二.创建缓存变量 2.1.使用set()来创建缓存变量 2.2.使用FORCE参数来覆盖缓存变量 2.2.1.示例1——不带force的set是不能覆盖已经存在的缓存变量的 2.2.2.示例2——带force的set才能覆盖已经存在的缓存变量 2.2.3.对比示例 2.3.命令行 -D 创建/覆盖缓…

vue2使用若依框架动态新增tab页并存储之前的tab页的操作

1. 应用场景&#xff1a;点击历史记录&#xff0c;要比较两个tab页的内容时&#xff0c;需要做到切换tab页来回看左右对数据对比。2.开发难点若依项目正常是把路由配置到菜单管理里&#xff0c;都是设定好的。不过它也给我们写好了动态新增tab页的方&#xff0c;需要我们自己来…