1.三范式
第一范式:
如果关系模式R的每个关系r的属性值都是不可分的原子值,那么称R是第一范式的模式。(例如关系模R(Name,Address,Phone)如果一个人有两个电话号码,那么在关系中至少要出现两个元组,以便存储这两个号码)
第二范式:
如果R是1NF,且每个非主属性完全函数依赖于侯选键,那么称R是第二范式(2NF)的模式。(消除局部依赖)
补充:
侯选键:某个关系模式的属性集为U,x是U的一个子集.如果x->U在R上成立,那么称x是R的一个超键。如果x->U,但对于x的任一真子集x1都有x1->U不成立,则x是R上的一个候选键。
主属性与非主属性:如果A是关系模式R的候选键中的属性,那么称A是R的主属性;否则称A是R的非主属性。
举例:
设关系模式R(S#,C#,SCORE,T#,TITLE)的属性分别表示学生学号,选修课程的编号,成绩,任课教师工号和教师职称。(S#,C#)是R的侯选键。
分析:R上有两个FD:(S#,C#)->(T#,TITLE)和C#->(T#,TITLE),由此可见前一个依赖是局部依赖,所以不是2NF。如果把R分解成R1(C#,T#,TITLE)和R2(S#,C#,SCORE),此时R1和R2都是2NF模式。
第三范式:
补充:如果X->Y,Y->A,且Y推导不出X和A不属于Y,那么称X->A是传递依赖。
如果关系模式R是1NF,且每个非主属性都不传递依赖于R的侯选键,那么称R是第三范式的模式。
2.存储过程和函数的区别是什么?
解答:
存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程。而函数通常是数据库已定义的方法,它接受参数并返回某种类型的值,并且不涉及特定用户表。
3.游标的作用是什么?如何知道游标已经到了最后?
解答:
游标用于定位结果集的行。通过判断全局变量@@FETCH_STATUS可以判断其是否到了最后。通常此变量不等于0表示出错或到了最后
4.事务是什么?
解答:事务是作为一个逻辑单元执行的一系列操作。一个逻辑工作单元必须有4个属性,成为ACID(原子性,一致性,隔离性,持久性)。
原子性:事务必须是原子工作单元,即对其数据修改,要么全都执行,要么全都不执行。
一致性:一个事务独立执行的结果,应保持数据库的一致性,即数据不会因事务的执行而遭受到破坏。事务结束时,所有的内部数据结构(如B树索引或双向链表)都必须是正确的。
隔离性:多个事务并发执行时,系统应保证与这些事务先后单独执行时的结果一样。
持久性:一个事务一旦完成全部操作后,它对数据库的所有更新应永久地反映在数据库中。
5.数据库的并发控制(两种锁)
并发操作带来的三个问题:
1)丢失更新的问题(两个事务同时对一资源进行修改,在一事务还未提交时,另一事务进行修改,这样得到的最后结果是,仅仅保留了后一个事务对原数据的操作);2)读取脏数据(一事务对原数据进行了修改(此时在数据库中的值已经变为修改后的值),但是还未提交,这时又另一事务对该数据进行读取,但是后来,第一个事务进行了回滚操作,也就是原数据的值恢复到原值,但是第二个事务已经读了它修改后的值,这个值就成为脏数据。);3)不可重复读问题。(某一事务需要两次读取同一数据项A,但是在两次读操作的间隔中,另一事务T2改变了A的值。因此,该事务两次读了不同的值)
接下来引出两种锁(排他型锁X,共享型锁S)
排他型锁(X锁,写锁):从字面意思也可以看出,具有排他性,也就是如果事务T对某个数据加了X锁,那么在T对R解除封锁之前,不允许其他事务再对该数据添加任何类型的锁。(可以解决丢失更新的问题)
共享型锁(S锁,读锁):如果事务T对某数据加上S锁后,仍允许其他事务再对该数据加S锁,但在对该数据的所有S锁都解除之前决不允许任何事务对该数据加X锁 (S锁的引进是因为X锁的并发控制并发度低,只允许一个事务独锁数据,而其他申请封锁的事务只能排队去等。为此,降低要求,允许并发的读,就引入了共享型锁)
6.触发器
触发器是一个能由系统自动执行对数据库修改的语句。有时也称为主动规则或事件-条件-动作规则。
例子:下面是应用于选课关系SC的一个触发器。这个触发器规定,在修改关系SC的成绩值时,要求修改后的成绩一定不能比原来的低,否则就拒绝修改。
CREATE TRIGGER TRIG2 //说明触发器的名字为TRIG2 AFTER UPDATE OF SCORE ON SC //给出触发事件,即对关系C的成绩值修改后激活触发器。此处"After"为触发器动作时间,"update"为触发事件,"ON SC"短语命名了触发器的目标表 REFERENCING OLD AS OLDTUPLE//修改前的元组变量 NEW AS NEWTUPLE//修改后的元组变量 FOR EACH ROW //动作间隔尺寸,表示触发器对每一个修改的元组都要检查一次,如果没有这一行,则表示“FOR EACH STATEMENT”即只检查一次。 WHEN (OLDTUPLE.SCORE>NEWTUPLE.SCORE)//动作事件条件 UPDATE SC //接下来的都是动作体 SET SOCRE=OLDTUPLE.SCORE WHERE C#=NEWTUPLE.C#; //撤销时可用DROP TRIGGER TRIG2
7.什么叫做SQL注入式攻击?如何防范?
解答:所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造动态SQL,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。
防范:利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以。
过滤的方式:
1)。替换单引号。2)限制权限。3)用存储过程来执行所有查询,。。。不是很懂,后面就省略了。。。
8.聚集索引和非聚集索引
当文件中记录的数目和数据量很大时,查找速度会明显下降。为了提高速度,必须对文件建立索引。根据记录中某种排序顺序建立的索引,称为有序索引。
索引文件由两部分组成:索引和文件。由于主文件建立多,数据量大并且占据大量物理块,因此在主文件中查找,速度会很慢。如果对记录建立索引,那么相对主文件而言,索引空间小,因而查找速度就快。
顺序文件:在这种组织中,记录是按查找键值升序或降序的顺序存储的。
对顺序文件可以建立几套不同的索引。如果索引的查找键值的顺序与主文件的顺序一致,那么这种索引成为主索引,也称为聚集索引。(一般地,主索引的查找键往往是文件的主键) 如果查找键的值的顺序与主文件的顺序不一致,那么这种索引称为辅助索引,或非聚集索引。