一些概念性的东西也记录下, 面试时候也会问,技术记录主要以学习,面试为主
概念性
① 数据库的三范式
-
第一范式:1NF是对属性的原子性约束,要求字段具有原子性,不可再分解;(只要是关系型数据库都满足1NF)
-
第二范式:2NF是在满足第一范式的前提下,非主键字段不能出现部分依赖主键;解决:消除复合主键就可避免出现部分依赖,可增加单列关键字。
-
第三范式:3NF是在满足第二范式的前提下,非主键字段不能出现传递依赖,比如某个字段a依赖于主键,而一些字段依赖字段a,这就是传递依赖。解决:将一个实体信息的数据放在一个表内实现
② 事务的四大特性
-
原子性:不可分割的操作单元,事务中所有操作,要么全部成功;要么撤回到执行事务之前的状态
-
一致性:如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一致的;
-
隔离性:事务操作之间彼此独立和透明互不影响。事务独立运行。这通常使用锁来实现。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
-
持久性:事务一旦提交,其结果就是永久的。即便发生系统故障,也能恢复。
③ 事务隔离级别
-
未提交读(Read Uncommitted):允许脏读,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据
-
提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)。
-
可重复读(Repeated Read):可重复读。无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响。(默认)
-
串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
MySQL数据库(InnoDB引擎)默认使用可重复读( Repeatable read)
④ 事务的并发问题
-
脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
-
幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
-
不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
1、 增删改查
这个先不说了,以后有机会在另开一篇
2、视图
就是为了简化查询,是一个虚拟表的概念,不会真正的存储数据
2.1、权限控制
不能开放对基础数据的访问权限, 那么可以通过视图, 开放其中的几列
2.2、简化复杂的查询
复杂的查询语句可以通过生成一个视图来操作,每次操作视图, 优化器对视图进行了优化,比每次都使用复杂查询语句要快
2.3、视图能不能更新,删除,添加数据(默认)
更新数据: 可以, 但是如果视图是通过表关联创建的, 在更新的时候,只能一次更新一个表中的字段, 不可以一个更新语句更新多个表中的字段。
删除数据:如果建立单表视图, 可以删除数据。 如果多表查询结果建立的视图, 不可用删除数据。
添加数据:同更新,只能一次插入的数据在一个表中,并且必须主键是自增主键,否则也会出错
3、存储过程
一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
优点:
①将重复性很高的一些操作,封装到一个存储过程中,简化了对这些SQL的调用
②批量处理:SQL+循环,减少流量,也就是“跑批”
③统一接口,确保数据的安全
3.1 创建
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
characteristic:
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
routine_body:
Valid SQL routine statement
[begin_label:] BEGIN
[statement_list]
……
END [end_label]
实例:
CREATE PROCEDURE del_data(in pname VARCHAR(255))
BEGIN
delete from test where name = pname;
END
-- 调用方式
CALL del_data(123);