-
三大范式需满足的要求
第一范式:表中的每一个字段不可再拆分(原子性)
第二范式:一张表描述一件事情,每张表添加一个主键
第三范式:外键要引用另一张表的主键 -
多表查询:需要同时查询多张表才能得到需要的数据
-
多表查询的2中方式?
一、表连接查询:(较多)
1)内连接:
①隐式内连接:SELECT 字段 FROM 表名1, 表名2 WHERE 条件;
②显式内链接:SELECT 字段 FROM 表名1 INNER JOIN 表名2 ON 条件;
2)外连接
①左外连接:SELECT 字段 FROM 表名1 LEFT OUTER JOIN 表名2 ON 条件;
②内外连接:SELECT 字段 FROM 表名1 RIGHT OUTER JOIN 表名2 ON 条件;
二、子查询:(较少)
1)结果单行单列:作为父查询的条件
2)结果多行单列:作为父查询的条件 in
3)结果多行多列:作为父查询的一张虚拟表 -
多表查询规律总结:
不管我们查询几张表,表连接查询会产出笛卡尔积,我们需要消除笛卡尔积,拿到正确的数据。我们需要找到表与表之间通过哪个字段关联起来的(通常是外键=主键
) -
多表连接查询步骤:
1)确定要查询哪些表
2) 确定表连接条件
3)根据需求往后查询 -
什么是事务?
多条SQL语句组合起来完成一个功能 -
事务的四大特?
①原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
②一致性:事务前后数据的完整性必须保持一致
③隔离性:是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离,不能相互影响。
④持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响 -
事务的原理?
当连接数据库的时候,会创建一张临时事务日志表,普通SQL操作是直接操作数据库的,如果开启事务,后续的SQL先写入到临时事务日志文件,当commit后,临时事务日志文件中的SQL就会作用到数据库上,如果rollback就删除临时日志文件. -
事务的操作----------------------------------MySQL操作事务的语句
开启事务:----------------------------------start transaction;
提交事务:----------------------------------commit;
回滚事务:----------------------------------rollback;
查询事务的自动提交情况:-------------select @@autocommit;
设置事务的自动提交方式:-------------set autocommit = 0; -
mysql的四种隔离级别
读未提交:read uncommitted
读已提交:read committed
可重复读:repeatable read
串行化:serializable -
事务并发访问的三个问题
赃读:一个事务读取另一个事务还没有提交的数据
不可重复读:一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务update时引发的问题
幻读:一个事务读取多次数量不一样(一个事务内读取到了别的事务插入的数据,导致前后读取记录行数不同。这是insert或delete时引发的问题)