数据库知识点

数据库知识点

1.数据库事务的四个特性

原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
原子性:一个事务(Transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性在事务完成前后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的默认规则,这包含资料的精准度、串联新以及后续数据库可以自发性地完成预定的工作。

隔离性当两个或者多个事务并发访问(此处访问指查询和修改的操作)数据库的同一数据时所表现出的互相关系。事务隔离分为不同的级别,包括读为提交(Read uncommitted)、读提交(Read committed)、可重复读(Repeatable read)和串行化(Serializable)。

持久性:在事务完成以后,该事务对数据库所作的更改便持久地保存在数据库之中,而且是完全的。

2.数据库设计的范式

2.1 第一范式

数据库表中,每个属性都是不可再分的(原子性)。

2.2 第二范式

消除数据表的部分依赖。
<学生,课程> => 上课教室
<学生,课程> => 教师
<学生,课程> => 教师职称
<课程> =>上课教室
<课程> =>教师
<课程> =>教师职称
以上就是部分依赖,做法就是将上课教室,教师,教师职称等于学生,课程属性拆开。

2.3 第三范式

消除传递依赖。
<课程> =>教师
<教师> =>教师职称
以上就是传递依赖,方案就是将课程 教师 教师职称 拆分成课程 教师;教师 教师职称两张表

2.4 BC范式

第三范式中,属性不依赖于其他非属性。而BC范式中,不仅属性不能依赖于其他非主属性,其他非属性也不得依赖于其他他非主属性。

3.数据库表级联操作

数据库知识点

图中方位 连接方式
left join
right join
inner join
full outer join

4.视图与表

定义:视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询;不包含任何列或数据。使用视图可以简化复杂的sql操作,隐藏具体的细节,保护数据;视图创建后,可以使用与表相同的方式利用它们。
无法使用索引,也不能有关联的**或者默认值

5. drop,delete和truncate的区别

drop直接删掉表;而truncate清空表中数据,但不删除表结构; delete删除表中数据,可以加where字句。
(1) delete与truncate的区别:DELETE语句执行删除的过程是每次从表中删除一行,同时将该行的删除操作作为事务记录保存在日志中以便回滚。TRUNCATE TABLE 则清空表中所有数据,无日志,删除不能恢复。在删除的过程中不会**与表有关的删除触发器。执行速度快。
(2) 表和索引所占空间:TRUNCATE会使表和索引空间恢复到初始大小,DELETE操作不会减少表或索引所占用的空间;drop语句将表所占用的空间全释放掉。
(3) 应用范围:TRUNCATE 只能对TABLE;DELETE可以是table和view
(4) TRUNCATE 和DELETE只删除数据,而DROP则删除整个表(结构和数据)。
(5) truncate与不带where的delete :只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
(6) delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 trigger,执行的时候将被触发。
(7) truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚
(8) Truncate table 表名 速度快,而且效率高,因为:
truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
(9) TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
(10) 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能**触发器。

6.数据库中的索引原理

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。

6.1 建立索引的优点

(1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
(2)可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
(3)可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
(4)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
(5),通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

6.2 建立索引的缺点

(1)创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
(2)索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
(3)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度

6.3 何种情况建立索引

需要建立索引的情况 不适合建立索引的情况
经常需要检索的列 极少使用或者参考的列
主键的列 极少数据值的列
用在连接的列 定义为text,image和比他数据类型的列
需要范围检索的列 当修改性能远远大于检索性能
在经常需要排序的列
在where子句中涉及的列

6.4 索引的种类

索引分为唯一索引、主键索引和聚集索引

6.5 数据库的隔离级别

1 脏读:修改时加排他锁,直到事务提交后才释放,读取时加共享锁

2 不可重复读:读取数据时加共享锁,写数据时加排他锁,都是事务提交才释放锁。读取时候不允许其他事物修改该数据,不管数据在事务过程中读取多少次,数据都是一致的,避免了不可重复读问题。
3 幻读问题:采用的是范围锁RangeS RangeS_S模式,锁定检索范围为只读,这样就避免了幻影读问题,在这里有个描述范围锁的文章

read uncommitted
read committed
repeated read
Serializable
Oracle默认使用read committed ,MySQL默认repeated read