数据库的三大设计范式
第一范式:数据表中的所有字段都是不可分割的原子值
- 字段值还可以继续拆分的就不满足第一范式
- 范式,设计的越详细,对某些实际操作可能更好,但是不一定
第二范式:
- 必须满足第一范式的要求
- 除主键外的每一列都必须完全依赖于主键
- 如果出现不完全依赖,只可能发生在联合主键的情况下
- 如果不满足,则拆表,直到实现完全依赖于主键
第三范式:
- 必须满足第二范式
- 除了主键列之外,其他列之间不能有传递依赖关系
查询训练
1 | create table student( |
SQL的四种连接查询
- 内连接
- inner join 或者 join
- 外连接
- 左连接left join或者left outer join
- 右连接right join或者right outer join
- 完全外连接 full join或者full outer join
1 | // 创建两个表 |
- inner join 查询
select * from person inner join card on person.cardId = card.id;
- 内联查询,就是两张表中的数据通过某个字段相对查询出相关的记录数据
- left join左外连接
select * from person left join card on person.cardId = card.id;
- 把左边表的数据都取出来,右边表的数据如果有则相等,如果没有就补NULL
- right join右外连接,与左外连接相似
full join全外链接,MySQL不支持,两个表的并集
1
2
3select * from person left join card on person.cardId = card.id
union
select * from person right join card on person.cardId = card.id;不用常见外键,通过相同的字段查询交集并集等
MySQL事务
- 是最小的不可分割的工作单元,事务能够保证业务的完整性
- MySQL默认开启事务
select @@autocommit;
- 执行sql语句时,效果会立即体现,不能回滚
- 关闭事务,可以回滚,但是手动提交
commit;
后,仍然不能回滚 begin;
或者start transaction;
都可以手动开启一个事务1
2
3
4
5begin;
update user set money = money - 100 where name = 'aaa';
update user set money = money + 100 where name = 'bbb';
commit;
//无法回滚事务的四大特征ACID
- 原子性,事务是最小的单位,不可再次分割
- 一致性,同一事务中必须保证同时成功或者同时失败
- 隔离性,两个事务之间具有隔离性
- 持久性,事务一旦提交,就不可以回滚
- 事务的隔离性,隔离级别越高,性能越差
- read uncommited; 读未提交的,事务a做操作,没有提交,但b可以读,脏读
- read committed; 读已提交的,事务a做操作必须已经提交,b才可以读到,不可重复读
- repeatable read; 可重复读 MySQL默认,幻读
- serializable; 串行化,可重复读,禁止写入操作,必须等待其他事务结束,性能特差
- 查看MySQL事务隔离级别
- 系统级别
select @@global.transaction_isolation;
- 会话级别
select @@transaction_isolation;
- 修改隔离级别
set global transaction islotion level read uncommited;