# 逐集练习脚本（practice-verified）

本目录是**原创练习资源**，与站内 50 集笔记一一对应。每集一个独立脚本 `pNN.sql`，已在本机
隔离的 **Oracle MySQL 8.0.46**（Ubuntu 官方包，Unix socket、无 TCP）上逐个真实执行通过（rc=0）。

## 先看安全边界

> ⚠ **仅限本机临时学习环境**（Docker、本机自建 MySQL、一次性测试实例）。
> **不要在生产库、共享实例或 production root 上执行。**
> 每个脚本都会 `DROP DATABASE IF EXISTS mysqlnotes_pNN` 再重建，只碰自己的库；
> 但仍请先确认实例里没有同名业务库。

## 怎么用

```bash
# 本机 socket 连接（示例；按你的实例改 socket/端口）
mysql --socket=/tmp/mysql.sock -u root < p18.sql
```

脚本第一段固定为：

```sql
DROP DATABASE IF EXISTS mysqlnotes_pNN;
CREATE DATABASE mysqlnotes_pNN CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
USE mysqlnotes_pNN;
```

因此可以重复执行，不会叠加脏数据；也不需要按顺序跑，每集自包含。

## 逐集 schema 差异（重要）

50 集不是同一张 `employee` 表。脚本按各集正文实际用到的列建表，**不要把它们混成一张表**：

| 集数 | 数据准备 | `employee` 的关键差异 |
|---|---|---|
| P01–P03 | 无需建表 | 只查版本/库列表 |
| P04–P17 | `p04`–`p17` 各自建表 | A 版：`name VARCHAR(30)`、`salary DECIMAL(10,2)`，无 `manager_id`，`dept_id` 无外键；P08 另有 `t_time`（四种日期时间类型） |
| P18–P23 | `p18`–`p23` 建 `department` + `employee` | B 版：`name VARCHAR(20)`、`salary DECIMAL(10,2)`，`dept_id`/`salary` 可空；P18–P23 不建外键 |
| P21（单独一版） | `p21` 建 `department` + `employee` | 案例练习变体：6 行、多两列 `gender` / `entrydate`（讲义 2.6.8 的 5 道小题要用）；不是 P18–P20 的 4 行表 |
| P24–P26 | DCL，无需业务表 | P25 建 A 版 `employee` 作为授权对象；P24 只建/删账号 |
| P27–P31 | 各自建表或纯查询 | P27 建 3 行 `employee(id,name,workno)` 演示补零；P30 建 4 行 `employee`；P28/P29/P31 纯函数查询 |
| P32–P36 | 约束演示表 | `practice_score` / `practice_user` / `practice_user_full`；P34/P35 用 B 版 `employee` 加外键 |
| P37–P50 | `p37`–`p50` 建 `department` + `employee` | C 版：`salary INT`，多一列 `manager_id`（自连接/上级用），P37 额外加外键；P49 另建 4 档 `salgrade` |

对应关系以 `index.json` 的 `note` 字段为准；每集正文的“先准备本集练习数据”入口直接指向该集脚本。

## DCL 脚本（P24 / P25）

- 账号固定为本机 `'mysqlnotes_demo'@'localhost'`；密码是**明显的本机占位串**（`LocalOnly_ChangeMe_01`、
  `LocalOnly_Demo_ChangeMe_01`），不是任何真实凭据，也不是随机 QA 口令。
- 脚本会在结尾 `DROP USER`，账号不会留在实例里；权限只授到本练习库的单表，没有 `*.*`。
- 公开笔记里的 DCL 示例同样只是占位；真实环境请自行输入强密码并妥善保管，不要把密码写进脚本或仓库。
- 这两集若你不想在本机建账号，可以只阅读、不执行；其余 48 集不涉及 DCL。

## 原创与来源说明

- 脚本中的建表、示例数据与练习任务是为本站重新编写的**原创练习材料**，用于复现课程知识点；
  不包含视频画面、逐字稿、课件原件，也不是对原课程练习题的逐字抄录。
- 查询结论只对脚本里的这份小数据集成立；具体数值/性能结论以视频与官方文档为准。

## 验证记录

- 引擎：Oracle MySQL `8.0.46-0ubuntu0.24.04.4`（aarch64），Unix socket、`skip-networking`、无 daemon。
- 方式：50 个脚本逐个通过 `mysql` 客户端执行，任一 SQL 错误即判失败；全部 rc=0（每个脚本先建自己的
  `mysqlnotes_pNN`、结束不残留库；DCL 脚本内建号删号）。
- 内容修订（2026-10-22 讲义升级轮）：P08 增加 `t_time`（DATE/DATETIME/YEAR/TIMESTAMP 取值）；P21 换成 6 行、含 `gender`/`entrydate` 的案例练习表并补 5 道分题 + 综合题；P27 改为建表 → 预览 → `UPDATE ... LPAD` → 回读；P30 补 IF 与简单 CASE；P45 补 `> ANY`；P48 题2 注释改为“原课 age<30 显式，本页 age<25 自定”；P49 增加原创 4 档 `salgrade` 与三表。修订后 50 个脚本已全部重跑通过（rc=0）。
- 逐文件 SHA-256 见 `index.json` 的 `sha256` 字段（50 条）；脚本改一个字都要重跑并同步该表。
- 每集笔记正文的“建表与插入语句”一栏指向**本集** `pNN.sql`，不同集的表列数与类型允许不同，不要跨集复用同一张表。
