数据库系统概念
问:数据库管理系统的特点
数据库管理系统将具有一定结构的数据组成一个集合,它主要具有以下几个特点:
(1) 数据的结构化:数据库中的数据并不是杂乱无章、毫不相干的,它们具有一定的组织结构,属于同一集合的数据具有相似的特征。
(2) 数据的共享性:在一个单位的各个部门之间,存在着大量的重复信息。使用数据库的目的就是要统一管理这些信息,减少冗余度,使各个部门共同享有相同的数据。
(3) 数据的独立性:数据的独立性是指数据记录和数据管理软件之间的独立。数据及其结构应具有独立性,而不应该去改变应用程序。
(4) 数据的完整性:数据的完整性是指保证数据库中数据的正确性。可能造成数据不正确的原因很多,数据库管理系统通过对数据性质进行检查而管理它们。
(5) 数据的灵活性:数据库管理系统不是把数据简单堆积,它在记录数据信息的基础上具有很多的管理功能,如输入、输出、查询、编辑修改等。
(6) 数据的安全性:根据用户的职责,不同级别的人对数据库具有不同的权限,数据库管理系统应该确保数据的安全性。
问:数据模型
数据库是长期存储在计算机内有组织的大量的共享的数据集合。它可以供各种用户共享,具有最小冗余度和较高的数据独立性。数据库系统的核心和基础是数据模型。数据模型是对现实世界数据特征的抽象,是用来描述数据、组织数据和对数据进行操作的。根据模型应用目的的不同,数据模型可以分为两类,第一类是概念模型,第二类是逻辑模型和物理模型。
- 概念模型,也称信息模型,它是按用户的观点来对数据和信息建模,主要用于数据库设计。
- 第二类中的逻辑模型主要包括层次模型、网状模型、关系模型、面向对象模型和对象关系模型等。
- 第二类中的物理模型是对数据最底层的抽象,它描述数据在系统内部的表示方法和存取方法,在磁盘或磁带上的存储方式和存取方法,是面向计算机系统的。
一般来说,数据模型是严格定义的一组概念的集合。这些概念精确地描述了系统的静态特征、动态特征和完整性约束条件。因此数据模型一般由数据结构、数据操作和完整性约束三部分组成。
- 数据结构:存储在数据库中对象类型的集合,作用是描述数据库组成对象以及对象之间的联系。
- 数据操作:指对数据库中各种对象实例允许执行的操作的集合,包括操作及其相关的操作规则。
- 数据完整性约束条件:指在给定的数据模型中,数据及其联系所遵守的一组通用的完整性规则,它能保证数据的正确性和一致性。
问:关系数据模型
关系模型是目前最重要的一种数据模型。关系数据库系统采用关系模型作为数据的组织方式,在这些系统中,关系模型中数据的逻辑结构是一张二维表,或者说关系的数据结构就是一张表。
关系数据模型的数据操作主要包含查询、抽入、删除和更新数据。
关系模型的完整性约束包含:实体完整性、参照完整性和用户自定义的完整性。
问:关系数据库和非关系型数据库
(1) 关系型数据库
MS SQL Server、IBM DB2、Oracle、MySQL、Microsoft Access和PostgreSQL。
(2) 非关系型数据库 (NoSQL)
键值(Key-Value)存储数据库
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。
常见的键值存储数据库:Tokyo Cabinet/Tyrant,Redis,Voldemort,Oracle BDB.,Google BigTable,Amazon DynamoDB。
列存储数据库
这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。
常见的列存储数据库:Cassandra,HBase,Riak。
文档型数据库
文档型数据库的灵感是来自于LotusNotes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。
常见的文档型数据库:CouchDB, MongoDb。国内也有文档型数据库SequoiaDB,已经开源。
图(Graph)数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。
常见的图数据库:Neo4J,InfoGrid,Infinite Graph。
NoSQL数据库在以下的这几种情况下比较适用:
- 数据模型比较简单;
- 需要灵活性更强的IT系统;
- 对数据库性能要求较高;
- 不需要高度的数据一致性;
- 对于给定key,比较容易映射复杂值的环境。
问:ER模型
ER模型的基本元素是:实体、联系和属性
(1) 实体:是一个数据对象,指应用中可以区别的客观存在的事物。
(ER模型中的实体往往是指实体集)实体集:指同一类实体构成的实体集合,用矩形表示表示,矩形内注明实体名。
(2) 联系:表示一个或多个实体之间的关联关系。联系用菱形框表示,菱形框内注明联系名,并用无向边将与其相关的实体连接起来,同时在无向边旁标上联系的类型。
联系可分为以下3种类型:1对多联系,1对1联系和多对多联系
1对1联系(1:1): 例如,一个部门有一个经理,而每个经理只在一个部门任职,则部门与经理的联系是一对一的。
一对多联系(1:N): 例如,某校教师与课程之间存在一对多的联系”教”,即每位教师可以教多门课程,但是每门课程只能由一位教师来教。
多对多联系(M:N): 例如,学生与课程间的联系(“学”)是多对多的,即一个学生可以学多门课程,而每门课程可以有多个学生来学。
(3) 属性:实体的某一特性称为属性,属性用椭圆形框表示,加下划线的属性为主属性。
例1:教学管理的一个可能设计的ER图
教学管理的一个可能设计的ER图
问:主键与外键
若关系(二维表)中的某一属性组的值能唯一标识一个元组,则称该属性组为候选码。若个表中有多个候选码,则可选定其中一个为主键。
候选码的各个属性称为主属性。不包含在任何候选码中的属性称为非主属性或非码属性。
如果关系模式R1中的某属性集不是R1的主键,并且该属性集是另一个关系R2的主键,则该属性集是关系模式R1的外键。由此可见,外键表示了两个关系(表)之间的联系。以另一个关系的外键作主键的表被称为主表(R2),具有此外键的表被称为主表的从表(R1),外键又称为外关键字。
问:完整性约束
主键的设置是为了强制表的实体完整性,外键的设置是为了强制表之间的参照完整性。
(1) 关系模型的实体完整性约束
若属性(指一个或一组属性)A是基本关系R的主属性,则A不能取空值。由此约束可得一直接结论:主键不能为空。
(2) 关系模型的参照完整性约束
若属性(或属性组)F是某基本关系R1的外键,且它与基本关系R2的主键相对应,则对于R1中,每个F上的值或为空值或者等于R1中的主键值。
(3) 关系模型的用户自定义完整性约束
例1:下列哪种完整性约束中,将每一条记录定义为表中的惟一实体,即不能重复
A. 域完整性 B. 引用完整性 C. 实体完整性 D. 其他
答案: C。
问:关系代数
关系代数是关系数据库系统查询语言的理论基础,包括:并、交、差、乘、选择、投影、联接、除、自然联接等操作。
设有关系模式R(a,b,c,d,),与关系代数表达式σ3<'4'(R)等价的SQL语句为:select * from R where c<'4';
问:常见的SQL语句
SQL语句功能极强,包括数据定义(create、 drop和alter)、数据操纵(insert,update和delete)、数据查询(select)、数据控制(grant和revoke)。
例1:ANSI SQL语句的分类
(1) 数据定义
创建表:SQL语言使用create table
语句定义表,其基本格式如下:
create table <表名>(
<列名> <数据类型> [列级完整性约束条件]
[, <列名> <数据类型> [列级完整性约束条件]]
...
[, <表级完整性约束条件>]);
例1:建立一个”学生信息”表Student:
create table Student(
Sno char(9) primary key,
Sname char(20) unique,
Ssex char(2),
Sage smallint,
Sdept char(20)
);
修改表:随着应用环境和应用需求的变化,有时需要修改已建立好的表,SQL语言用alter table
语句修改表,其一般格式为:
ALTER TABLE <表名>
[ADD <新列名> <数据类型> [完整性约束]]
[DROP <完整性约束名>]
[MODIFY COLUMN <列名> <数据类型>]
其中,<表名>是要修改的表,ADD子句用于增加新列和新的完整性约束条件,DROP子句用于删除指定的完整性约束,MODIFY COLUMM子句用于修改原有的列定义,包括修改列名和数据类型。
例2:向Student表增加”入学时间”列,其数据类型为日期类型。
alter table Student add Sentrance date;
上述代码不论Student表中原来是否已有数据,新增加的列一律为空值。
例3:删除Student表中”年龄”列
alter table Student drop column Sage;
删除列可以省略column
例4:要求将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数。
alter table Student modify column Sage int;
例5:增加Student表Sname必须取唯一值的约束条件。
alter table Student add unique(Sname);
删除表:当某个表不再需要时,可以使用drop table
语句删除它。其一般格式为:
DROP TABLE <表名> [RESTRICT | CASCADE];
若选择RESTRICT,则该表的删除是有限制条件的:欲删除的表不能被其他表的约束所引用(如check,foreign key等约束),不能有视图,不能有触发器,不能有存储过程或函数等。如果存在这些依赖该表的对象,则此表不能被删除。
若选择CASCADE,则该表的删除没有限制条件。在删除该表的同时,相关的依赖对象,例如视图,都将被一起删除。
例6:删除Student表
drop table Student cascade;
(2) 数据操纵
数据操纵操作有3种:向表中添加若干行数据、修改表中的数据和删除表中的若干行数据。
插入元组:插入元组的INSERT语句的格式为:
INSERT INTO table (fieldl, field2 ...) VALUES(valuel, value2..);
其功能是将新元组插入到指定表中,其中新元组的field1的值为value1, field2的值为value2…。
如果INTO语句中没有指定任何属性列名,则新插入的元组必须在每个属性列上均有值。
例1:将一个新学生元组(学号:201009014,姓名:Wang,性别:女, 所在系:MA,年龄:21)插入到Student表中
insert into Student(Sno, Sname, Ssex, Sdept, Sage) values ('201009014', 'Wang', 'F', 'MA', 21);
修改数据:修改数据又称为更新操作,其语句的一般格式为:
UPDATE table SET fieldl=valuel, field2=value2 WHERE 范围
其功能是修改指定表中满足WHERE子句条件的元组。其中SET子句给出的value值用于取代相应的属性列值。如果省略WHERE子句,则表示要修改表中的所有元组。
例2:将学生201009013的年龄改为22岁
update Student set Sage=22 where Sno='201009013';
删除数据:删除语句的一般格式为:
DELETE FROM tabIe WHERE范围;
DELETE语句的功能是从指定表中删除满足WHERE子句条件的所有元组。如果省略WHERE子句,表示删除表中全部元组,但表仍存在。
删除表中的所有行(truncate和delete的区别,这里尚未整理)
truncate table TABLE_NAME; (不可恢复)
例3:删除学号为201009020的学生记录
delete from Student where Sno='201009020';
(3) 数据查询
数据库查询是数据库的核心操作。SQL提供了select
语句进行数据库的查询,其一般格式为:
SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>] ...
FROM <表名或视图名> [,<表名或视图名>] ...
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC | DESC]];
整个SELECT语句解析顺序:FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY
整个SELECT语句的含义
- 根据WHERE子句的条件表达式,从FROM子句指定的表或视图中找出满足条件的元组,再按SELECT子句中的目标列表达式,选出元组中的属性值形成结果表。
- 如果有GROUP BY子句,则将结果按<列名1>的值进行分组,该属性值相等的元组为一个组。通常会在每组中使用聚集函数。如果GROUP BY子句带HAVING子句,则只有满足指定条件的组才会被输出。
- 如果有ORDER BY子句,则结果表还要按<列名2>的值的升序或降序排序。
选择表中的若干列
例1:在表Student中查询名为Wang
的学生信息
select * from Student where Sname='Wang';
例2:在表Student中,查询名字中有ang
的学生信息
select * from Student where Sname like '%ang%';
上述%是通配符,代表任意长度(可为0)的字符串。例如a%b表示以a开头,以b结尾的任意长度的字符串。除此之外,_(下画线)代表任意单词字符。
例3:在表Student中查询年龄在20-22岁(包括20岁与22岁)之间的学生的信息
select * from Student where Sage between 20 and 22;
与BETWEEN...AND...相对的谓词是NOT BETWEEN...AND...
例4:在表Student中查询计算机系(CS)、信息系(MA)和和物理系(PH)学生的姓名和性别
select Sname, Ssex from Student where Sdept in ('CS', 'MA', 'PH');
与IN相对的谓词是NOT IN,用于查找属性值不属于指定集合的元组。
例5:在表Student中查询没有年龄信息的学生
select * from Student where Sage is null;
注意这里的"is"不能被等号代替。
order by子句
用户可以用order by子句对查询的结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,默认值为升序。
例6:在表Student中,按学生的年龄值升序检索出全部学生的信息
select * from Student order by Sage;
在表Student中先按专业升序排序,然后同一专业的学生再按年龄降序排序,并输出全部学生信息
select * from Student order by Sdept, Sage desc;
limit子句
limit主要是用于查询之后显示返回的前几条或者中间某几条数据。
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset;
LIMIT子句可以被用于强制SELECT语句返回指定的记录数。
LIMIT接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是0(而不是1)。
例7:从Student表中检索出第3到第7条记录,共5条记录
select * from Student limit 2, 5;
例8:从Student表中检索出前2条记录
select * from Student limit 2;
换句话说,LIMIT n等价于LIMIT 0, N
聚集函数
SQL语句中的常用聚集函数有以下几种:count,sum,avg,max,min。用法如下:
总数: select count(*) as totalcount from table;
求和: select sum(field) as sumvalue from table;
平均: select avg(field) as avgvalue from table;
最大: select max(field) as maxvalue from table;
最小: select min(field) as minvalue from table;
GROUP BY子句
GROUP BY子句根据一个或多个属性的值来对元组进行分组,值相等的为一组。
对查询结果分组的目的是为了细化聚集函数的作用对象,分组后聚集函数将作用于每一个组,即每一组都有一个函数值。
例9:查询Student表中具有相同年龄的每个组的人数
select Sage, count(*) from Student group by Sage;
如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则使用HAVING短语指定筛选条件。通常,HAVING子句只用在GROUP BY子句的SQL语句中,用来选取符合指定条件的分组。
例10:查询Student表中每种年龄的人数大于1的年龄与人数信息
select Sage, count(*) from Student group by Sage having count(*) > 1;
连接查询
前面的查询都是针对一个表进行的。若一个查询同时涉及两个以上的表,则称之为连接查询。
例11:若有表Student(学生信息表)、SC(选课表),要求查询每个学生及其选修课程的情况:
select Student.*, SC.* from Student, SC where Student.Sno=SC.Sno;
在以上的连接操作中,只有满足条件的元组才能作为结果输出。
若表Student中某些学生没有选课,则在SC表中没有相应的元组,造成最终结果中舍弃掉了这些学生的信息。
上述连接称为自然连接、内连接。有时想以Student表为主体列出每个学生的基本情况及其选课情况。若某个学生没有选课,依然将其保存到结果中(在SC表的属性上填空值),这时就需要使用外连接。
select Student.*,SC.* from Student left join SC on (Student.Sno=SC.Sno);
以上是左外连接,左外连接列出左边表(本例为Student表)中的所有元组,右外连接列出右表关系中所有的元组。
例13:一道综合题
设有学生信息表s(sno, sname),其属性分别表示学号,姓名;课程信息表c(cno, cname),其属性分别表示课程号、课程名称;选课信息表sc(sno, cno, grade),其属性分别表示学号、课程号和成绩。
1) 问选修课程”db”的学生学号
select sc.sno from sc, c where sc.cno=c.cno and c.cname='db';
2) 平均成绩最高的学生学号
select sno, avg(grade) as g from sc group by sno order by g desc limit 1;
3) 每科大于90分的人数
select cno, count(sno) from sc where grade>90 group by cno;
4) 列出既学过”math”,又学过”english”的所有学生学号、姓名
select s.sno, s.sname from s, (select sc.sno from sc, c where sc.cno=c.cno and c.cname in('math', 'english')
group by sno having count (distince c.cno)=2) x
where s.sno=x.sno;
5) 列出有两门以上(含两门)不及格课程(成绩小于60)的学生学号、姓名及其平均成绩
select s.sno, s.sname,avg(sc.grade) as avggrade from s, sc, (select sno from sc where grade<60 group by sno having count (distince cno)>=2) x
where s.sno=x.sno and sc.sno=x.sno
group by s.sno;
6) 列出”math”课程成绩比”english”课程成绩高的所有学生的姓名
select s.sname, from s, (select sno, grade from sc where cno in (select cno from c where cname='math')) A, (select sno, grade from se where cno in (select cno from c where cname=’english')) B
where s.sno=A.sno and s.sno=B.sno and A.grade>B.grade;
(4) 数据控制
授予权限
grant [权限] on [table] to 'username'@'localhost';
例1:使用sql语句中为用户zhangsan分配数据库userdb表userinfo的查询和插入数据权限
grant select,insert on userdb.userinfo to'zhangsan'@'localhost'
问:视图
视图是从一个或几个表(或视图)导出的表。它与表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的表中。所以表中的数据发生变化时,从视图中查询出的数据也就随之发生改变了。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。
例1:在学生表Student的基础上,创建一个计算机系学生的视图
create view cs_student as
select sno, sname from Student where Sdept='CS';
视图一经定义,就可以和基本表一样被查询、被删除。
例2:若要求进行修改和插入操作时,仍需保证该视图中只有计算机系的学生:
create view cs_student as
select sno, sname from Student where Sdept='CS' with check option;
例3:删除视图的语句为:
drop view cs_student;
问:SQL约束
- NOT NULL:控制字段的内容不能为空(NULL)。
- UNIQUE:控制字段的内容不能重复,一个表允许有多个Unique约束。
- PRIMARY KEY:控制字段的内容不能重复,即它在一个表中只允许出现一个。
- FOREIGN KEY:FOREIGN KEY约束用于预防破坏表之间连接的动作,FOREIGN KEY约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
- CHECK:用于控制字段的值范围。
- DEFAULT:用于设置新记录的默认值。
问:SQL的匹配模式
(1) %表示匹配0个或多个字符
select * from user where name LIKE '%三%';
将会把name为"张三"、"三脚猫"、"唐三藏"等等有"三"的全找出来。
%三:表示左匹配; 三%:表示右匹配; %三%:表示模糊查询。
(2) _表示匹配单个任意字符
select * from user where name LIKE '_三_';
只找出"唐三藏"这样name为三个字且中间一个字是"三"的;
select * from user where name LIKE '三__';
只找出"三脚猫"这样name为三个字且第一个字是"三"的
(3) [ ]表示匹配括号内所列字符中的任意一个
select * from user where name LIKE '[张李王]三';
将找出"张三"、"李三"、"王三"(而不是"张李王三");
如[]内有一系列字符(01234、abcde之类的),则可略写为"0-4"、"a-e"。
select * from user where name LIKE '老[1-9]';
将找出"老1"、"老2"、……、"老9";
如要找"-"字符,请将其放在首位:'张三[-1-9]';
(4) [^ ]表示匹配不在括号所列字符内的单个任意字符
select * from user where name LIKE '[^张李王]三';
将找出不姓"张"、"李"、"王"的"赵三"、"孙三"等
select * from user where name LIKE '老[^1-4]';
将排除"老1"到"老4",寻找"老5"、"老6"、"老9"、……
问:查看Mysql表结构的命令
- desc 表名;
- show columns from 表名;
- describe 表名;
- show create table 表名;
- use information_schema
- select * from columns where table_name=’表名’;
问:union操作符
SQL union语法: select COLUMN_NAME(S) from TABLE_NAME1 union select COLUMN_NAME(S) from TABLE_NAME2;
union操作符用于合并两个或多个select语句的结果集。请注意,union内部的select语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每条select语句中的列的顺序必须相同。默认地,union操作符会剔除重复的结果。如果要允许重复的值,请使用union all。
问:从表TABLE_NAME中提取前10条记录
Sql server: select TOP N * from table_name.
MySQL: select * from table_name limit 0,10;
Oracle: select * from table_name where rownum<=10
问:MySQL中的”空值”和”NULL”
问:索引
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
为表设置索引是要付出代价的:一是增加了数据库的存储空间;二是在插入和修改数据时要花费较多的时间维护索引。
例1:创建索引和删除索引
(1) 在表Student(学生信息表)上按Sno(学号)降序建唯一索引Stusno
create unique index Stusno ON Student(Sno desc);
(2) 删除Student表的索引Stusno
alter table Student drop index Stusno;
注意:以上代码在MySQL数据库上调试通过,下文代码也都是在MySQL上运行的。
例2:数据库中索引的作川是什么?什么情况下适合建立索引以及什么情况下不适合建立索引?(2011·浙商银行)
解答:创建索引可以大大提高系统的性能。
(1) 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
(2) 可以大大加快数据的检索速度,这也是创建索引的最主要原因。
(3) 可以加速表和表之间的连接,特别是在实现数据的参照完整性方面特别有意义。
(4) 在使用分组(group by)和排序(order by)子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
(5) 通过使用索引,可以在查询的过程中,使用查询优化器,提高系统的性能。
那么索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这是因为增加索引也有许多不利的方面。
(1) 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
(2) 索引需要占用物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
(3) 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。
一般来说,应该在这些列上创建索引:
(1) 在经常需要搜索的列上创建索引,可以加快搜索的速度;
(2) 在作为主键的列上创建索引,强制该列的唯一性和组织表中数据的排列结构;
(3) 在经常用在连接的列上创建索引,这些列主要是一些外键,可以加快连接的速度;
(4) 在经常需要根据范围进行搜索的列上创建索引,囚为索引已经排序,其指定的范围是连续的;
(5) 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间:
(6) 在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
同样,对于有些列不应该创建索引。一般来说,不应该创建索引的这些列具有下列特点:
(1) 对于那些在查询中很少使用的列不应该创建索引。这是因为,既然这些列很少使用到,因此有无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度,增大了空间需求。
(2) 对于那些只有很少数据值的列也不应该创建索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占据了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
(3) 对于那些定义为text和bit等数据类型的列不应该创建索引。这是因为,这些列的数据量要么相当大,要么取值很少,不利于使用索引。
(4) 当修改操作远远大于检索操作时,不应该创建索引。这是因为,修改性能和检索性能是互相相矛盾的。当增加索引时,会提高检索的性能,但是会降低修改的性能。当减少索引时,会提高修改的性能,降低检索的性能。因此,当修改操作远远多于检索操作时,不应该创建索引。
问:范式理论 待完善
(1) 第一范式(1NF)
定义:如果关系模式R的每个关系r的属性都是不可分的数据项,那么就称R是第一范式的模式。 简单的说,每一个属性都是原子项,不可分割。
1NF是关系模式应具备的最起码的条件,如果数据库设计不能满足第一范式,就不称为关系型数据库。关系数据库设计研究的关系规范化是在1NF之上进行的。
例如(学生信息表):
学生编号 姓名 性别 联系方式
20080901 张三 男 email:zs@126.com,phone:88886666
20080902 李四 女 email:ls@126.com,phone:66668888
以上的表就不符合第一范式:联系方式字段可以再分,所以变更为正确的模式是:
学生编号 姓名 性别 电子邮件 电话
20080901 张三 男 zs@126.com 88886666
20080902 李四 女 ls@126.com 66668888
(2) 第二范式(2NF)
定义:如果关系模式R是1NF,且每个非主键属性完全函数依赖于候选键,那么就称R是第二范式。 简单的说,第二范式要满足以下的条件:首先要满足第一范式,其次每个非主键属性要完全函数依赖于候选键,或者是主键。也就是说,每个非主属性是由整个主键函数决定的,而不能由主键的一部分来决定。
例如(学生选课表):
学生 课程 教师 教师职称 教材 教室 上课时间
李四 Spring 张老师 java讲师 《Spring深入浅出》 301 08:00
张三 Struts 杨老师 java讲师 《Struts in Action》 302 13:30
这里通过(学生,课程)可以确定教师、教师职称、教材、教室和上课时间,所以可以把(学生,课程)作为主键。但是,教材并不完全依赖于(学生,课程),只拿出课程就可以确定教材,因为一个课程一定指定了某个教材。这就叫不完全依赖,或者部分依赖。出现这种情况,就不满足第二范式。
修改后,选课表:
学生 课程 教师 教师职称 教室 上课时间
李四 Spring 张老师 java讲师 301 08:00
张三 Struts 杨老师 java讲师 302 13:30
课程表:
课程 教材
Spring 《Spring深入浅出》
Struts 《Struts in Action》
所以,第二范式可以说是消除部分依赖。第二范式可以减少插入异常,删除异常和修改异常。
(3) 第三范式(3NF)
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。
问:数据库事务的四大特性:
数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做要么全不做,是一个不可分割的工作单位。
数据库事务的四大特性是:原子性、一致性、独立性和持久性,简称ACID。
(1) 原子性(Atomicity)
事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。
例如银行取款事务分为2个步骤(1)存折减款(2)提取现金。不可能存折减款,却没有提取现金。2个步骤必须同时完成或者都不完成。
(2) 一致性(Consistency)
事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。
例如完整性约束a+b=10,一个事务改变了a,那么b也应随之改变。
(3) 独立性(Isolation)
分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。假如并发交叉执行的事务没有任何控制,操纵相同的共享对象的多个并发事务的执行可能引起异常情况。
(4) 持久性(Durability)
持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,即对已提交事务的更新能恢复。持久性通过数据库备份和恢复来保证。
DBMS中实现事务持久性的子系统是:恢复管理子系统。
问:数据库事务隔离级别
数据库事务的隔离级别有4个,由数据库系统实现,从低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
问:
数据库恢复的基础是利用转储的冗余数据。这些转储的冗余数据包括:日志文件,数据库后备副本