小白学习记录|数据库的设计,多表查询,事务(MySQL)

(关系型)数据库的设计 一、表与表的三种关系

  1. 一对多:最常用
  2. 多对多
  3. 一对一
表与表关系的实现方式
1、一对多 【小白学习记录|数据库的设计,多表查询,事务(MySQL)】”多“的一方建立外键,指向“一”的一方的主键
2、多对多 借助第三张中间表。中间表至少包含两个字段,作为外键,分别指向两张表的主键
3、一对一 任意一方添加唯一外键指向另一方主键
二、数据库的设计范式 关系数据库中的关系必须满足一定的要求,即满足数据库不同范式。
设计关系型数据库时,遵从不同的规范要求,设计出合理的关系型数据库。这些规范被称作范式。越高的范式数据库的**冗余度就越低。 **
满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的是第二范式,以此类推。一般来说,满足第三范式即可。
目前,关系数据库有6种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
(一)第一范式:1NF
第一范式:确保每列保持原子性 ------- 无重复的列,但数据冗余,
? 数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。如果实体中的某个属性有多个值时,必须拆分为不同的属性0
(二)第二范式:2NF
第二范式:确保表中的每列都和主键相关 --------------非主键属性完全依赖于主键
当存在复合主键包含多个主键时,不符合第二范式。
如果存在不符合第二范式的情况,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。
特点:1、一张表只描述一件事情 2、表中每一列都完全依赖于主键
(三)第三范式:3NF
第三范式:不产生依赖传递,表中每列 都直接依赖于主键,而不是通过其他列间接依赖。
如果某一属性依赖于其他非主键属性,而其他非主键属性又依赖于主键,那么这个属性就是间接依赖于主键,这被称作传递依赖于主属性。
多表查询–MySQL 从数据库的多张表中进行的查询操作。在表中查询另外一张表的数据就是多表查询。
多表查询,查出多个数据------->笛卡尔积
分类 3:
  1. 内连接查询
    • 隐式内连接
      • 使用where条件 删除无用数据
      • select 字段列表 from 表名1 [inner] , 表名2 where 1.‘外键列’ = 2.‘对应列’ ;
    • 显式内连接
      • select 字段列表 from 表名1 [inner] join 表名2 on 条件;
    • 注意事项:
      1. 从哪些表中查询数据
      2. 条件是什么
      3. 查询哪些字段
  2. 外连接查询
    • 左外连接
      • select 字段列表 * from 表名 1 left [outer] join 表名2 on 条件;
      • 查询的是左表所有数据及其交集部分,交集就是条件(相对应的内容)
    • 右外连接
      • select 字段列表 * from 表名1 right[outer] join** 表名2 on 条件;
      • 查询的是右表所有数据及其有交集部分,交集就是条件(相对应的内容)
  3. 子查询
    • 查询中嵌套查询 即为 子查询
    • 子查询的结果可分为
      • 单行单列
        • 子查询可作为条件,使用运算符
      • 多行单列
        • 子查询可作为条件,使用运算符 IN 来判断
      • 多行多列
        • 子查询可以作为虚拟表参与查询
事务 (一)概述
事务:如果一个包含多个步骤的业务操作,被业务管理,在实际开发中,一个业务要么同时成功,要么同时失败
(二)事务的操作
开启事务—执行SQL语句—成功—提交
? — 失败—回滚事务
1、开启事务 start transaction 2、回滚事务 rollback 回滚到开启事务之前还原数据
3、提交 commit 提交方式:
  1. 自动提交
    • MySQL 数据库中事务----默认—自动提交
  2. 手动提交
    • oracle 数据库中事务----默认----手动提交
    • 开启事务 、提交
  • SQL查看默认 结果:1 代表自动提交
    • select @@autocommit ;
  • SQL修改默认
    • set @@autocommit = 0;
(三)事务特征 【?】:
  1. 原子性 :不可分割的最小单位,要么同时成功,要么同时失败
  2. 持久性 :数据提交或回滚,数据库永久保存数据
  3. 隔离性 :多个事务,相互独立
  4. 一致性 :操作前后。数据总量不变
事务的隔离级别[了解] 多个事务是隔离的,互相独立。但如果多个事务操作同一批数据,会引发一些问题,设置不同的隔离级别可以解决问题。
问题:
  1. 脏读 : 一个事务读取到另一个事务中没有提交的数据。
  2. 不可重复读(虚读) : 同一事务,两次读到的数据不一样。
  3. 幻读 : 一个事务操作了数据表中所有的记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
  • 数据库查询隔离级别
    • select @@ tx_isolation;
  • 数据库设置隔离级别
    • set global transaction isolation level 级别字符串(隔离级别使用的字符串)
  • 隔离级别字符串
    1. read uncommitted:读未提交
      • 产生的问题:脏读、不可重复、幻读
    2. read committed:读已提交(Oracle)
      • 产生的问题:不可重复、幻读
    3. repeatable read:可重复读(MySQL默认)
      • 产生的问题:幻读
    4. serializable:串行化
      • 可解决所有问题

    推荐阅读