第 12 章 视图与存储过程
前面我们都是一条一条地写 SQL,本篇进入"封装"的世界——把常用查询封装成视图、把一段业务逻辑封装成存储过程,重复调用、统一口径。本篇讲视图的创建修改、存储过程的参数与流程控制、以及游标的基本用法。学完后你能把复杂查询模块化,避免到处复制粘贴 SQL。本示例基于 MySQL 8.0 语法。
围绕 MySQL、InnoDB、SQL 查询、索引与事务,探讨执行计划分析、锁问题、备份恢复、复制和运维方法,适合学习与项目实践时按主题查阅。
收录 12 篇文章下次更新:10-24 08:00(北京时间),还有 128 篇已排期文章。
前面我们都是一条一条地写 SQL,本篇进入"封装"的世界——把常用查询封装成视图、把一段业务逻辑封装成存储过程,重复调用、统一口径。本篇讲视图的创建修改、存储过程的参数与流程控制、以及游标的基本用法。学完后你能把复杂查询模块化,避免到处复制粘贴 SQL。本示例基于 MySQL 8.0 语法。
索引是数据库性能优化的第一课,也是性价比最高的优化手段——一张大表没索引时查一条数据可能要扫全表几秒钟,建好索引后毫秒返回。本篇从"为什么需要索引"出发,讲清楚 InnoDB 默认的 B+Tree 索引结构,以及唯一索引、复合索引、全文索引的创建与查看方式,并引入覆盖索引这个关键概念。学完后你能为业务表合理设计索引。本示例基于 MySQL 8.0 语法。
上一篇我们认识了 IF、IFNULL 这些简单的流程控制函数,但只要分支超过两层,它们就会变得难读难维护。本篇专门讲 SQL 里最强大的条件表达工具 `CASE WHEN`,以及它与聚合函数结合后完成"行转列"报表的经典套路。学完后你能写出多分支分类、动态排序、交叉报表等复杂查询。本示例基于 MySQL 8.0 语法。
函数是 MySQL 把原始数据加工成业务结果的"工具箱",几乎每条稍复杂的 SELECT 都会用到它。本篇在前面章节学完增删改查、连接、子查询的基础上,系统梳理字符串、日期时间、数值、流程控制与加密哈希五大类常用函数。学完后你能独立完成数据清洗、格式化输出、时间差计算、空值兜底等日常开发任务。本示例基于 MySQL 8.0 语法。
子查询(subquery)就是"查询里套查询",是 SQL 表达复杂业务逻辑的利器。本篇讲标量子查询、`IN`/`NOT IN`、`EXISTS`、`ANY`/`ALL`、关联子查询,以及 `FROM` 子句里的派生表(derived table)。我们会对比子查询与 JOIN 的优劣、讲清楚 `NOT IN` 遇到 NULL 全灭的经典坑,最后给出 MySQL 8.0 中优化器对子查询的处理。学完你能写出"查成绩高于本系平均的学生"这类业务 SQL。本示例基于 MySQL 8.0,所有 SQL 均按该版本语法书写。
真实业务里数据是分散在多张表里的——学生表、课程表、成绩表、院系表。要把它们"拼"在一起查,就靠 `JOIN`。本篇讲最常用的 INNER JOIN、LEFT JOIN、RIGHT JOIN、CROSS JOIN,以及自连接、多表连接,重点区分 ON 与 WHERE 的差异、LEFT JOIN 后加 WHERE 会变 INNER 的经典坑。学完你能写出后台 80% 的列表查询 SQL。本示例基于 MySQL 8.0,所有 SQL 均按该版本语法书写。
前面的查询都是"一行对一行",本篇进入"多行压缩成一行"的世界——聚合。`COUNT`/`SUM`/`AVG`/`MAX`/`MIN` 是五个最常用的聚合函数,配合 `GROUP BY` 能"按城市统计平均成绩",配合 `HAVING` 能"过滤分组"。我们还会讲 `GROUP_CONCAT` 把一组行拼成字符串,以及聚合中 NULL 的特殊行为。这是写报表 SQL 的核心。本示例基于 MySQL 8.0,所有 SQL 均按该版本语法书写。
上一篇解决了"查哪些行、查哪些列",本篇解决"以什么顺序返回、返回前多少行"。`ORDER BY` 让结果按你想要的顺序排列,`LIMIT/OFFSET` 是 Web 后台"翻页"的核心。我们会讲单列/多列排序、升降序、字符串排序的 collation 陷阱,以及分页性能优化(深分页问题)。学完你能写出业务后台最常见的"按时间倒序、每页 20 条"查询。本示例基于 MySQL 8.0,所有 SQL 均按该版本语法书写。
如果说 DML 是"写",那 `SELECT` 就是数据库里出现频率最高的"读"。本篇带你从最基础的"查所有列"开始,逐步掌握列选择、列别名、`DISTINCT` 去重,以及 `WHERE` 子句的完整用法——包括比较运算符、逻辑组合、`IN`/`BETWEEN`/`LIKE` 三大过滤利器。这一篇是后面所有复杂查询(排序、聚合、多表连接、子查询)的地基。本示例基于 MySQL 8.0,所有 SQL 均按该版本语法书写。
DML(Data Manipulation Language,数据操作语言)是开发者日常写得最多的一类 SQL,核心就是 `INSERT`、`UPDATE`、`DELETE` 三条语句。本篇在上一章建好表的基础上,带你把数据真正"装进去、改对、删干净",并讲清楚批量插入、安全删除、`TRUNCATE` 与 `DELETE` 的本质区别这些实战高频点。学完你能独立完成业务系统里的写操作,避免"删错库、改全表"这类生产事故。本示例基于 MySQL 8.0,所有 SQL 均按该版本语法书写。