A卷
1. 选择题(30')
2. 判断范式(10')
3. 程序填空(20')
4. 分析填空(15')
5. 写SQL(25')
B卷
1. 单选(30')
2. 填空 (20')
3. 程序填空(20')
4. 写SQL(30')
知识点
第一章
数据库管理系统(DBMS)
数据库系统(DBS)
数据库系统的特点
er模型
概念
ER模型三要素
联系
数据模型三要素
P24 两级映像, 数据独立性
P27 数据库系统怎么组成
第二章
P34关系模型
概念
第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员
P37性质
p41 关系操作操作方式
关系操作的特点是集合操作方式, 操作的对象和结果都是集合
实体完整性, 参照完整性, 用户定义的完整性
关系代数
传统集合运算, 并差交, 笛卡尔积, 选择 投影P51'除'不考
第三章 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 旧表名)
数据
// 增
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 ('小明', '小王');
数据查询
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的子查询 没刻意考
内连接
select 列名
from 表A
inner join 表B
on 表A.列名 = 表B.列名
select from staff.id, staff.name, market.month, moarket.sales
from staff
innner join market
on staff.id = market.id;
集合查询
// 并 - 去重
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);
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)
笛卡尔积连接
select 列名
from 表名1, 表名2;
自连接
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 排名;
视图 必考
// 增
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 安全性
安全性的定义
安全性控制的方法
// 增
grant 权限名1, 权限名2
on '数据库名.表名'
to '用户名' @ '主机名'
with (grant_option)
// 删
revoke 权限名1, 权限名2
on '数据库名.表名'
from '用户名' @ '主机名'
// 查
show grants for '用户名' @ '主机名';
存取控制
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章 关系数据库
概念
与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。
现实世界中客观存在并可以被区别的事物。比如“一个学生”、“一本书”、“一门课”等等。值得强调的是这里所说的“事物”不仅仅是看得见摸得着的“东西”,它也可以是虚拟的,比如说“老师与学校的关系”。
教科书上解释为:“实体所具有的某一特性”,由此可见,属性一开始是个逻辑概念,比如说,“性别”是“人”的一个属性。在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”。
元组的某个属性值。在一个关系数据库中,它是一个操作原子,即关系数据库在做任何操作的时候,属性是“不可分的”。否则就不是关系数据库了
表中可以唯一确定一个元组的某个属性(或者属性组), 如果这样的码有不止一个, 那么大家都叫候选码, 我们从候选码中挑一个出来做老大, 它就叫主码
函数依赖
在关系R(学号, 宿舍, 费用)中, (学号) -> (宿舍), 宿舍 != 学号,(宿舍) -> (费用), 费用 != 宿舍, 所以符合传递函数的要求
范式 NF
第二范式
若R是第一范式 + 每一个非主属性完全函数依赖于任何一个候选码
第三范式
BC范式 (A卷没出现BC范式选择题, B有一个选择)
求候选码
External Player - 哔哩哔哩嵌入式外链播放器
第8章 数据库编程
存储过程
// 增 - 无参数
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 存储过程名;
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;
触发器
// 增
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. 诊断与解除
选择一个处理思索代价最小的事务, 将其撤销, 释放此事务持有的所有锁
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
DECIMAL(4, 2) (精度, 标度) 精度总位数, 标度小数位数
修改表结构
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 约束名;
基本查询语句
SELECT ttitle, GROUP_CONCAT(tname)
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;
语句说明完要加“;”最后IF语句结束也要加‘ENDIF;’
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();
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();
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;
触发器
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;