A卷
1. 选择题(30')
2. 判断范式(10')
判断到第三范式
3. 程序填空(20')
4. 分析填空(15')
5. 写SQL(25')
5'一题
恶性
B卷
1. 单选(30')
2. 填空 (20')
3. 程序填空(20')
4. 写SQL(30')
知识点
第一章
数据库管理系统(DBMS)
主要功能
- 数据定义功能 (DDL, 数据定义语言, create, drop, alter)
- 数据操纵功能 (DML, 增删改查)
- 数据库的事务管理和运行管理功能 (DCL., 保护功能)
- 安全性 (不合法使用)
- 完整性 (数据正确, 不符合语义)
- 并发控制
- 恢复 (冗余存在)
- 数据库的建立和维护功能
数据库系统(DBS)
数据库系统的特点
- 结构化
- 共享性强
- 独立性强
- 物理独立性 (外层)
- 逻辑独立性 (内层)
- 数据由数据库管理系统统一管理和控制
- 安全性
- 完整性
- 并发性
- 恢复
er模型
概念
- 实体 => 客观存在并可相互区别的事物
- 属性 => 实体所具有的某一特性
- 码 => 唯一标识实体的属性集
ER模型三要素
- 实体
- 属性
- 实体间的联系
联系
- 一对一 (1: 1)
- 一对多 (1: n)
- 多对多 (n: n)
数据模型三要素
- 数据结构
- 数据操纵
- 完整性约束
P24 两级映像, 数据独立性
P27 数据库系统怎么组成
- 硬件平台
- 软件平台
- 人员
- 数据库管理员
- 系统分析员和数据库设计员
- 应用程序员
- 最终用户
第二章
P34关系模型
概念
域 => 是一组具有相同数据类型的值的集合
笛卡尔积 => 域上的一种集合运算
第一个对象是X 的成员而第二个对象是Y的所有可能有序对的其中一个成员
关系 => 只有笛卡尔积的某个真子集才有实际含义
有三种类型 => 基本关系, 查询结果, 视图
P37性质
列的方向 行的方向
- 列是同质的
- 不同的列可出自同一个域, 称其中的每一列为一个属性, 不同的属性要给予不同的属性名
- 列的顺序无所谓
- 任意两个元祖的候选码不能选相同的值
- 行的顺序无所谓,
- 分量必须取原子值
p41 关系操作操作方式
关系操作的特点是集合操作方式 , 操作的对象和结果都是集合
实体完整性, 参照完整性, 用户定义的完整性
- 实体完整性 => 主属性非空
- 参照完整性 => 外键
- 用户定义的完整性
关系代数
传统集合运算, 并差交, 笛卡尔积, 选择 投影P51'除'不考
第三章 SQL语言
表
create table 表名
(
列名1 数据类型 列属性,
列名2 数据类型 列属性
);
|-----------------|-----------|
| 约束 | 说明 |
| default | 默认值 |
| not null | 非空, 不允许为空 |
| auto_increament | 自动递增 |
| check | 条件检查 |
| unique | 唯一键 |
| primary key | 主键 |
| foreign key | 外键 |
sql
drop table 表名;
// 改表名
alter table 旧表名
rename to 新表名
// 增加字段
alter table 表名
add 字段名 数据类型
// 删除字段
alter table 表名
drop 字段名
// 修改字段
alter table 表名
change 原字段名 新字段名 新数据类型
// 修改数据类型
alter table 表名
modify 字段名 新数据类型
// 查看当前数据库中的表
show tables;
// 查看某个表对应的建表语句
show create table 表名;
// 查看表结构
describe 表名;
desc 表名;
// 只复制结构
create table 新表名
like 旧表名;
// 同时复制结构和数据
create table 新表名
as (select * from 旧表名)
P78 索引 不考
数据
sql
// 增
insert into 表名(列名1, 列名2)
values
(值1_1, 值1_2),
(值2_1, 值2_2);
// 增 - 更改主键
replace into
// 删 - delete
delete from 表名
where 条件;
// 删 - 全部 delete
delete from 表明;
// 删 - 全部 truncate
truncate from 表名;
// 改
update 表名
set 列名1 = 值1,
列名2 = 值2;
delete from s
where sname in ('小明', '小王');
数据查询
sql
select 列名
from 表名
where 条件
group by 列名
having 条件
order by 列名
limit n;
// like
where 列名 like '%str%'
where 列名 like '\%str%'
where 列名 like '_str_'
where 列名 like '\_str_'
// in, not in
select name, price
from fruit
where season = '夏' and price in (
select price from fruit where season = '秋'
);
// all
select name, price
from fruit
where season = '夏' and price > all (
select price from fruit where season = '秋'
);
// any, some
select name, price
from fruit
where season = '夏' and price = any (
select price from fruit where season = '秋'
);
P95 外连接 不考P103 带有exists的子查询 没刻意考
内连接
sql
select 列名
from 表A
inner join 表B
on 表A.列名 = 表B.列名
sql
select from staff.id, staff.name, market.month, moarket.sales
from staff
innner join market
on staff.id = market.id;
集合查询
sql
// 并 - 去重
select 列名 from 表A
union
select 列名 from 表B;
// 并 - 不去重
select 列名 from 表A
union all
select 列名 from 表B;
// 交
select distinct 列名
from 表A
where 列名 IN (select 列名 from 表B);
// 差集
select 列名 from 表A where 列名 not in (select 列名 from 表B);
sql
SELECT * FROM Student WHERE Sdept ='CS' UNION
SELECT * FROM Student WHERE Sage <=19
SELECT Sno FROM SC WHERE Cno = '1'
AND Sno IN (
SELECT Sno FROM SC WHERE Cno = '2')
SELECT Sno FROM SC SCX WHERE Cno = '1'
AND EXISTS (SELECT Sno FROM SC SCY WHERE Cno = '2'
AND SCX.Sno = SCY.Sno)
笛卡尔积连接
sql
select 列名
from 表名1, 表名2;
自连接
sql
select 列名
from 表名1 as 别名1, 表名1 as 别名2;
select s1.name, s1.age, count(*) as 排名
from staff as s1, staff as s2
where s1.age < s2.age
group by s1.id
order by 排名;
P107 派生表 不考
视图 必考
sql
// 增
create view 视图名
as 查询语句;
// 删
drop view if exists 视图名1, 视图名2;
// 改 - alterview
alter view 视图名
as 查询语句;
// 改 - create or replace view -- 不管原先存不存在, 都能改掉
create or replace view 视图名
as 查询语句
// 查
describe 视图名;
show table status like '视图名'; // like 接字符串, 所以需要单引号
show create view 视图名;
// 增
insert into 视图名
values();
// 删
delete from 表名
where 列名 = '';
// 改
update 视图名
set 列名 = 新值;
// 查
select * from 表名;
空值
定义: 空值是一个很特殊的值, 含有不确定性
4 安全性
安全性的定义
保护数据库以防止不合法使用所造成的数据泄露, 更改或破坏
安全性控制的方法
sql
// 增
grant 权限名1, 权限名2
on '数据库名.表名'
to '用户名' @ '主机名'
with (grant_option)
// 删
revoke 权限名1, 权限名2
on '数据库名.表名'
from '用户名' @ '主机名'
// 查
show grants for '用户名' @ '主机名';
- 用户身份鉴别
- 多层存取控制
- 审计
- 视图
- 数据加密
存取控制
|--------------|---------------------|
| 参数 | 说明 |
| grant_option | 被授予的用户可以将这些权限授予别的用户 |
sql
create view CS_s
as select * from s
where smajor = '计算机'
with cheak option;
grant select ON CS_s to 王平;
grant all previleges on CS_s to 张明
审计-存取日志
审计把用户对数据库的所有操作自动记录下来放入审计日志
第5章 数据库完整性
完整性定义
数据库数据的正确性和和相容性
第6章 关系数据库
概念
主属性
一个属性只要在任何一个候选码中出现过,这个属性就是主属性。
非主属性
与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。
实体
现实世界中客观存在并可以被区别的事物。比如"一个学生"、"一本书"、"一门课"等等。值得强调的是这里所说的"事物"不仅仅是看得见摸得着的"东西",它也可以是虚拟的,比如说"老师与学校的关系"。
属性
教科书上解释为:"实体所具有的某一特性",由此可见,属性一开始是个逻辑概念,比如说,"性别"是"人"的一个属性。在关系数据库中,属性又是个物理概念,属性可以看作是"表的一列"。
元组
表中的一行就是一个元组
分量
元组的某个属性值。在一个关系数据库中,它是一个操作原子,即关系数据库在做任何操作的时候,属性是"不可分的"。否则就不是关系数据库了
码
表中可以唯一确定一个元组的某个属性(或者属性组), 如果这样的码有不止一个, 那么大家都叫候选码, 我们从候选码中挑一个出来做老大, 它就叫主码
函数依赖
- 完全函数依赖
两个男人A和B;一个女人L男人A和B一起能满足女人L的需求而男人A或B任意一个人都不能满足女人L的需求,要两个人一起才能满足叫做女人L完全依赖于两个男人A和B男人A和B共同一起成为主属性,女人L当成非主属性
- 部分函数依赖
两个男人A和B;一个女人L男人A和B一起能满足女人L的需求,但是男人A或B其中一个人就能满足女人L的需求,叫做女人L部分依赖于两个男人A和B
- 传递函数依赖 - 定义6.3
在关系R(学号, 宿舍, 费用)中, (学号) -> (宿舍), 宿舍 != 学号,(宿舍) -> (费用), 费用 != 宿舍, 所以符合传递函数的要求
范式 NF
第二范式
若R是第一范式 + 每一个非主属性完全函数依赖于任何一个候选码
消除非主属性对候选码的部分依赖
第三范式
每一个非主属性既不传递依赖于码, 也不部分依赖于码
全是主属性一定满足第三范式
BC范式 (A卷没出现BC范式选择题, B有一个选择)
属性不传递依赖于候选键
每一个决定因素都包含码
求候选码
算法6.1 求属性集的闭包 看ppt
由公式推得属性闭包
现有的元素组合在一起,推出新元素
候选码看视频!!!!
External Player - 哔哩哔哩嵌入式外链播放器
第8章 数据库编程
存储过程
sql
// 增 - 无参数
create procedure 存储过程名()
begin
end;
// 增 - 带参数 默认都是in
create procedure 存储过程名(a float, b float)
begin
select name, price
from fruit
where price between a and b;
end;
// 增 - out参数
create procedure test(out n int)
begin
select n;
set n = 20;
select n;
end;
set @b = 10;
call test(@b);
// 以上输出结果 null 20
// 增 - inout参数
create procedure test(inout n int)
begin
select n;
set n = 20;
select n;
end;
set @b = 10;
call test(@b);
// 以上输出结果 10 20
// 删
drop procedure 存储过程名;
// 改 - 简单了解, 只能修改存储过程的特征
alter procedure 存储过程名()
begin
end;
// 查
show procedure status like '存储过程名';
show create procedure 存储过程名;
sql
DROP PROCEDURE IF EXISTS ps;
CREATE PROCEDURE ps(IN sid CHAR(12), OUT avgs DECIMAL)
BEGIN
SELECT AVG(score)
INTO avgs
FROM sc
WHERE sc.snum = sid
END;
--
CALL ps('202205010229', @s);
SELECT @s;
触发器
sql
// 增
CREATE trigger triggerName
after/before insert/update/delete on 表明
for each row #这句话在Mysql固定
begin
sql语句;
end;
// 删
drop trigger 触发器名;
// 查
show triggers;
第11章 恢复技术
事务的定义
用户定义的一个数据库操作序列, 这些操作要么全做, 要么不做, 是一个不可分割的单位
事务四大特性
原子, 一致, 隔离, 持续
故障种类
恢复技术
第12章 并发控制
并发的概念
- 事务是并发控制的基本单位
- 保证事务的隔离性和一致性
三种不一致现象
- 丢失修改
两个事务读同一个数据, 各自修改. T2提交的结果会破坏T1提交的结果
- 脏读
T1修改某数据, 写回磁盘, T2读取这一数据, T1因某种原因被撤销, T1恢复原值, T2读到的数据与数据库不一致
- 不可重复读
T1读取数据后, T2执行更新, T1再次读取时, 得到与前一次不一样的值
P337 封锁
三级封锁协议
死锁怎么产生, 诊断与解除
1.1. 产生的原因
- 竞争资源
- 进程间推进顺序非法
1.2. 诊断与解除
选择一个处理思索代价最小的事务, 将其撤销, 释放此事务持有的所有锁
- 超时法
如果一个事物的等待时间超过了规定的时限, 就认为发生了死锁
- 事务等待图法
若有向图中存在回路, 则发生了死锁
sql
DROP TABLE IF EXISTS s;
CREATE TABLE s
(
snumber INT,
snum CHAR(12) NOT NULL,
sname VARCHAR(50),
enterdate DATETIME DEFAULT now(),
ssex ENUM('男', '女'),
score DECIMAL(4, 2),
-- ssex CHAR(1) CHECK(ssex = '男' or ssex = '女'),
PRIMARY KEY(snum, sname)
-- FOREIGN KEY(sname) references sch(sname)
);
sql
SQL语句:一定要加关键字 TABLE
AUTO_INCREMENT 只能作为主键使用
DECIMAL(4, 2) (精度, 标度) 精度总位数, 标度小数位数
CHECK语句:
ssex CHAR(1) CHECK(ssex = '男' or ssex = '女'),
修改表结构
rename table s to student;
ALTER TABLE s
ADD COLUMN swechat VARCHAR(50) AFTER score;
// MODIFY可以修改位置,但不能修名字
ALTER TABLE s
MODIFY enterdate datetime default now() after score;
// CHANGE 可修改名字,但不能修改位置
ALTER TABLE s
CHANGE sscore score BIGINT default 100 ;
ALTER TABLE 表名
DROP CONSTRAINT 约束名;
ALTER TABLE s
DROP COLUMN swechat;
DESC s;
SHOW CREATE TABLE s;
基本查询语句
SELECT *
FROM s
LIMIT 2500, 10;
从第2501个开始 一共10个
SELECT CONCAT(tname, ttitle)
FROM t
WHERE ttitle IS NOT NULL;
/不用看
分组,并对结果进行汇总:
select ssex, COUNT(snum)
from s
group by ssex
WITH ROLLUP;
SELECT ttitle, GROUP_CONCAT(tname)
FROM t
GROUP BY ttitle;
/
sql
SELECT sc.snum, s.sname, cnum, score
FROM sc, s
WHERE sc.snum = s.snum;
SELECT s2.sname, s2.ssex
FROM s s1, s s2
WHERE s1.sname = '沈羿' AND s1.dnum = s2.dnum;
SELECT dname, COUNT(*)
from d, s
WHERE d.dnum = s.dnum
GROUP BY s.dnum
ORDER BY COUNT(*) DESC
SELECT MAX(tsalary), MIN(tsalary), AVG(tsalary)
FROM t, coll
WHERE tsex = '男' AND collname = '信息工程学院' AND coll.collnum = t.collnum
GROUP BY ttitle
HAVING AVG(tsalary) > 7000
ORDER BY AVG(tsalary) DESC;
SELECT sname, snum
FROM s
WHERE snum IN(SELECT snum FROM sc WHERE cnum = 'B3503021');
SELECT snum, sname
FROM s
WHERE EXISTS(SELECT *
from sc
WHERE sc.snum = s.snum AND cnum = 'B3503021');
SELECT snum, sname
FROM s
WHERE NOT EXISTS(select *
FROM sc
WHERE sc.snum = s.snum AND cnum = 'B3503021');
DECLARE num int default 0;
SET num = 10;
SELECT AVG(score) INTO @ave
FROM sc;
SET @ave = 10;
变量都是使用SET关键词重新赋值的
IF、ELSE IF语句后面要加THEN
语句说明完要加";"最后IF语句结束也要加'ENDIF;'
sql
DROP PROCEDURE IF EXISTS blesoo;
CREATE PROCEDURE blesoo()
BEGIN
DECLARE ccount INT DEFAULT(0);
DECLARE ave INT DEFAULT(0);
SELECT COUNT(*)
INTO ccount
from sc;
SELECT AVG(score)
INTO ave
FROM sc;
IF(ave > ccount) THEN
SELECT ave;
ELSE
SELECT ccount;
END IF;
END;
CALL blesoo();
CASE语句 里面用
CASE
WHEN..THEN..
ELSE...
END CASE;
sql
CREATE PROCEDURE PC()
BEGIN
DECLARE X INT DEFAULT 0;
SET X = 100;
CASE
WHEN X = 100 THEN SELECT 'X = 100';
WHEN X = 200 THEN SELECT 'X = 200';
ELSE SELECT 'BLESOO';
END CASE;
END;
CALL PC();
sql
IF THEN LEAVE 循环名;
END IF;
END LOOP 循环名;
CREATE PROCEDURE ROUND(IN num INT, OUT ssum INT)
BEGIN
DECLARE X INT DEFAULT 0;
DECLARE SNUM INT DEFAULT 0;
xloop:LOOP
SET X = X + 1;
SET SNUM = SNUM + X;
IF X > num THEN LEAVE xloop;
END IF;
END LOOP xloop;
SELECT X;
SET ssum = SNUM;
END;
LOOP语句:
循环名:LOOP
ITERATE 循环名;跳过本次循环
触发器
sql
CREATE TRIGGER BLESOO
AFTER INSERT
ON sc
FOR EACH ROW
BEGIN
IF(SELECT COUNT(*) FROM sc WHERE sc.snum = new.snum) > 5 THEN
SIGNAL SQLSTATE'45000'SET MESSAGE_TEXT = '你的选课已经超过5门了,不能再选了!';
END IF;
END;
修改数据只能BEFORE