承接上篇 DDL、DML、DQL 全套单表 SQL 语法,本篇完整讲解数据库多表关系设计、外键约束、四类多表连接查询、事务四大特性 ACID、事务隔离级别、脏读 / 不可重复读 / 幻读问题,配套大量业务案例、可执行 SQL,是企业开发核心高频知识点。
一、多表设计与表之间的关系
1.1 为什么需要分多张表
如果把员工、部门数据全部放在一张表里,会出现大量重复部门名称、冗余数据,修改部门名称时需要批量更新所有员工记录,极易出现数据不一致问题。分表设计优势:
1.2 数据库三种表关系
1)一对多(最常用:部门 – 员工、分类 – 商品)
- 一方:部门表 dept(1 个部门多名员工)
- 多方:员工表 emp
- 实现方式:多方表添加外键字段(dept_id),关联一方主键 id建表示例核心字段
— 部门表(一方)
create table dept(
id int primary key auto_increment comment '部门主键',
dept_name varchar(20) not null comment '部门名称'
);
— 员工表(多方)
create table emp(
id int primary key auto_increment,
name varchar(10),
dept_id int comment '关联部门id',
— 外键约束,关联dept表id
foreign key(dept_id) references dept(id)
);
2)一对一(用户 – 用户详情、员工 – 工资卡)
适用场景:拆分大表,把不常查询的独立信息拆分单独一张表实现:两张表主键一一对应,任意一方添加外键并加 unique 唯一约束
3)多对多(学生 – 课程、订单 – 商品)
一个学生选多门课,一门课多名学生;无法直接两张表关联,必须建立中间关联表中间表存储双方外键,复合主键:
— 学生表 student(id,name)
— 课程表 course(id,course_name)
— 中间选课表
create table stu_course(
stu_id int,
course_id int,
primary key(stu_id,course_id), — 复合主键
foreign key(stu_id) references student(id),
foreign key(course_id) references course(id)
);
1.3 外键约束详解
- 外键字段数据类型、长度必须和关联主键完全一致;
- 主表不能删除被从表引用的数据;
二、四类多表联查 SQL 语法
2.1 内连接 inner join(简写 join)
语法
select 字段 from 表1 join 表2 on 关联条件 where 筛选;
特点:只查询两张表匹配成功的数据,无关联数据不展示
案例:查询有部门的员工,展示员工姓名 + 部门名称
select e.name,d.dept_name
from emp e
inner join dept d
on e.dept_id = d.id;
2. 左外连接 left join
特点:以左表为基准,左表数据全部展示,右表无匹配显示 null
业务场景:查询全部员工(包括无分配部门的员工)
select e.name,d.dept_name
from emp e
left join dept d
on e.dept_id = d.id;
3. 右外连接 right join
特点:右表全部展示,左表无匹配填充 null
场景:查询所有部门,哪怕该部门暂无员工
4. 自连接(特殊多表,一张表内关联)
同一张表存在上下级关系(员工表存领导 id,领导也是员工),一张表起两个别名自关联
select emp.name 员工,leader.name 直属领导
from emp emp
left join emp leader
on emp.leader_id = leader.id;
2. 多表查询通用规范
三、子查询(嵌套 SQL)
子查询:一条 SQL 内部嵌套另一条查询语句,分为标量子查询、列子查询、表子查询
— 查询教研部所有员工
select name from emp
where dept_id = (select id from dept where dept_name='教研部');
select name from emp
where dept_id in (select id from dept where id<5);
四、事务核心知识点
4.1 什么是事务
一组 DML 增删改 SQL,要么全部执行成功,要么全部回滚撤销,保证数据操作安全。典型场景:转账(A 扣钱、B 加钱两条 SQL,一条失败必须全部撤回)
4.2 事务四大特性 ACID
4.3 MySQL 事务基础语法
— 1.开启事务
start transaction;
— 2.执行多条增删改SQL
update account set money=money-100 where id=1;
update account set money=money+100 where id=2;
— 3.无异常提交永久保存
commit;
— 4.出现异常回滚,撤销所有操作
rollback;
4.4 自动提交机制
MySQL 默认每条 DML 语句自动开启并提交事务;关闭自动提交:set autocommit=0;
五、事务隔离级别与并发问题
5.1 并发事务三大问题
5.2 四级隔离级别(从低到高)
| 读未提交 read uncommitted | 存在 | 存在 | 存在 | 最高 |
| 读已提交 read committed | 无 | 存在 | 存在 | 较高 |
| 可重复读(MySQL 默认) | 无 | 无 | 存在 | 中等 |
| 串行化 serializable | 无 | 无 | 无 | 最低 |
5.3 隔离级别操作 SQL
— 查询当前隔离级别
select @@transaction_isolation;
— 设置会话隔离级别
set session transaction isolation level read committed;
六、下篇完整全文总结
下篇拓展实操练习
下篇面试高频考点
当前文件内容过长,豆包只阅读了前 57%。



