news 2026/7/19 3:45:45

MySQL 进阶篇 —— 事务 / 外键 / 索引 / 高级查询

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 进阶篇 —— 事务 / 外键 / 索引 / 高级查询

MySQL 进阶内容,涵盖事务、主外键、索引及高级查询技巧


一、事务(TCL)

1.1 什么是事务

一组 SQL 操作的逻辑单元,要么全部成功,要么全部失败

1.2 ACID 特性

特性说明
原子性所有操作全部成功或全部失败
一致性事务前后数据完整性一致
隔离性多个事务并发互不影响
持久性事务提交后永久保存

1.3 事务操作语句

语句作用
begin开始事务
commit提交事务(永久保存)
rollback回滚事务(撤销全部操作)
savepoint 名称设置保存点
rollback to 名称回滚到指定保存点

多个窗口可多事务并发,但单窗口只能有一个事务。事务结束标志是rollbackcommit。下一个事务开启会隐式提交上一个事务。

1.4 事务示例

-- 前提:只有 InnoDB 引擎支持事务createtableaccounts(idintunsignedprimarykeyauto_increment,namevarchar(20),balancedecimal(10,2))engine=InnoDBdefaultcharset=utf8mb4;insertintoaccountsvalues(1,'张三',1000),(2,'李四',0);-- 正常提交begin;updateaccountssetbalance=balance-500whereid=1;updateaccountssetbalance=balance+500whereid=2;commit;-- 回滚撤销begin;updateaccountssetbalance=balance-200whereid=1;updateaccountssetbalance=balance+200whereid=2;rollback;-- 保存点回滚begin;updateaccountssetbalance=500whereid=1;savepointsp1;updateaccountssetbalance=500whereid=2;rollbacktosp1;commit;

二、主键与外键

2.1 主键(primary key)

特点说明
字段值必须唯一不允许重复
字段值不可为空not null
一张表仅一个主键可单字段或组合字段
自动生成唯一索引创建主键时自动附带

2.2 外键(foreign key)

引用另一张表的主键,用于建立表间关联。

特点说明
字段值可以不唯一允许重复
字段值可以为空允许null
一张表可有多个外键
自动生成普通索引创建外键时自动附带

2.3 创建外键失败常见原因

  • 关联的两个字段数据类型不匹配
  • 子表已有存量数据违反外键约束
  • 被引用的主表主键缺少配套索引

2.4 级联规则(on delete / on update)

规则行为
on delete cascade主表删除,子表关联数据同步删除
on delete set null主表删除,子表外键置 null(需允许 null)
默认(不写规则)子表有关联数据时,禁止删除主表
-- 主表createtableproducts_2(pidintunsignedprimarykeyauto_increment,pnamevarchar(40),pricedecimal(10,2));-- 子表:级联删除createtableorders_2(oidintunsignedprimarykeyauto_increment,pidintunsigned,buy_numint,foreignkeyfk_pid(pid)referencesproducts_2(pid)ondeletecascadeonupdatecascade);-- 子表:置空处理(pid 必须允许 null)createtableorders_3(oidintunsignedprimarykeyauto_increment,pidintunsignednull,buy_numint,foreignkeyfk_pid2(pid)referencesproducts_2(pid)ondeletesetnull);

三、索引

3.1 什么是索引

类似书籍目录,作用是加快数据查询速度

有索引无索引
直接定位数据,类似查目录逐行全表扫描
查询效率大幅提升数据量大时极慢

3.2 优缺点

优点缺点
大幅提高查询速度占用额外磁盘空间
减少磁盘 IO增删改需同步维护索引,降低写入性能
避免全表扫描数据越大,索引占用越多

3.3 存储结构分类

类型适用场景
B+ 树索引范围查询、in查询(默认)
哈希索引仅支持精准等值=查询
全文索引文本模糊like检索

3.4 功能分类

类型特点语法
普通索引允许重复、允许 nullcreate index idx_name on 表(字段);
唯一索引值必须唯一、允许 nullcreate unique index idx_name on 表(字段);
主键索引唯一 + 非空,一张表仅一个创建主键自动生成
组合索引多字段联合create index idx_a_b on 表(字段1,字段2);
全文索引长文本检索create fulltext index idx_text on 表(字段);
-- 创建普通索引createindexidx_pnameonproducts(pname);-- 创建唯一索引createuniqueindexidx_priceonproducts(price);-- 创建组合索引createindexidx_name_stockonproducts(name,stock);-- 查看索引showindexfromproducts;showcreatetableproducts;-- 删除索引dropindexidx_pnameonproducts;

MySQL 不支持直接修改索引,需要先删除旧索引再重新创建新索引。


四、高级 DQL

4.1 条件判断(case when)

类似编程中的 if-else,根据条件生成新列:

selectname,price,casewhenprice<500then'低价'whenpricebetween500and3000then'中价'else'高价'endas'价格等级'fromproducts;

