使用关系代数表示每个查询
S (SNO, SN, AGE, SEX) C (CNO, CN, CREDIT) SC (SNO, CNO, SCORE)
- 查询课程号为
C1
的学生的学号和成绩:
- 查询课程号为
C2
的学生的学号和姓名:
❗$∏_{SNO,SN}(σ_{CNO='C2'}(S⋈SC))$
或者写为(先查找C2的学生号,在连接学生表S):
- 查询课程名字为
maths
的学生的学号和姓名:
- 查询课程号为
C3
或C4
的学生的学号:
- 查询没有选修课程号为
C5
的学生的学号,姓名:
Teache (Tno, Tname, Tage, Tsex) Department (Dno, Dname, Tno)(Tno是管理这个department的系主任) Work (Tno, Dno, Year, Salary)
- 列出工资超过5000的教师的不同年龄:
❓$∏_{Tage}(Teather⋈σ_{Salary>5000}(Work))$
- 查找不在计算机系工作的教师代码:
- 系主任T1管辖范围内的所有教师姓名:
学生S (学号S#, 姓名SN, 所在系SD, 年龄SA) 课程C (课程号C#, 课程名CN, 先修课程号PC#) 成绩SC (学号S#, 课程号C#, 成绩G)
- 检索年龄大于等于20岁的学生的姓名:
- 检索先修课程号为C2的课程号和课程名。
- 检索课程号C1的成绩为90分以上的所有学生的姓名。
- 检索001号学生选修的所有课程名及先修课程号。
- 检索计算机系学生所选修课程的课程号和课程名。
(1)关系模式R的主关键字是
{运动员编号, 项目号}
(2)R最高属干第一范式(1NF)。 因为存在着姓名,性别,班级,项目名对主关键字{运动员编号,项目号}的部分函数依赖,所以没有达到2NF。
(3)首先分解为2NF:
R1运动员(运动员编号,姓名,性别,班级,班主任)
R2比赛项目(项目号,项目名)
R3比赛(运动员编号,项目号,成绩)
因为 R1 中还存在班主任对运动员编号的传递函数依赖,所以没有达到3NF,再分解为3NF:
R1运动员(运动员编号,姓名,性别,班级)
R2比赛项目(项目号,项目名)
R3比赛(运动员编号,项目号,成绩)
R4班级(班级,班主任)
建数据库表
CREATE TABLE Employees
(
EmployeeID char(6) not null,
Name char(10) not null,
Education char(4) not null,
Brithday date not null,
Sex char(2) not null default '1',
EntryYear tinyint(1),
Address varchar(20),
PhoneNumber char(12),
DepartmentID char(3) not null,
PRIMARY key(EmployeeID)
)engine=innodb;
CREATE TABLE Departments(
departmentID char(3) not null PRIMARY KEY,
departmentName char(20) not NULL,
note text(16)
);
CREATE TABLE Salary(
employmeeID char(6) not NULL PRIMARY KEY,
Income float(8) not NULL,
Outcome float(8) not NULL
);
在员工管理数据库中创建触发器delete_em,在Employees表中删除员工信息的同时,将Salary表中该员工的信息删除,以确保数据完整性。(员工管理数据库详见P250-251)
delimiter $$
create TRIGGER delete_em AFTER DELETE
ON Employees for each row
begin
delete from salary where EmployeeID = old.EmployeeID;
end $$
delimiter ;
-- 展示
show create trigger delete_em;
-- eg:
delete from Employees where EmployeeID='010008';
在员工管理数据库中创建触发器update_dept,当Departments表中的部门号发生变化时,Employees表中员工所属部门号也将改变。(员工管理数据库详见P250-251)
delimiter $$
create trigger update_dept after update
on departments for each row
begin
update Employees set departmentid = new.departmentid
where departmentID = old.departmentID;
end $$
delimiter ;
-- 展示
show create trigger update_dept;
-- eg
SET FOREIGN_KEY_CHECKS = 0;
UPDATE Departments SET DepartmentID='6' WHERE DepartmentID='5';
SET FOREIGN_KEY_CHECKS = 1;