欢迎光临
我们一直在努力

MySQL 数据库完整教程(下篇)

承接上篇 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 外键约束详解

  • 作用:保证两张关联表数据一致性,不能给员工添加不存在的部门 id;
  • 限制规则:
    • 外键字段数据类型、长度必须和关联主键完全一致;
    • 主表不能删除被从表引用的数据;
  • 开发小提示:实际项目很多企业会取消物理外键,改用代码逻辑控制关联,避免删改数据被数据库拦截。
  • 二、四类多表联查 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. 多表查询通用规范

  • 多表必须用 on 写关联条件,where 只做业务筛选;
  • 表名过长统一设置别名简化代码;
  • 优先使用左连接,业务需要展示全部主体数据。
  • 三、子查询(嵌套 SQL)

    子查询:一条 SQL 内部嵌套另一条查询语句,分为标量子查询、列子查询、表子查询

  • 标量子查询(返回单个值,可用于 = 判断)
  • — 查询教研部所有员工
    select name from emp
    where dept_id = (select id from dept where dept_name='教研部');

  • 列子查询(返回一列多行,搭配 in)
  • select name from emp
    where dept_id in (select id from dept where id<5);

  • 表子查询(返回多张行数据,当作临时表 join)
  • 四、事务核心知识点

    4.1 什么是事务

    一组 DML 增删改 SQL,要么全部执行成功,要么全部回滚撤销,保证数据操作安全。典型场景:转账(A 扣钱、B 加钱两条 SQL,一条失败必须全部撤回)

    4.2 事务四大特性 ACID

  • 原子性 Atomic:事务不可拆分,全部成功 / 全部失败;
  • 一致性 Consistency 事务执行前后数据整体合法,转账总额不变;
  • 隔离性 Isolation 多个事务并发操作互不干扰;
  • 持久性 Durability 事务提交后数据永久写入磁盘,宕机不丢失。
  • 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 并发事务三大问题

  • 脏读:事务 A 读取到事务 B 未提交的数据,B 回滚后数据失效;
  • 不可重复读:同一事务内,两次读取同一数据,中间被其他事务修改提交,两次结果不一致;
  • 幻读:同一事务两次范围查询,其他事务新增 / 删除数据,前后条数不一样。
  • 5.2 四级隔离级别(从低到高)

    隔离级别脏读不可重复读幻读性能
    读未提交 read uncommitted 存在 存在 存在 最高
    读已提交 read committed 存在 存在 较高
    可重复读(MySQL 默认) 存在 中等
    串行化 serializable 最低

    5.3 隔离级别操作 SQL

    — 查询当前隔离级别
    select @@transaction_isolation;
    — 设置会话隔离级别
    set session transaction isolation level read committed;

    六、下篇完整全文总结

  • 多表三种关系:一对多(外键)、一对一、多对多(中间表);
  • 外键约束作用:保证关联数据完整性,项目可选择逻辑关联替代物理外键;
  • 多表联查四类:内连接、左连接、右连接、自连接,业务优先左连接;
  • 子查询可嵌套在条件、from 后,分为标量 / 列 / 表三类;
  • 事务 ACID 四大特性:原子、一致、隔离、持久;
  • 事务操作:start transaction、commit 提交、rollback 回滚;
  • 并发三大问题:脏读、不可重复读、幻读,四级隔离级别解决对应问题;
  • MySQL 默认隔离级别:可重复读,能避免脏读、不可重复读。
  • 下篇拓展实操练习

  • 创建部门、员工一对多表,添加外键约束,使用左连接查询所有员工及部门;
  • 设计学生、课程、中间表实现多对多关系,联查学生选课信息;
  • 编写转账事务 SQL,模拟异常执行 rollback 回滚验证;
  • 切换不同隔离级别,区分脏读、不可重复读现象。
  • 下篇面试高频考点

  • 一对多 / 多对多表怎么设计,外键作用;
  • 内连接与左连接使用场景区别;
  • 事务 ACID 四大特性分别是什么;
  • 脏读、不可重复读、幻读含义;5 MySQL 默认事务隔离级别,各级别能解决什么并发问题;6 commit 和 rollback 作用。
  • 当前文件内容过长,豆包只阅读了前 57%。

    赞(0)
    未经允许不得转载:171主机测评 » MySQL 数据库完整教程(下篇)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址