一.范式:符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度。
1.第一范式
在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。
例如,学生信息表有如下属性值:
学生标示符 |
---|
201433 cht |
该表不满足第一范式。因为该属性值可以再分割变为:
学号 | 姓名 |
---|---|
201433 | cht |
简而言之,第一范式就是属性值不可分割。
2.第二范式
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。
简而言之,第二范式就是非主属性非部分依赖于主关键字。
例如,选课信息表
学生 | 课程 | 教师 | 教材 | 教师职称 |
---|---|---|---|---|
cht | 数据库系统 | fjl | 《数据库管理系统原理与设计》 | 教授 |
(学生、课程)才能确定这张表的唯一行。所以它是主属性。但是教材只与课程有关。教材并不依赖选课人。所以不满足第二范式。
又例如,一个关系模式为Y(X1,X2,X3,X4),假定该关系存在着如下函数依赖:(X1,X2)→X3,X2→X4,则该关系属于( 第一范式 )。
因为(x1,X2)可以当做主属性,但是X4却不是完全依赖(X1,X2),而只是依赖一部分。所以不符合第二范式。
3.第三范式
满足第三范式(3NF)必须先满足第二范式(2NF)。3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。也就是说,如果存在非主属性对于码的传递函数依赖,则不符合3NF的要求。
学生 | 课程 | 教师 | 教师职称 |
---|---|---|---|
cht | 数据库系统 | fjl | 教授 |
同样,主属性是(学生,课程),但是教师职称跟学生没关系。只和教师相关。因为(学生,课程)→教师,教师→教师职称,所以存在非主属性(教师职称)对于码的传递函数依赖,也就是非主属性(教师职称)依赖其他非主属性(教师),不满足第三范式。
某关系表有:员工(部门编号,部门名称,员工编号,姓名,性别,年龄),则其主码为(部门编号、员工编号)。
因为如果员工编号为主码,部门名称传递函数依赖于主属性,不满足第三范式。
简而言之,第三范式就是属性不依赖于其它非主属性。
4.BCNF
**BCNF范式是在 3NF 的基础上消除主属性对于码的部分与传递函数依赖。
也就是说所有属性(包括非键属性与键鼠性)不能依赖于非键属性。**
二. 索引
1.索引字段值不唯一,应该选择的索引类型为()
A.普通索引
B.候选索引
C.主索引
D.唯一索引
答案:A
解析:
①主索引:主索引是一种只能在数据库表中建立不能在自由表中建立的索引。在指定的字段或表达式中,主索引的关键字绝对不允许有重复值。
②候选索引:和主索引类似,它的值也不允许在指定的字段或表达式中重复。一个表中可以有多个候选索引。
③唯一索引:唯一索引允许关键字取重复的值。当有重复值出现时,索引文件只保存重复值的第1次出现。提供唯一索引主要是为了兼容早期的版本。
④普通索引:普通索引允许关键字段有相同值。在一对多关系的多方,可以使用普通索引。
2.常见索引分类如下:
b-tree索引
Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名。CREATE
INDEX语句时,默认就是在创建b-tree索引。没有特别规定可用于任何情况。位图索引(bitmap index)
位图索引特定于该列只有几个枚举值的情况,比如性别字段,标示字段比如只有0和1的情况。基于函数的索引
比如经常对某个字段做查询的时候是带函数操作的,那么此时建一个函数索引就有价值了。分区索引和全局索引
这2个是用于分区表的时候。前者是分区内索引,后者是全表索引反向索引(REVERSE)
这个索引不常见,但是特定情况特别有效,比如一个varchar(5)位字段(员工编号)含值(10001,10002,10033,10005,10016..)。这种情况默认索引分布过于密集,不能利用好服务器的并行,但是反向之后10001,20001,33001,50001,61001就有了一个很好的分布,能高效的利用好并行运算。HASH索引
HASH索引可能是访问数据库中数据的最快方法,但它也有自身的缺点。集群键上不同值的数目必须在创建HASH集群之前就要知道。需要在创建HASH集群的时候指定这个值。使用HASH索引必须要使用HASH集群。
三. 事务
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。是恢复和并发控制的基本单位。
事务是DBMS的基本单位,是构成单一逻辑工作单元的操作集合。
事务应该具有4个属性:原子性、一致性、隔离性、持续性。这四个属性通常称为ACID特性。
原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability):持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
四. 数据完整性
数据完整性可以分为四类:
1、实体完整性,指关系的主关键字不能重复也不能取空值。实体完整性的目的是确保数据库中所有实体的唯一性,也就是不应出现完全相同的数据记录。
2、区域完整性,是保证数据库字段取值的合理性。包括限制类型(数据类型),格式(通过检查约束和规则),可能值范围(通过外键约束,检查约束,默认值定义,非空约束和规则)。
3、参考完整性,也称“引用完整性”,是用来维护相关数据表之间数据一致性的手段,是定义建立关系之间联系的主关键字与外部关键字引用的约束条件。在删除和输入记录时,引用完整性保持表之间已定义的关系.引用完整性确保键值在所有表中一致.这样的一致辞性要求不能引用不存在的值.如果一个键值更改了,那么在整个数据库中,对该键值的引用要进行一致的更改。
4、用户自定义完整性,用户根据实际应用中的需要自行定义。用户定义完整性则是根据应用环境的要求和实际的需要,对某一具体应用所涉及的数据提出约束性条件。这一约束机制一般不应由应用程序提供,而应有由关系模型提供定义并检验,用户定义完整性主要包括字段有效性约束和记录有效性。
五. 语言
数据定义语言:DDL(data definition language)。负责数据的模式定义与数据的物理存取构建,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。
数据操纵语言:DML(data manipulation language)。负责数据的操纵,它们是UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言,增删查改。
数据控制语言:DCL(DataControlLanguage)。负责数据完整性、安全性的定义与检查以及并发控制、故障恢复等功能,用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。
六. 错题集
若要删除book表中的所有数据,如下哪些语法是错误的?()
A.drop table book;
B.truncate table book;
C.delete from book;
D.delelet *from book;
答案:AD
A: drop table book 是删除整个表,题目的潜在意思是删除表中的数据而并非删除整个表。因此A错。
B: truncate table book 是删除表中的数据,删除速度比delete更快,无法撤回(回退)。
C: delete from book 删除数据表中的数据,可以回退,可添加where 子句。
D:语法错误。查看Mysql表结构的命令,如下:
desc 表名;
show columns from 表名;
describe 表名;
show create table 表名;
use information_schema
select * from columns where table_name=’表名’;数据库系统的三级模式:概念模式、内模式、外模式。
关系数据模型的三个组成部分:关系的完整性约束、关系的数据操纵、关系的数据结构。
按照规范的设计方法,一个完整的数据库设计一般分为以下六个阶段:
⑴需求分析:分析用户的需求,包括数据、功能和性能需求;
⑵概念结构设计:主要采用E-R模型进行设计,包括画E-R图;
⑶ 逻辑结构设计:通过将E-R图转换成表,实现从E-R模型到关系模型 的转换;进行关系规范化。
⑷数据库物理设计:主要是为所设计的数据库选择合适的存储结构和存取路径;
⑸数据库的实施:包括编程、测试和试运行;
⑹数据库运行与维护:系统的运行与数据库的日常维护Mysql复制分成三步:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将改变反映它自己的数据。数据库应用系统中的核心问题是数据库的设计。
数据库运行于哪种状态下可以防止数据的丢失?
在archivelog mode只要其归档日志文件不丢失,就可以有效地防止数据丢失。在关系数据库中,用来表示实体间联系的是二维表。
关系模型实体间的敏感词采用二维表来表示,简称表。网状结构为网状模型实体间的敏感词,树状结构为层次模型实体间的敏感词,属性刻画了实体。应尽量避免在 where 子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10 union all select id from t where num=20
union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。union在对连接后的集合排序并去除重复项,union all保留重复项.所以union all更快。
表中删除主键为:
alert table table_test drop primary key;
表中增加主键为:
alert table table_test add primary key(id);
某查询语句运行后返回的结果集为:
1班 72
2班 75
3班 NULL
则最有可能的查询语句是:SELECT class, AVG(score) FROM test WHERE class<3 GROUP BY ALL class
Transact-SQL 在 GROUP BY 子句中提供 ALL 关键字。只有在 SELECT 语句还包括 WHERE 子句时,ALL 关键字才有意义。如果使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生的所有组,即使某些组没有符合搜索条件的行。没有 ALL 关键字,包含 GROUP BY 子句的 SELECT 语句将不显示没有符合条件的行的组。
sql顺序为:select, from, where, group by, having, order by, limit
关系数据库规范化的目的是为了解决关系数据库中的(插入、删除异常及数据冗余问题)
数据库恢复的基础是利用转储的冗余数据。这些转储的冗余数据包括(日志文件,数据库后备副本)
因复合索引为idx_A_B_C,所以查询条件只能是在a,ab,abc,ac才算 使用到索引idx_A_B_C
select into from 和 insert into select都是用来复制表,两者的主要区别为: select into from 要求目标表不存在,因为在插入时会自动创建。insert into select from 要求目标表存在。
if(条件,表达式1,表达式2) 如果条件为真(即不为0),执行表达式1,否则,执行表达式2.
select if(-1, 5, 2)
因为-1不为0,所以为真,返回5。
什么是索引:简单的来说,建立索引在进行数据库操作的时候不需要全盘一条条的扫描,删选出符合的记录,索引内部自己有一套优化算法,因此借助索引来对数据库进行操作可以提高查询的效率。
什么时候建立的索引将失效或效率不高(情况有很多,这里列举常见的几种, 假设在字段name上建立了索引):
- 使用了运算符!=,以及关键字not in, not exist等,认为产生的结果集很大,往往导致引擎不走索引而是走全盘扫描
- 对索引字段使用了函数,如where substr(name, 1, 3)=’mark’, 导致索引无效
- 使用like和通配符,第一个字符是%将导致索引失效,如where name like ‘%ark’
order by与索引
首先利用where进行数据查询,这一步是免不了的,至于这一步有没有利用索引暂时不考虑,关键是在获取所有符合的记录后还需要进行排序,看看order by是如何利用索引的。
如果order by中的字段有建立索引,同时:- 该字段没有出现在where中,则在排序的时候需要正常排序,默认order by是升序排序, 故索引没有对排序产生有利帮助 (B,C错误)
- 该字段同时同时出现在where中,则在获取记录后不进行排序,而是直接利用索引, 效率变高。(D正确)
# 与$的区别
#是把传入的数据当作字符串,如#user_id_list#传入的是1,2,则sql语句生成是这样,in (‘1,2’) ,
$传入的数据直接生成在sql里,如$user_id_list$传入的是1,2,则sql语句生成是这样,in(1,2).
\ #方式能够很大程度防止sql注入.
$方式无法方式sql注入.
$方式一般用于传入数据库对象.例如传入表名.
一般能用#的就别用$.
#str# 出来的效果是 ‘str’
\$str\$ 出来的效果是 str
成绩表中主键是“PK=科目代码”,所以科目代码要唯一;在数据库完整性里有说:外键必须可以找到或者为空,所以 B是可以的,而D为空,所以也满足。
加密与安全部分
MD5 是摘要算法不是加密算法,两者的本质区别是:摘要算法是单向的,即明文可以通过摘要算法生成摘要结果,但反之则不能通过摘要结果还原成明文。而加密算法是双向的,即可以从明文通过加密算法生成密文,反之也可以通过解密算法将密文还原成明文。 所以,摘要算法主要用来检查明文是否发生过变动,而加密算法则用来传递不能让第三方知晓的内容。
先于或随着操作系统的系统文件装入内存储器,从而获得计算机特定控制权并进行传染和破坏的病毒是(引导区型病毒 )。
对称加密算法: DES、 3DES、 AES、 Blowfish 、Twofish 、CAST5
非对称加密算法: DHA、 RSA 、EIGamal、DSA
信息摘要算法: MD5 、SHA1 、SHA512 、CRC-32RSA一般为1024或2048位;运行速度:RSA< AES;安全性依赖于大数分解;RSA非对称加密算法
有一种木马程序,其感染机制与 U 盘病毒的传播机制完全一样,只是感染目标计算机后它会尽量隐藏自己的踪迹,它唯一的动作是扫描系统的文件,发现对其可能有用的敏感文件,就将其悄悄拷贝到 U 盘,一旦这个 U 盘插入到连接互联网的计算机,就会将这些敏感文件自动发送到互联网上指定的计算机中,从而达到窃取的目的。该木马叫做( 摆渡木马)。
DNS欺骗就是攻击者冒充 域名服务器 的一种欺骗行为。 原理:如果可以冒充 域名服务器 ,然后把查询的IP地址设为攻击者的IP地址,这样的话,用户上网就只能看到攻击者的主页,而不是用户想要取得的网站的主页了,这就是DNS欺骗的基本原理。DNS欺骗其实并不是真的”黑掉”了对方的网站,而是冒名顶替、招摇撞骗罢了。
hosts文件篡改
Hosts文件是一个用于存储计算机网络中节点信息的文件,它可以将主机名映射到相应的IP地址,实现DNS的功能,它可以由计算机的用户进行控制。Hosts文件的存储位置在不同的操作系统中并不相同,甚至不同Windows版本的位置也不大一样:Windows NT/2000/XP/2003/Vista/win7:默认位置为%SystemRoot%\system32\drivers\etc\,但也可以改变。有很多网站不经过用户同意就将各种各样的插件安装到你的计算机中,其中有些说不定就是木马或病毒。对于这些网站我们可以利用Hosts把该网站的域名映射到错误的IP或本地计算机的IP,这样就不用访问了。在WINDOWSX系统中,约定127.0.0.1为本地计算机的IP地址, 0.0.0.0是错误的IP地址。如果,我们在Hosts中,写入以下内容:
127.0.0.1 # 要屏蔽的网站 A
0.0.0.0 # 要屏蔽的网站 B
这样,计算机解析域名 A和 B时,就解析到本机IP或错误的IP,达到了屏蔽网站A 和B的目的。本机DNS劫持
DNS劫持又称域名劫持,是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应,其效果就是对特定的网络不能反应或访问的是假网址。
域名解析的基本原理就是把域名翻译成IP地址,以便计算机能够进一步通信,传递内容和网址等。
由于域名劫持往往只能在特定的被劫持的网络范围内进行,所以在此范围外的域名服务器(DNS)能够返回正常的IP地址,高级用户可以在网络设置把DNS指向这些正常的域名服务器以实现对网址的正常访问。所以域名劫持通常相伴的措施–封锁正常DNS的IP。
如果知道该域名的真实IP地址,则可以直接用此IP代替域名后进行访问。比如访问百度,你可以直接用百度IP(202.108.22.5)访问。
简单的说就是把你要去的地址拦截下来,给你一个错误的地址,或者告诉你你要去的地方去不了,人为的导致你无法到达目的地,一般用于对一些不良网站的封杀或是一些黑客行为。DNS通讯包篡改
从过程控制的角度讲,我们只要有能力把针对dns询问包专门伪造的dns回复消息在恰当时刻通过一系列节点最终发送到victim那里就行。篡改dns包,可以利用专门的工具,也可以利用编程自己解决。
DES是数据加密标准,AES是高级加密标准
AES的区块长度固定为 128 比特,密钥长度则可以是 128 ,192或256比特
BlowFish算法使用两个“盒”——ungigned long pbox[18]和unsigned long sbox[4*256]