数据库(做题)
Posted 顾九七
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库(做题)相关的知识,希望对你有一定的参考价值。
该文章不适合学习数据库,适合考证,遇到实际问题的,不要在这儿浪费时间。切记切记
软考之数据库
数据与信息之间的关系可表示为:信息= 数据+数据处理。
模型是对现实世界的模拟和抽象。数据库技术中,表示实体类型和实体类型间关系的模型称为数据模型。分为概念数据模型、结构数据模型。
一、概念数据模型(下午题常考)
用于信息世界建模,一般用实体-联系方法(E-R图)表示。常用术语:
-
实体:用矩形表示
-
属性:一个实体有多个属性;用椭圆形表示
-
码:唯一标识实体的属性集
-
域:属性取值范围,比如性别(男,女)
-
联系: 用菱形表示
种类包含:实体与实体间的联系;实体内部的联系
类型包含:一对一;一对多;多对多
无向边将实体、属性、联系起来。
二、结构数据模型
结构数据模型是直接面向数据库的逻辑结构,主要包括:层次(树结构)、网状(图结构)、关系和面向对象模型。
关系模型
是一种用二维表格结构来表示实体以及实体之间联系的数据模型。每个二维表由行、列组成,也可称为关系,关系模式是对关系的描述,可以说关系模型是关系模式的集合。
1、关系模型中基本术语
-
关系:一张表即为一个关系,表名就是关系名
-
元组:一条数据就是一个元组,对应存储文件中的一个记录值
-
属性:表中的每一列就是一个属性,列名即属性名,属性值相当于记录中的数据项或字段值
-
域:属性的取值范围
-
关系模式:对关系的描述,由关系名和属性名组成,格式如下:关系名(属性名1,属性名2…属性名n)
常见的关系模式格式为 R(U,F)。 R为关系名 U为关系中的属性 F为属性间的函数依赖,具体见【函数依赖】
通常一个关系模式对应一个关系文件的结构。五码
- 候选码(或候选键):属性或者属性组合,可唯一标识某个元组
- 主码(或主键):多个候选码中,选择一个作为主码,单个即可表示一个元组的属性
- 主属性:包含在任何候选码中的属性称为主属性,否则称为非主属性。
- 外码(或外键):如果一个关系中的属性或属性组并非该关系的码,而是另一个关系的码,称为该关系的外码。可指定到另一个表。
- 全码(或全键):关系中的所有属性组成的属性组是这个关系模式的候选码,称为全码
- 超码(或超键):一个包含码的属性集称为超码。
2、关系模型中的关系完整性约束
关系模型由关系数据结构、关系操作集合和关系完整性约束组成。
- 实体完整性:主码不可为空或部分为空(对于主码组合来说)。
- 参照完整性:关系R的外码X对应关系T的主码的话,外码X的每个值都要在关系T中的主码中找到或者外码X为空
- 用户定义的完整性:指用户对某一具体数据指定的约束条件进行检验
3、关系代数(重要)
(1)关系代数运算符
- 集合运算符:并( ⋃ \\bigcup ⋃)、差(-)、交( ⋂ \\bigcap ⋂)、笛卡尔积( × \\times ×)
- 专门的关系运算符:选择( σ \\sigma σ)、投影( π \\pi π)、连接($$)、除( ÷ \\div ÷)
- 逻辑运算符:非、与( ⋀ \\bigwedge ⋀)、或( ⋁ \\bigvee ⋁)
- 比较运算符:大于(>)、大于等于( ≥ \\geq ≥)、小于(<)、小于等于( ≤ \\leq ≤)、等于(=)、不等于( ≠ \\not= =)
(2)集合运算符
- 并:关系R与关系S所有元组合并,删除重复元组,组成的新关系,即为R ⋃ \\bigcup ⋃S
- 差:关系R中除去关系S中的元组,即为R-S
- 交:既属于关系R,又属于关系S的元组,组成的新关系,即为R
⋂
\\bigcap
⋂S。R
⋂
\\bigcap
⋂S = R-(R-S)
元组数:R有m个元组,S有n个元组,两者有k个元组相同
R ⋃ \\bigcup ⋃S: m+n-k
R-S: m-k
R ⋂ \\bigcap ⋂S: k - 笛卡尔积:R中的每一元组与S的每一元组相乘。新关系的列数为n+m,行数为n*m。
(3)专门的关系运算符
投影
从关系的垂直方向进行运算,在关系R中选出若干属性组成的新关系。
选择
从关系的水平方向进行运算,在关系R中选出符合条件的元组组成的新关系。
列也可用数字来表示,如果上面的5没带引号,表明是第5列。
连接(这个地方,连接的符号是真没找到怎样表示,麻烦知道的授教,多谢)
连接又分为
θ
\\theta
θ连接、等值连接、自然连接
-
θ \\theta θ连接:关系R和关系S的笛卡尔积中找到符合条件的元组形成的新关系
-
等值连接: θ \\theta θ为等号时,找到关系R和关系S的笛卡尔积中的元组形成的新关系
上方的例子中,当R.A = S.B时,就是等值连接了。 -
自然连接:找到两关系的笛卡尔积中相同属性列相同的元组,且去除重复列形成的新关系,若有多个相同属性,条件之间的关系为“并且”.
左连接、右连接、全连接(考的几率小)
左连接:左侧关系元组全部保留,右侧关系无对应元组的属性,用Null代替。这会使右侧关系的无对应元组丢失。
右连接:右侧关系元组全部保留,左侧关系无对应元组属性用null代替。这会使左侧关系中无对应元组丢失。
全连接:左右侧关系元组全部保留,两侧无对应的元组属性都用Null代替。这个是为了不丢失两关系中的元组。
除(考的几率小)
步骤:
1、找到左侧关系A中与右侧关系B的相同属性,形成新元组C。
2、找到关系C中与关系B值相同的元组,为A ÷ \\div ÷B的值
(4)运算符转sql
对于已工作的人就分分钟的事了,不详细写了哈,很容易
投影:即select语句的属性列
选择:即select语句的条件,where后面的
笛卡尔积:from表直接 R,S 即可
自然连接:自然连接可以转成投影、选择、笛卡尔积的式子,按上面的来就可以。自然连接要注意共同属性值相等这个条件欧
三、三级模式和两级映像
存在多种数据库语言,支持不同数据模型,数据的存储结构也不相同,但体系结构上基本都具有“三级模式、两级映像”的特征。
1、三级模式
- 外模式(对应视图)
- 概念模式,常称模式(对应基本表)
- 内模式(对应存储文件)
2、两级映像
- 外模式/模式映像:保证了数据的逻辑独立性
- 模式/内模式映像:保证了数据的物理独立性
四、SQL语言(重要)
1、SQL语言分类
(1)数据定义语言(DDL)
常见于create、alter、drop
// 建表
create table user (
id integer,
username string,
);
// 修改
alter table user add age integer;
alter table user alter username char(5); // 分数据库,有的是modify
alter table user drop username;
// 删除
drop table user;
完整性约束
- 列完整性约束
create table user (
id integer not null unique,
username string not null default '数据库',
);
- 表完整性约束
create table user (
id integer not null unique,
username string not null default '数据库',
cid unique,
primary key(id), // 主键
foreign key(cid) references class(id)
);
- 自定义完整性约束
create table user (
id integer not null unique,
username string not null default '数据库',
cid unique,
primary key(id), // 主键,实体完整性
foreign key(cid) references class(id),// 参照完整性
check (id >0 and cid >0) // 用户定义的完整性
);
(2)数据操作语言(DML)
常见于insert 、delete、update
user(id,username,age)
// 插入
insert into user(username,age) values('生活',3728272);
insert into user values(112,'远方',728);
// 更新
update user set username = '诗' where age = 728;
update user set username = '诗',id = 273 where age = 728;
// 删除
delete from user where id = 728;
(3)数据查询语言(DQL)
常见于select
select * from user;
select username from user;
select distinct username from user; // 去除重复元组
select username as '用户名' from user;
select * from user where id in (112,121,113); // 112或是121或是113
select * from user where id not in (112,121,113);
select * from user where id between 30 and 40;
select * from user where username like '%生%'; // 百分号表示可补充任意长度字符
select * from user where username like '生_'; // 下划线表示可补充一个长度的字符
select * from user where username not like '生_';
select * from user where username like '生_' and id = 112;
select * from user where username like '生_' or id = 112;
select * from user where id is null;
select * from user where id is not null;
select * from user where id order by id asc; // 默认,order by必须是select命令的最后一个子句
select * from user where id order by id desc;
// 聚合函数
select AVG(id) from user; // 平均值
select COUNT(*) from user; // 求数量
select MAX(id) from user; // 最大值
select MIN(id) from user; // 最小值
select SUM(id) from user;//总和
// 数据分组,聚合函数在与其他字段同时查询时,会报错
select user_id,SUM(成绩) from score group by user_id; // 按用户分组求每个用户id的成绩和
select user_id,name,SUM(成绩) from score group by user_id,name;
// 条件中要使用聚合函数时,用having
select 学号 from score where 分数 is not null group by 学号 having MIN(分数)>70 and MAX(分数) <90;
(4)内连接
select s.score from user u inner join score s on u.id = s.user_id where .....
// 等值连接
select u.user_name from user u,score s where u.id = s.user_id;
// 非等值连接
select u.user_name from user u,score s where s.score between AVG(s.score) and MAX(s.score);
// 自连接
select x.user_name,x.age,x.sex from user x,user y where x.number = '2222' and x.age > y.age
(5)外连接
// 左连接,会显示左侧表所有的数据,右侧表不匹配数据丢失
select u.* from user u left join score s on s.user_id = u.id;
// 右连接,会显示右侧表所有的数据,左侧表不匹配数据丢失
select s.* from user u right join score s on s.user_id = u.id;
// 全连接
select s.* from user u full join score s on s.user_id = u.id;
(6)子查询
select * from user u where u.id in (select s.user_id from score where score >90)
// ANY,大于任何一个都显示
select * from user where age > ANY(select age from user where sex= 1);
// ALL,比最大的还大才显示
select * from user where age > ALL(select age from user where sex= 1);
// 相关子查询,一个字段既做条件也做结果值
select score,class from class a where score > (select AVG(score) from class b where a.class = b.class)
// exist
select * from user u where exist (select score from score s where u.is = s.user_id);
// not exist
select * from user u where not exist (select score from score s where u.is = s.user_id);
(7)并交差
// 并 UNION。两个sql语句中的数据都显示
select 姓名,年龄 from teacher
UNION
select 姓名,年龄 from student
// 交 INTERSECT。两个sql语句中相同的数据显示
select 姓名,年龄 from teacher
INTERSECT
select 姓名,年龄 from student
// 差 EXPECT。从第一个结果中去除第二个结果中的值
select 姓名,年龄 from teacher
EXPECT
select 姓名,年龄 from student
(8)数据控制语言(DDL)
指对权限的控制,权限又分为表和库
// 授权
grant update(name) on table user to user1 with grant option;
grant select on table user,score to user1 ,user2;
grant all privileges on table user to user1;
grant createtab on database basename to user1;
// 收回权限
revoke createtab on database basename from user1;
revoke select on table user from public
(9)视图
视图其实就是虚拟表,根据条件选出另一表中符合的数据。同理视图生成之后,向视图中添加数据就是向对应的表中添加数据。可对应多个表
create view student
as select name,id from user where type = '学生';
// 此时不加 with check option ,可以随意向视图中添加数据。
create view student
as select name,id from user where type = '学生' with check option;
// 加上 with check option后,只有类型是学生的数据才可以被加进去,否则会报错。且这个限制只有存在where条件才生效。
// 删除视图
drop view student;
(10)索引
创建索引修改的是内模式–存储文件。
// 唯一索引,单个值在表中只能有一条数据
create unique index indexName on user(user_id);
// 聚簇索引,索引项顺序是与表中记录的物理顺序一致的索引组织。
create cluster index indexName on user(user_id);
五、关系数据库的规范化
1、函数依赖(重要)
(1)函数依赖分类
组合属性才存在完全、部分函数依赖区分,单个属性就是完全函数依赖
(2)属性闭包
常考候选关键字、主属性、非主属性。
可以求出闭包来的属性或者属性组合被叫做候选关键字(候选码属性组合中的任一真子集不可求出闭包)。找关键字从箭头左侧的属性中找就可以,因为右侧的属性都是被决定的。
A->ABC->ABCD = U
这里A就是候选关键字。
如果说从AC开始求闭包,其实也可以求出来,但是AC中的A单独就可以求出来,所以AC不可以被称为候选关键字。其中候选关键字中的属性叫做主属性,未在候选关键字中的属性叫非主属性。若有多个候选码,可选择其中一个作为主码。
主键为全码就是所有属性为候选关键字。
2、规范化(重要)
检查符合第几范式的标准:
1NF:属性是否不可再分
2NF:非主属性是否全部完全函数依赖候选码
3NF: 非主属性是否全部非传递依赖于主属性
BFNF:主属性是否对于候选码有部分函数依赖或者传递依赖(不常考)
多值依赖
表示方式:X->->Y
X多值决定Y,Y多值决定X
比如:一门课有多个讲师授课,需要用到多本辅导书。
对于关系R的每个非平凡多值依赖X->->Y,X都包含了R的一个候选码,则称R为第四范式。
考点
常考题:
- 候选码
- 可达到第几范式
- 关系分解
- 有损、无损连接,是否保持函数依赖
一般都符合第一范式,那么就要判断是否存在部分函数依赖(不存在,就是第二范式)和传递依赖(不存在,就是第三范式)。
传递依赖要注意有两种情况:
- X->Y,Y->Z
- X->Y, YZ -> W,就有XZ->W
无损连接标准
一般这种题,会将关系分解的结果给出来,我们需要将分解后的各关系使用自然连接,判断其结果是否等于关系的全集,若等于,为无损连接;若不等于,则是有损连接。
是否保持函数依赖,就要看新的关系中是否还能得到题目中给的依赖关系(包含传递)
六、数据库设计
数据库设计策略:自顶向下和自底向上
1、数据库设计步骤
- 需求分析:获取用户需求,了解关系边界
- 概念分析:E-R图表示
- 逻辑设计:E-R图转关系模式,并进行规范化
- 物理设计:在数据库中的具体实现
2、需求分析
- 需求分析是逻辑设计以及物理设计的依据
- 确认系统边界是需求分析的步骤
- 需求分析最终要生成需求说明文档、数据流程图、数据字典
3、概念设计
(1)E-R图(重要)
实体-关系模型
(本文上方也有)
- 实体 长方形表示,即元组
- 关系 菱形表示
- 属性 椭圆形表示
三者用无向边联系起来,无向边上标注1或多
属性分类
- 简单属性和复合属性:属性为原子级,不可再分为简单属性。可再分为复合属性,也就不符合第一范式
- 单值属性和多值属性:一个实体只有一个值的属性叫做单值属性,反之为多值属性。比如一本书的名字只能是那一个;学生的爱好可以是学习(哈哈哈),也可以是篮球、跑步…
- null属性:空值为null
- 派生属性:可通过其他属性计算得到的。比如年龄可以通过出生年月与当前时间计算得到
不常见的
- 弱实体:该实体依赖于另一个实体存在。比如职工家属,只有存在职工时,才会有。双层长方形表示
- 弱关系:弱实体集联系的表示。双层菱形表示
(2)概念设计
冲突类型
E-R图设计好之后,需要经过选择应用-> 设计分E-R图->合并E-R图
可能会存在的冲突类型:
- 属性冲突:同一属性在不同的E-R图中都存在,但值的类型或者大小不同
- 命名冲突:同一属性在不同的E-R图中都存在,名称不同。异名同义、同名异义
- 结构冲突:有一字段,在A E-R图中是个属性,但在B中是实体
4、逻辑设计【E-R图转关系模式】
-
实体转关系模式
实体名为关系名,属性为关系模式的属性
学生(学号,姓名,年龄) -
一对一关系转关系模型
厂长(姓名,性别,年龄)
工厂(厂号,厂名,地点)
方法一:关系名为关系模式的名称,与之有关的两实体的主键和关系的属性(如果有的话)为关系模式的属性
管理(姓名,厂名,管理方式)
方法二:将其中一实体的主码与关系的属性放入另一实体的属性中
厂长(姓名,性别,年龄,厂名,管理方式)
或者
工厂(厂号,厂名,地点,姓名,管理方式)
-
一对多关系转关系模型
仓库(仓库号,地点,面积)
商品(货号,商品名,价格)
方法一:关系名为关系模式的名称,与之有关的两实体的主键和关系的属性(如果有的话)为关系模式的属性
仓储(仓库号,货号,数量)
方法二:将联系归并到实体的多方,给实体增加另一方的主码和关系的属性作为关系模式的属性。
商品(货号,商品名,价格,仓库号,数量)
-
多对多关系转关系模型
关系名为关系模式的名称,与之有关的两实体的主键和关系的属性(如果有的话)为关系模式的属性
选修(学号,课程号,成绩)
5、物理设计
不考
6、数据库的实施与维护
不考
七、数据库的控制管理
1、事务管理
原则
要么不做,要么都做
特点
- 原子性:原子的,要么都做,要么都不做
- 一致性:事务执行的结果必须保证数据库从一个一致性状态到另一个一致性状态
- 隔离性:事务相互隔离,当多个事务并行执行时,相互之间不可见
- 持久性:即使数据库崩溃,事务对于数据库的更新也存在
2、数据库的备份与恢复
为应对数据库系统因软、硬件故障导致的数据丢失或损坏,需要做一些可恢复数据的措施。
(1)故障类型
- 事务内部故障
- 系统故障
- 介质故障
- 计算机病毒
(2)备份方法
恢复的基本原理是“建立数据冗余”,即进行数据转储和登记日志文件。
- 静态转储和动态转储:静态转储在转储期间不允许对数据库进行任何操作;反之为动态转储。
- 海量转储和增量转储:每次转储都是全量转储为海量转储;每次转储只转储上次转储后更新的内容为增量转储。
- 日志文件:将对数据的每次操作都写入日志文件,DBMS可使用日志文件进行事务故障恢复和系统故障恢复、介质故障恢复。
为保证数据库中数据的安全可靠和正确有效,在进行事务处理时,对数据的插入、删除或修改的全部有关内容写入日志文件;当系统正常运行时,按一定时间间隔,将数据库缓冲区内容写入数据文件;发生故障时,根据现场数据内容及相关文件恢复系统状态。
3、并发控制
并发控制的主要技术是封锁。分为排它锁(X锁或读锁)和共享锁(S锁或写锁)
排它锁:某一事物对数据加了排它锁之后,可读取修改,其他事务不可再对数据加任何锁
共享锁:某一事物对数据加了共享锁之后,可读取,其他事物也对数据加共享锁
八、分布式数据库
都是概念性的题目,记住吧
九、奇怪的考过的点
- 遗传算法采用模拟生物进化的三个基本过程“繁殖、交叉、变异”
- 数据库逻辑设计中,若实体存在多值属性,那么将E-R图转成关系模式时,将实体的码分别和每个多值属性独立构成一个关系模式,可使得得到的关系模式属于4NF
- JDBC是java技术中访问数据库的方式,也是目前用java技术实现的基于web的应用的数据库访问方式。com是一种组件技术,cgi是一种网络应用技术。
- 函数依赖
- **OLAP(联机分析处理)**可为用户提供一个便利的多维度观点和方法,以有效的对数据进行复杂的查询动作
- 数据库的安全机制中,通过提供存储过程供第三方开发人员调用进行数据更新,从而保证数据库的关系模式不会被第三方获取
做题经验
一.http://codevs.cn/problem/4906/
以后所有的数据处理全部在读入之后进行!!!!
二.http://noi.openjudge.cn/ch0205/2727/
1.注意memset的用法,siezof()里面写的是变量名
2.有时候vis数组开成int类型会超时!,so尽量把vis数组开成bool类型。省时省空间
在哪个学校的oj上做题比较好?