表
create table 表名(字段名 字段类型 字段约束,.....);
#字段约束有 primary key(主键),not null(不为空),unique(唯一)
# 例如:
create table Student
(Sno CHAR(9) primary key, # 设为主键
Sname CHAR(20) unique, #唯一
....
)
create table 表名(...... FOREIGN KEY (外码)references 参照列)
# 例如
create table Course
(Cno CHAR(4) primary key,# 设为主键
Cname CHAR(40) NOT NULL,# 不为空
Cnop CHAR(4).
Ccredit SMALLINT,
FOREIGN KEY (Cpno) REFERENCES Course(Cno)
# 表示完整性约束条件,Cpno是外码,被参照表是Course,被参照列是Cno
);
# 参照表和被参照表可以使同一个表,也可以不是.
# 修改基本表
ALTER TABLE 表名 ALTER COLUMN 字段名 字段类型
# 修改表中的字段名或者字段类型
ALTER TABLE 表名 ADD 字段名 字段类型
# 添加字段字段名 字段约束
ALTER TABLE 表名 DROP COLUMN 字段名 [CASCADE|RESTRICT]#删除表中的列
# 删除表
DROP TABLE 表名 [RESTRICT |CASCADE] ;
# 索引
CREATE [UNIQUE] [CLUSTER] INDEX < 索引名 >
ON < 表名 > ( <列名> [ <次序>] [,<列名> [ < 次序> ] ]);
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Student(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC, Cno DESC);
# 创建索引
CREATE [UNIQUE] [CLUSTER] INDEX < 索引名 >
ON < 表名 > ( <列名> [ <次序>] [,<列名> [ < 次序> ] ]);
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Student(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC, Cno DESC);
# 修改索引
# 对索引名重命名
ALTER INDEX <就索引名> RENAME TO <新所银名> ;
ALTER INDEX SCno RENAME TO SCSno;
# 删除索引
DROP INDEX <索引名>
DROP INDEX Stusname;
SELECT [ ALL | DISTINCT ] < 目标列表达式 > [ ,< 目标列表达式 > ] ....
FROM < 表名或视图名 > [ ,< 表名或视图名 >....] | ( < SELECT语句 > ) [AS] <别名>
[ WHERE < 条件表达式 > ]
数据查询
SELECT [ ALL | DISTINCT ] < 目标列表达式 > [ ,< 目标列表达式 > ] ....
FROM < 表名或视图名 > [ , < 表名或视图名 > ] | ( < SELECT 语句 > ) [ AS ] < 别名 >
[ WHERE < 条件表达式 > ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ASC | DESC] ]
# 单表查询
SELECT Sno,Sname
FROM Student;
# 查询全体信息
# 查询全体信息
SELECT *
FROM Student;
# 字符串常量 为目标列表达式
SELECT Sname,'Year of Birth', 2014-Sage,LOWER(Sdept)
FROM Student;
# 取别名
SELECT Sname NAME ,'Year of Birth' BIRTH , 2014-Sage BIRTHDAY, LOWER(Sdept) DEPARTMENT
FROM Student;
# 就是将列头改个名字
# 清除取值重复的行 用DISTINCT 默认的是所有的ALL
SELECT DISTINCT Sno
FROM SC;
# 满足条件的元组
SELECT Sname
FROM Student
WHERE Sdept ='CS';# 找出表student 中的Sdept='CS'的Sname
# 范围内 年龄在20~23岁之间的学生的姓名,系别和年龄
SELECT Sname ,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
#LIKE 可以用来进行字符串的匹配,
[NOT] LIKE '<'
安全性
Grant <权限> on 表名[(列名)] to ⽤户 With grant option
授权命令是由数据库管理员使⽤的,若给⽤户分配权限时带
With grant option⼦句,则普通⽤户获权后,可把⾃⼰的权限授予其他⽤户。
grant select on table SC to public with grant option;
回收权限 revoke
REVOKE <权限> ON <数据对象> FROM <⽤户名> cascade
revoke select on SC to public;
# 数据库角色:
create role <角色名>
create role CEO;
角色授权
grant <权限> on < 对象类型> 对象名 to <角色名>,<角色名>
grant select on Student from CEO;
收回权限
revoke <权限> on <对象名> from 角色名
revoke select on Student from CEO;
把对数据库的所有操作都记录到审计⽇志中,然后就可以通过⽇志审查这个⾥⾯是否有⼀些⾮法的⾏
对 修改SC数据的操作进⾏审计
audit update on SC
取消对SC表的⼀切审计
noaudit update on SC;
完整性
1 实体完整性
主码唯⼀,且⾮空
create table course (id int not null ,time varchar(255),primary key (id));
create table course (id int not null primary key,time varchar(255));
-------------------------------------------------------------------------
2 参照完整性
外码的要么没有,要么只有⼀个
create table course (id int,time varchar(255),
title varchar(255),teacher_id int, primary key(id),
foreign key (id) references course_description(course_id);
-------------------------------------------------------------------------
3 ⽤户定义完整性
1 ⾮空
create table student(
no char(9) primary key,
age int not null
);
2 列值唯⼀
create table student(
no char(9) primary key,
age int unique
);
3 满⾜某⼀个条件表达式 check来写
create table student(
no char(9) primary key,
sex char(2) check (sex in ('男','⼥')),
age int not null
);
范式
候选码
- 概念: 可以推出所有属性
如何选出候选码?
1)只出现在左边的⼀定是候选码
2)只出现在右边的⼀定不是候选码
3)左右都出现的不⼀定
4)左右都不出现的⼀定是候选码
5)再求确定的候选码的闭包,如果可以推出全部,那么当前确定的就是候选码,
否则 你要吧每⼀个可能的值 放进当前确定的候选码⾥⾯进⾏求 闭包
⽐如
R<U,F> ,U(A,B,C,D,E,G) , F={AB-->C,CD-->E,E-->A,A-->G) ,求候选码:
B⼀定是候选码 D⼀定是候选码
G⼀定不是候选码
A不⼀定 C不⼀定 E不⼀定
BD->啥也推不出来,所以要把每⼀个可能的求闭包
(BDA)+= 可退出C E A G 所以可以退出ABCDEG
(BDC)+= 可退出 E A G 所以可以退出ABCDEG
(BDE)+= A G C 可以退出ABCDEG
那么他的候选码最终是{ (BDA),(BDC),(BDE) };
超码
超码: 能表示出所有属性的集合, ⽐如 (BDA),(BDC),(BDE) BDCA BDEA ABCDE
三大范式
第一范式: 所有字段都是不能分割的原子值
第二范式: 不能有候选码的真子集决定
第三范式: 不存在传递关系: AB->C C->D 这就存在传递关系,就不是第三范式
AB->C CD->E
试题
# 后面的还没有挨个复习,太多了,太难了。
# 找了份试卷,做做SQL把
# 第一题:(1) 创建 Student 表,其中 Ssex 只能取‘男’或‘女’;(2 分)
create table Student (Sno char(7) Primary key,Sname varchar(255),Sage int,
Ssex char(2) constraint C1(别名) check(Ssex in('男', '女'),Sdept varchar(255)
);
# 注意的地方, constaint 是选择的作用。
# 第二题:(2) 查询选修了课程的学生学号, 要求去掉结果表中的重复行;(2 分)
select distinct(去重) Sno From SC;
# 注意 distinct 用于去重
# 第三题:(3) 查询信息工程系年龄在 20 岁以下的学生姓名(2 分)
select Sname from Student where Sdept='信息工程系' and Sage < 20;
# 第四题:(4) 查询所有姓王的学生的姓名、学号和性别;(2 分
select Sname,Sno,Ssex from Student where Sname like '王%';
# 第五题:(5) 查询选修了课程的学生人数;(2 分)
select count(distince Sno) from SC;
# 第六题: (6) 查询‘操作系统’课程的平均分;(2 分)
select avg(grade) from SC Course where SC.Cno=Course.Cno and Course.Cname='操作系统';
# 第七题: (7) 查询选修了两门以上课程的学生学号;(3 分)
select Sno from SC group by Sno having count(*)>2;
# 注意 group by 能与where连用,但需要加count或者max,min,avg需要用having 替代
# 第八题: (8) 查询选修了操作系统且成绩在 80 分以上的所有学生学号和姓名;(3 分)
select Sno,Sname from SC Course Student where SC.Grade>=80 and
SC.Cno =Course.Cno and Course.Cname='操作系统' and SC.Sno=Student.Sno;
# 第九题:(9) 查询间接先修课是“数据库系统原理”的课程名,即该课程先修课的先修课是“数据库系统原理”;(3 分)
select A.Cname from Course A where A.Cpno in(
select Cno from Course B where B.Cpno='数据库系统原理';
)
# 第十题: (10) 查询至少选修了学号为 2018001 学生选修的全部课程的学生学号;(3 分)
select Sno from Student where not exists (select * from SC X where Sno = '2018001' and
not exists (select * from SC Y where Y.Sno =X.Sno)
# 第十一题: (11) 插入一条选课记录(‘2018003,’3’);(3 分)
insert into SC(Sno,Cno) values('2018003','3');
# 第十二题: (12) 将所有学生的年龄加 1 岁;(3 分)
update Student set Sage=Sage+1;
# 第十三题: (13) 定义一个视图 Stu_CS(Sno,Sname,Avg_grade),它由计算机系学生的学号、姓名和平均成绩组成;(3 分)
create view Stu_CS(Sno,Sname,Avg_grade) AS select Sno,Sname,avg(grade) from Student,SC
where Student.Sdept='计算机系' and SC.Sno=Student.Sno groupy by SC.Sno ,Sname;
# 第十四题: (14) 把对 Student、Course 和 SC 三个表查询的权力授予给所有用户;(3 分)
grant select on table Student,Course,SC to public;
# 扩限 格式 grant 权限 on table 表名,表名 to 开放还是关闭
# 第十五题: (15)删除课程号为 3 的学生的全部信息;(3 分)
delete from Student where Sno in (select Sno from SC where SC.Cno=3);
# 第十六题: (16)为 Course 表增加一列 Ccredit(学分),数据类型为 int;(3 分)
alter table Course add Ccredit int;
foreign key () references ()
Grant <权限> on 表名[(列名)] to ⽤户 With grant option
授权命令是由数据库管理员使⽤的,若给⽤户分配权限时带
With grant option⼦句,则普通⽤户获权后,可把⾃⼰的权限授予其他⽤户。
字节填充
十六进制中出现(7D 5E),将其转译成7E
出现(7D 5D),将其转译成7D
出现小于20的字符,要在前面加上(7D x).
例如:
一个PPP帧的数据部分(十六进制) 是 7D 5E FE 27 7D 5D 7D 5D 65 7D 5E.试问真正的数巨是什么(十六进制写出)
解: 找出7D 和他后面的.跟据上面说的,我们转化成
7E FE 27 7D 7D 65 7E
零比特填充
二进制中二进制中的原则是连续5个1之后在后面填一个0,所以我们反过来转原码,就是遇5个连续1,把它后面紧跟的0删掉.
例如:
0110111111111100
我们将其转化成011011111,011111,000
逗号后面那个零是加上去的
反过来给出0001110111110111110110我们转成源码
000111011111,11111,110
逗号代表我们在其位置删掉了一个0
CSMA/CD协议
无连接的工作方式
- 不必先建立连接就可以直接发送数据
- 对发送的数据帧不进行编号,也不要求对方发回确认
- 这样做的理由是局域网信道的质量很好,因信道质量产生差错的概率是很小的
- 以太网提供的服务是不可靠的交付,即尽最大努力的交付当目的站收到有差错的数据帧时就丢弃此帧,其他什么也不做。差错的纠正由高层来决定
- 如果高层发现丢失了一些数据而进行重传,但以太网并不知道这是一个重传的帧,而是当作一个新的数据帧来发送
争用期
- 送数据帧的站,在发送数据帧后至多经过时间 2τ (两倍的端到端往返时延)就可知道发送的数据帧是否遭受了碰撞
- 的端到端往返时延 2τ 称为争用期,或碰撞窗口
- 用期这段时间还没有检测到碰撞,才能肯定这次发送不会发生碰撞
争用期的长度:
- 以太网取 51.2 us 为争用期的长度
- 对于 10 Mb/s 以太网,在争用期内可发送512 bit,即 64 字节
以太网在发送数据时,若前 64 字节没有发生冲突,则后续的数据就不会发生冲突
例:
使用CSMA/CD协议的10Mbit/s 以太网中,某个站发送数局势检测到碰撞,执行退避算法是选择了随机数为r=100.这个站需要等待多长时间才能再次发送数据?如果是100Mbit/s的以太网呢?
解:10Mbit/s的以太网,争用期是512比特时间,r=100 所以退避时间是51200比特时间.
等待时间就是51200/10=5120us=5.12ms
对于100Mbit/s的以太网,
最短有效帧长:
- 如果发生冲突,就一定是在发送的前 64 字节之内
- 由于一检测到冲突就立即中止发送,这时已经发送出去的数据一定小于 64 字节
- 以太网规定了最短有效帧长为 64 字节,凡长度小于 64 字节的帧都是由于冲突而异常中止的无效帧
$$ 最短有效帧长=总传播时延(tao)数据传数速率*2 $$
例:
假定1km长的CSMA/CD网络的数据率为1Gbit/s.设信号在网络上的传播速率为200000km/s.求能够使用此协议的最短帧长.
解:传播时延t(tao)=(1km)/(200000km/s)=5us .2t=10us;
发送:(1Gbit/s)*(10us)=10000bit
最短是10000bit
信道利用率
发送时间T,回复时间t,;
$$ a=t/T_0 $$
$$ 利用率S_{max}=T_0/(T_0+t)=1/(1+a) $$
无效帧规定:
- 真的长度不是整数个字节
- ==用收到的帧检测序列FCS(使用CRC)查处有差错==
- 收到的帧的MAC客户数据字段的长度不在46~1500字节之间,考虑到MAC帧首部和尾部的长度共有18字节,可以得出有效的MAC帧长度为64~1518字节之间
第四章
三种类别的IP地址
| | | | | |
| --- | --- | --- | --- | --- |IP地址的指派范围| 网络类别 | 最大可指派的网络数 | 第一个可指派的网络号 | 最后一个可指派的网络号 | 每个网络中的最大主机数 |
| A | 126(27 - 2) | 1 | 126 | 16777214 |
| B | 16383(214-1) | 128.1 | 191.255 | 65534 |
| C | 2097151(221-1) | 192.0.1 | 223.255.255 | 254 |