4.2 空值处理(ifnull)

selectifnull(name,'无名商品')as'商品名称',pricefromproducts;

4.3 字符串函数

selectconcat(name,' - ',city)as'顾客信息'fromcustomers;selectname,char_length(name)as'名称长度'fromproducts;

4.4 分页查询(limit offset)

-- limit 每页条数 offset 跳过条数select*fromproductsorderbypricedesclimit3offset0;-- 第 1 页select*fromproductsorderbypricedesclimit3offset3;-- 第 2 页

4.5 exists

-- 有下过单的顾客select*fromcustomersascwhereexists(select1fromordersasowhereo.customer_id=c.id);-- 从未被购买过的商品select*fromproductsaspwherenotexists(select1fromorder_itemsasoiwhereoi.product_id=p.id);

4.6 union 合并结果集

selectnameas'名称'fromcustomersunionselectnameas'名称'fromproducts;-- union all 保留重复(更快)selectnameas'名称'fromcustomersunionallselectnameas'名称'fromproducts;

4.7 窗口函数(window function)

在不改变行数的情况下对分组内数据排序、排名、累计:

-- row_number:为每行赋予唯一连续排名selectname,price,row_number()over(orderbypricedesc)as'价格排名'fromproducts;-- rank:相同值并列排名,会跳过后续序号(如 1,1,3)selectname,price,rank()over(orderbypricedesc)as'价格排名'fromproducts;-- dense_rank:相同值并列排名,不跳过后续序号(如 1,1,2)selectname,price,dense_rank()over(orderbypricedesc)as'价格排名'fromproducts;

五、总结

分类核心操作关键字/语法
事务开启/提交/回滚begin/commit/rollback/savepoint
事务ACID原子性、一致性、隔离性、持久性
外键级联删除on delete cascade
外键置空处理on delete set null
索引普通/唯一/组合/全文create index/create unique index/create fulltext index
索引查看/删除show index from/drop index
高级 DQL条件判断case when ... then ... else ... end
高级 DQL空值处理ifnull()
高级 DQL字符串函数concat()/char_length()
高级 DQL分页limit ... offset ...
高级 DQLexistsexists/not exists
高级 DQL合并结果集union/union all
高级 DQL窗口函数row_number()/rank()/dense_rank()/over
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 3:44:47

安企CMS的安装-PHPStudy(小皮面板)部署

适用场景&#xff1a;Windows 本地开发环境或 Windows 服务器。PHPStudy&#xff08;小皮面板&#xff09;集成 Nginx、MySQL、PHP 等组件&#xff0c;AnQiCMS 在其中通过 Nginx 反向代理方式运行。前置准备 已安装 PHPStudy&#xff08;小皮面板&#xff09;软件运行模式切换为…

作者头像 李华
网站建设 2026/7/19 3:44:46

STM32嵌入式开发实践:从基础外设到课程设计

1. STM32课程设计概述2021年的STM32课程设计是嵌入式系统学习中的一个重要实践环节。作为基于Arm Cortex-M内核的32位微控制器&#xff0c;STM32系列以其丰富的外设资源、优异的性能和广泛的应用场景&#xff0c;成为工科学生掌握嵌入式开发的理想平台。在实际教学中&#xff0…

作者头像 李华
网站建设 2026/7/19 3:42:47

Node.js实战:六大高并发场景性能优化与架构设计

1. 为什么选择Node.js&#xff1f;从实战案例看技术优势2009年Ryan Dahl首次发布Node.js时&#xff0c;可能没想到这个基于Chrome V8引擎的JavaScript运行环境会彻底改变后端开发格局。作为常年混迹在全栈开发一线的工程师&#xff0c;我亲历了从PHP/Java传统架构向Node.js的迁…

作者头像 李华
网站建设 2026/7/19 3:42:37

新160个CrackMe054-vcrkme01、055-BCG Crackme、056-diablo2oo2‘s Crackme 01逆向分析

054无壳暴力破解字符串查找找到相关跳转&#xff0c;将该跳转给nop掉即可获取破解版本软件算法分析先是获取用户名和序列号&#xff0c;之后将这两个参数利用函数调用&#xff0c;根据返回结果&#xff0c;判断跳转成功或者跳转失败步进函数继续分析先是判断用户名和序列号的第…

作者头像 李华
网站建设 2026/7/19 3:40:36

SQL私教:基于AST与执行计划的语义级实时诊断工具

1. 项目概述&#xff1a;这不是一个“SQL题库”&#xff0c;而是一个会盯你姿势的教练我试过太多学 SQL 的方法——刷 LeetCode、看文档、抄别人代码、甚至对着 PostgreSQL 官方手册逐行默写。但直到某天深夜&#xff0c;我第 7 次把GROUP BY和WHERE的执行顺序搞反&#xff0c;…

作者头像 李华