END$$ DELIMITER ;
调用该存储过程并查看结果。
思考题:
1. 创建存储过程,要求当一个员工的工作年份大于6年时将其转到经理办公室工作。
2. 创建存储过程,使用游标计算本科及以上学历的员工在总员工数中所占的比例。
2.存储函数
(1)创建一个存储函数,返回员工的总人数。
CREATE FUNCTION EM_NUM( )
RETURNS INT
RETURN(SELECT COUNT(*) FROM Employees);
调用该存储函数:
SELECT EM_NUM();
(2)创建一个存储函数,检验一个员工号是否在Salary表中有但在Employees表中不存在,若是则删除Salary表中该员工并返回TRUE,否则返回FALSE。
DELIMITER $$
CREATE FUNCTION DELETE_EM(EM_ID CHAR(6) )
RETURNS BOOLEAN BEGIN
DECLARE NUM1,NUM2 INT;
SELECT COUNT(*) INTO NUM1 FROM Salary WHERE EmployeeID=EM_ID;
SELECT COUNT(*) INTO NUM2 FROM Employees WHERE EmployeeID=EM_ID;
IF NUM1=1 AND NUM2=0 THEN
30
DELETE FROM Salary WHERE EmployeeID=EM_ID; RETURN TRUE;
ELSE
RETURN FALSE; END IF; END$$ DELIMITER ;
调用该存储函数:
SELECT DELETE_EM ('000001');
往Salary表中插入一行记录后调用该存储函数。
INSERT INTO Salary values('000002',1212,123); SELECT DELETE_EM ('000002');
观察并总结上面两次调用结果的不同。
思考题:
1. 创建存储函数,判断员工是否在研发部工作,若是则返回其学历,若不是则返回字符串“NO”。
3.触发器
(1)创建触发器,在Employees表中删除员工信息的同时将Salary表中该员工的信息删除,以确保数据完整性。
CREATE TRIGGER DELETE_EM AFTER DELETE
ON Employees FOR EACH ROW
DELETE FROM Salary WHERE EmployeeID=OLD. EmployeeID;
创建完后删除Employees表中的一行数据,然后查看Salary表中的变化情况。
(2)创建表Departments1,其结构和内容与表Departments都相同
CREATE TABLE Departments1 LIKE Departments;
INSERT INTO Departments1 SELECT * FROM Departments;
在表Departments上创建一个触发器,如果添加一个新的部门,该部门也会添加到表Departments1中。
31
DELIMITER $$
CREATE TRIGGER Departments_Ins AFTER INSERT BEGIN END$$ DELIMITER ;
创建完后添加一个部门到Departments,然后查看Departments1表中的变化情况。
ON Departments FOR EACH ROW INSERT INTO Departments1
VALUES(NEW.DepartmentID,NEW.DepartmentName,NEW.Note);
(3)创建触发器,当修改Employees表时,若将Employees表中员工的工作时间增加1年,则将收入增加500,增加2年则增加1000,依次类推。若工作时间减少则无变化。
DELIMITER $$
CREATE TRIGGER ADD_SALARY AFTER UPDATE BEGIN
DECLARE YEARS INT;
SET YEARS=NEW.WorkYear-OlD.WorkYear; IF YEARS>0 THEN
UPDATE Salary SET InCome=InCome+500*YEARS WHERE
EmployeeID=NEW. EmployeeID;
END IF;
END$$ DELIMITER ;
创建完后修改Employees表中的一个职工的工作时间,然后查看Salary表中对应职工的收入变化情况。
ON Employees FOR EACH ROW
思考题:
1. 创建UPDATE触发器,当表Departments中的部门号发生变化时,Employees表中的员工所属的部门号也将改变。
32
4.事件
(1)创建一个立即执行的事件,插入Employees表中一行数据。
CREATE EVENT DIRECT
ON SCHEDULE AT NOW() DO
INSERT INTO employees (EmployeeID, Name, Education, Birthday, Sex, WorkYear, Address, PhoneNumber, DepartmentID) VALUES
('110011','王小林','大专','1966-01-23','1','1996-09-01','中山路
32-1-508','83355668','2');
(2)创建一个事件,每天执行一次,它从明天开始直到2013 年12月31日结束。
CREATE EVENT every_day
ON SCHEDULE EVERY 1 DAY
STARTS CURDATE()+INTERVAL 1 DAY ENDS '2013 -12-31' DO
SELECT * FROM Employees; 思考题:
本次实验中遇到的问题及解决方法。
33
实验9 备份与恢复
实验类型: 验证型 实验课时: 2 指导教师: 时 间:20 年 月 日 课 次:第 节 教学周次:第 周 实验分室: 实验台号: 实 验 员:
实验目的:
1.掌握界面方式下数据库的备份和还原 2.掌握使用SQL语句进行数据库备份和恢复 3.掌握使用客户端程序进行数据库的备份和还原
实验要求:
理解数据库的备份和还原的重要性及基本方法
实验内容:
1.界面方式下进行数据库备份和还原 2.SQL语句进行数据库备份和还原 3.使用客户端程序进行数据库的备份和还原
实验步骤:
说明:按实验步骤对数据库YGGL中的三个表进行操作,三个表结构如下(具体参看实验2): Departments (DepartmentID,DepartmentName,Note) Employees
(EmployeeID,Name,Sex,Birthday,Education,WorkYear,Address,PhoneNumber,DepartmentID)
Salary(SalaryID,InCome,OutCome,Time, EmployeeID) 要求:将实验步骤中紫色底纹部分填上正确答案。 1. 界面方式下进行数据库备份和还原
(1)在MySQL Workbench中进行数据库YGGL的备份。 (2)在MySQL Workbench中进行数据库YGGL的恢复。 2.用SQL语句进行数据库备份和还原
使用SQL语句只能备份和恢复表的内容,如果表的结构损坏,则要先恢复表的结构才能恢复数据。
34