数据库的三大范式
第一范式:1NF
数据库表中每一列是不能再拆分的原子数据项,如果出现复合列,必须单独列出来
第二范式:2NF
在1NF的基础上,数据库中一张表描述一件事,且表中的非主键字段必须完全依赖于主键字段,完全依赖是指不能存在仅依赖主键一部分的列
第三范式:3NF
在2NF的基础上,任何非主列不得传递依赖于主键
多表查询
内连接,外连接,子查询(实际开发中使用不到,执行sql小绿太低)
内连接
隐式内连接---看不到join关键字,使用where条件
语法: select 字段列表 from 表名名1,表名名2 where 连接条件 ;
显示内连接---inner join 关键字 ,inner可以省略
语法: select 字段列表 from 表名名1 inner join 表名名2 on 连接条件;
外连接
左外连接(推荐)
左外连接:将左边表数据以及满足两种表条件的数据全部展示;
语法:select 字段列表 from 表名1 left outer join 表名2 on 连接条件;
右外连接
语法:select 字段列表 from 表名1 left outer join 表名2 on 连接条件
子查询:select 语句嵌套select语句
这种场景实际开发使用很少,查询的效率比较低,常用where条件使用比较运算符,或者使用in集合语句,或者使用一条select语句的结果作为一个"虚表"和其他表查询
数据库事务以及数据库事务的隔离级别
数据库事务
在实际开发中,当这个业务需要同时操作多个sql,或者多张表同时添加、删除、修改,将整个业务操作整体使用事务管理起来,要么他们同时执行成功,要么同时执行失败
关系型数据库:事务是默认自动提交的
要启用事务管理业务操作的话,必须为"手动提交"
开启事务: start transaction;
如果执行多个sql时出现问题(异常),将事务回滚: rollback;
提交事务: commit;
关系型数据库事务的特点(重点)--- 传统型事务的特点(ACID)
原子性: 使用事务管理的业务操作(执行多个sql),要么同时执行成功,要么同时失败
一致性: 在事务管理的业务操作过程中,执行之前和执行之后它的数量总量不变
隔离性: 业务和业务之间是独立,业务又需要被事务管理,事务和事务之间是独立的,相互之间不影响,分离开来
持久性: 针对增删改操作,只要提交事务,即使关机了,数据永久保存
数据库事务的隔离级别
read uncomitted;
读未提交(会产生最严重的问题:脏读(一个事务读到另一个没有提交事务))
read committde;
读已提交,可以有效防止脏读,但是会现在一个问题"不可重复读"(在提交事务之前和事务,数据不一致!)
repeatable read ;
可重复度(mysql默认的隔离级别,可以有效防止脏读以及不可重复读,会出现"幻读")
serializable;
串行话:级别最高,安全性最高,但效率最低