数据库MS
1、数据库的三范式是什么?
第一范式:表中每个字段不能再分
第二范式:满足第一范式并且表中的非主键字段都依赖与主键字段(消除了部分依赖)
第三范式:满足第二范式并且表中的非主键字段必须直接依赖于主键字段
2、什么是数据库的事务?
事务具有四大特性:原子性,一致性,隔离性,持久性
数据库的事务是指:几个SQL语句,要么全部执行成功,要么全部执行失败。比如银行转账问题。
数据库事务的三个常用指令:Begin Transaction、Commit Transaction、Rollback Transaction
3、什么是视图?
视图实际上是在数据库中通过Select查询语句从多张表中提取的多个表字段组成的虚拟表。
视图不占用物理空间,所以通过视图查询出的记录并非存储在视图中,而是在原表中。
视图可以通过指定用户隐藏相应的表字段,起到保护数据的作用
在满足一定条件的情况下,可以通过视图对原表中的数据进行增删改。
创建视图时,只能使用单条select查询语句。
1、插入记录
通过视图插入数据与直接向表中插入数据一样,但通过视图插入数据时引用的字段为视图中的字段,和表中字段不一定完全相同,故有如下规则:
1)使用插入语句的用户必须拥有在基本表中插入数据的权限。
4)若视图中包含有统计函数结果或多个字段值的组合,操作失败。
5)若视图中使用了distinct,group by短句,操作失败。
7)对多表连接的视图来讲,一个插入语句只能对单独某个表的字段进行操作。
8)其他的遵守数据库插入语句标准
删除记录
同数据表的删除操作,但就注意如下:
1)通过视图删除数据将最终体现为从基表中删除数据。 当一个视图由两个以上基表构成时,不允许删除视图中的数据。
2)若视图中的字段是常数或统计结果的话,允许执行delete操作,但不允许insert或update操作。
4、什么是索引?
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可以快速访问数据库中的一些信息
索引分为:聚簇索引,非聚簇索引,唯一索引等
一张表可以包含多个唯一索引和非聚簇索引,但是更多的是一个聚簇索引
索引可以包含多列
合理的创建索引能够提高查询语句的执行效率,但是降低增加、删除的效率 同时消耗一定的物理空间。
mysql中的索引
mysql中普遍使用B+Tree做索引,但在实现上又根据聚簇索引和非聚簇索引而不同。
聚簇索引
所谓聚簇索引,就是指主索引文件和数据文件为同一份文件,聚簇索引主要用在Innodb存储引擎中。在该索引实现方式中B+Tree的叶子节点上的data就是数据本身,key为主键,如果是一般索引的话,data便会指向对应的主索引,如下图所示:
在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。做这个优化的目的是为了提高区间访问的性能,例如图4中如果要查询key为从18到49的所有数据记录,当找到18后,只需顺着节点和指针顺序遍历就可以一次性访问到所有数据节点,极大提到了区间查询效率。
非聚簇索
非聚簇索引就是指B+Tree的叶子节点上的data,并不是数据本身,而是数据存放的地址。主索引和辅助索引没啥区别,只是主索引中的key一定得是唯一的。主要用在MyISAM存储引擎中,如下图:
非聚簇索引比聚簇索引多了一次读取数据的IO操作,所以查找性能上会差。
性能比较
B-Tree:如果一次检索需要访问4个节点,数据库系统设计者利用磁盘预读原理,把节点的大小设计为一个页,那读取一个节点只需要一次I/O操作,完成这次检索操作,最多需要3次I/O(根节点常驻内存)。数据记录越小,每个节点存放的数据就越多,树的高度也就越小,I/O操作就少了,检索效率也就上去了。
B+Tree:非叶子节点只存key,大大滴减少了非叶子节点的大小,那么每个节点就可以存放更多的记录,树更矮了,I/O操作更少了。所以B+Tree拥有更好的性能。
5、什么是存储过程
存储过程是一个预编译的SQL语句,优点是允许模块化设计,就是只需设计一次,可以使用多次。简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能。
6、什么是触发器?
触发器是一种特殊的存储过程,主要是通过事件来触发而执行的,它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以级联运算,如,某表上的触发器有对另一个表的数据操作,而该操作会导致该表的触发器被触发。
10. 在关系型数据库中如何描述多对多的关系?
在关系型数据库中描述多对多的关系,需要建立第三张数据表。比如学生选课,需要在学生信息表和课程信息表的基础上,再建立选课信息表,该表中存放学生Id和课程Id。
11. 什么是数据库约束,常见的约束有哪几种?
数据库约束用于保证数据库表数据的完整性(正确性和一致性)。可以通过定义约束索引触发器来保证数据的完整性。
总体来讲,约束可以分为:
主键约束:primary key;
外键约束:foreign key;
唯一约束:unique;
检查约束:check;
空值约束:not null;
默认值约束:default
15. 什么是游标?
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录进行处理的机制。
游标的使用步骤:
- 定义游标:declare cursor 游标名称 for select查询语句 [for {readonly|update}]
- 打开游标:open cursor
- 从游标中操作数据:fetch... ... current of cursor
- 关闭游标:close cursor
16、drop,delete与truncate的区别
drop直接删掉表
truncate删除表中数据,再插入时自增长id又从1开始
delete删除表中数据,可以加where字句
17.内联接,外联接区别
内连接是保证两个表中所有的行都要满足连接条件,而外连接则不然。
在外连接中,某些不满条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行。分左连接、右连接、全连接三种
使用更加具体的文字形式进行描述
对于Table A
和Table B
,两者指定的公共列元组集合为COM
,其中Table A
中独有的公共列的元组集合为UA
,Table B
中独有的公共列元组集合为UB
。
左连接:A x B | (UA U
COM),B中不含有的值置为空,注意公共部分COM
需要进行求笛卡尔积
右连接:A x B | (UB U
COM),A中没有的值置为空,注意公共部分COM
需要进行求笛卡尔积
内连接:A x B | (COM),
全连接:A x B | (UB U
COM u UA),A或B中没有的值置为空,注意公共部分COM
需要进行求笛卡尔积
18. 锁:共享锁、互斥锁
两段锁协议:阶段1:加锁阶段 (生长阶段)阶段2:解锁阶段(半衰阶段)
加锁阶段:在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁,在进行写操作之前要申请并获得X锁。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。
解锁阶段:当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作。
两段封锁法可以这样来实现:事务开始后就处于加锁阶段,一直到执行ROLLBACK和COMMIT之前都是加锁阶段。ROLLBACK和COMMIT使事务进入解锁阶段,即在ROLLBACK和COMMIT模块中DBMS释放所有封锁。