MySQL 数据库 3(Day51)
主题:表与表三种关系(多对一/多对多/一对一)、外键(Foreign Key)与级联更新/删除、ALTER TABLE 修改表、INSERT … SELECT 复制数据、记录增删改(INSERT/UPDATE/DELETE)、单表查询结构与 WHERE 条件过滤(比较运算/AND/OR/BETWEEN/IN/LIKE/REGEXP)
结构总览
MySQL 数据库 3
├─ 表与表三种关系
│ ├─ 多对一:单向外键(student.class_id → class.id)
│ ├─ 多对多:中间表 + 两个外键(book2author)
│ └─ 一对一:外键 + UNIQUE(customer_id)
├─ 外键与级联
│ ├─ FOREIGN KEY ... REFERENCES
│ ├─ ON UPDATE CASCADE / ON DELETE CASCADE
│ └─ 常见错误:插入不存在父表 id、级联未配置
├─ 修改表与复制表
│ ├─ ALTER TABLE 修改表结构
│ └─ INSERT ... SELECT 跨表/跨库复制数据
├─ 记录详细操作
│ ├─ INSERT(增加)
│ ├─ UPDATE(修改)
│ └─ DELETE(删除)
└─ 单表查询
├─ SELECT 结构:DISTINCT / WHERE / GROUP BY / HAVING / ORDER BY / LIMIT
├─ CASE WHEN 条件分支
├─ 比较运算:= > >= !=
├─ AND / OR / BETWEEN / IN
├─ LIKE 模糊匹配(% 任意长度、_ 单字符)
└─ REGEXP 正则匹配(^开头、$结尾)
关键要点
三种表关系:
| 关系 | 实现方式 | 示例 |
|---|---|---|
| 多对一(Many-to-One) | 单向外键 | 多个学生通过 class_id 指向一个班级 |
| 多对多(Many-to-Many) | 中间表 + 两个外键 | book2author 连接 book 与 author |
| 一对一(One-to-One) | 外键 + UNIQUE 约束 | customer_id 唯一,一个客户最多对应一条学生记录 |
多对一(外键): 学生表通过 class_id 外键关联班级表 class.id。
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(16),
class_id INT,
FOREIGN KEY (class_id) REFERENCES class(id)
ON UPDATE CASCADE
ON DELETE CASCADE
);- 外键保证引用完整性:插入不存在的
class_id=4444会报错;ON UPDATE CASCADE级联更新(父表 id 修改时子表自动跟随)、ON DELETE CASCADE级联删除(父表记录删除时子表关联记录一并删除)。
多对多(中间表): book2author 同时保存 book_id 与 author_id 两个外键,各自级联,从而把多对多拆成两个多对一。
一对一(外键 + UNIQUE): customer_id INT UNIQUE + 外键引用 customer(id),保证同一个客户在 student 表中最多出现一次。
修改表与复制表: ALTER TABLE 修改表结构;跨库复制数据用 INSERT ... SELECT:INSERT db3.test2(id, name, email, reg_time) SELECT id, name, email, reg_time FROM db2.test1;。排错:源/目标字段数量不一致、目标表不存在、库名表名写错。
记录操作: INSERT(增加)、UPDATE(修改)、DELETE(删除)三类。
单表查询结构:
SELECT DISTINCT 字段1, 字段2, ...
FROM 库.表
WHERE 过滤条件
GROUP BY 分组字段
HAVING 过滤条件
ORDER BY 排序字段
LIMIT 条数;CASE 条件分支: 根据字段值生成新列。
SELECT id,
(CASE
WHEN name = 'egon' THEN CONCAT(name, '_vip')
WHEN name = 'alex' THEN CONCAT(name, '_BIGSB')
ELSE name
END) AS new_name,
age
FROM employee;WHERE 过滤条件对比:
| 语法 | 作用 | 示例 |
|---|---|---|
| 比较运算 | 等值/大小/不等 | id = 3、id > 3、id >= 3、id != 3 |
| AND | 多个条件同时成立 | id > 3 AND id < 5 |
| OR | 满足一个即可 | id < 3 OR id > 10 |
| BETWEEN | 范围闭区间 | id BETWEEN 3 AND 5(等价 id >= 3 AND id <= 5) |
| IN | 多个指定值 | id IN (3, 5, 7)(等价多个 OR) |
| LIKE | 模糊匹配 | name LIKE 'ji%'(% 任意长度)、name LIKE 'ji_'(_ 单字符)、'__' 两字符 |
| REGEXP | 正则匹配 | name REGEXP '^jin'(以 jin 开头)、name REGEXP 'n$'(以 n 结尾) |
当日总结
- 表关系三种:多对一(单向外键)、多对多(中间表两个外键)、一对一(外键 + UNIQUE)
- 外键配合
ON UPDATE/DELETE CASCADE实现级联更新与级联删除 ALTER TABLE修改表、INSERT ... SELECT复制数据- 记录操作三类:INSERT / UPDATE / DELETE
- 单表查询完整结构:SELECT DISTINCT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
- WHERE 过滤:比较运算、AND、OR、BETWEEN、IN、LIKE(%/ _)、REGEXP(
相关页面
- MySQL 概念页 — 本课核心概念页(表关系/外键/单表查询/WHERE)
- MySQL 数据库 4(Day52) — 下一实操课(分组/排序/多表连接/子查询)
- MySQL 数据库 2(Day50) — 上一实操课(数据类型/约束/存储引擎)
- MySQL 数据库 1(Day49) — 基础实操(密码/配置/SQL/安装)
- MySQL 概念页 — 数据库层枢纽