sql过程、函数、触发器语句练习

 过程和函数

1. 根据编号查询名字【传入编号,获取名字】

2. 根据编号查询vip的名字(传入编号,获取名字和性别)

3. 创建过程,根据输入的成绩编号【pk】,获取该学号,科目号以及成绩

4. 创建过程,根据输入的成绩编号【pk】,获取该学生名字,科目名号以及成绩

5. 输入员工号,查找员工名字,上级领导名字 以及 工资

7. 使用存储函数|过程 传入学号,获取学生的姓名,总分,平均分

 --1. 根据编号查询名字【传入编号,获取名字】 
 --过程:
 delimiter$$
			CREATE PROCEDURE demo1(v_id INT , OUT v_name VARCHAR(50))
			 BEGIN
			 SELECT vipname into v_name FROM vip WHERE vipid = v_id; 
 END$$
 delimiter ;
 CALL demo1(1,@vname);
 SELECT @vname;
 
 --函数
DELIMITER $$
CREATE FUNCTION fun1(v_id INT) RETURNS VARCHAR(50)
BEGIN
DECLARE vname VARCHAR(50);
SELECT vipname INTO vname FROM vip WHERE vipid = v_id;
RETURN vname;
END$$
DELIMITER ;
SELECT fun1(1) vipname;
 --2. 根据编号查询vip的名字(传入编号,获取名字和性别) 
 --过程
  delimiter$$
			CREATE PROCEDURE demo2(v_id INT , OUT v_name VARCHAR(50),OUT v_sex VARCHAR(50))
			 BEGIN
			 SELECT vipname,vipsex into v_name,v_sex FROM vip WHERE vipid = v_id; 
 END$$
 delimiter ;
 CALL demo2(1,@vname,@vsex);
 SELECT @vname,@vsex; 
 --函数
 USE pppp;
 DELIMITER $$
CREATE FUNCTION fun2(v_id INT,vname VARCHAR(50),vsex VARCHAR(50)) RETURNS VARCHAR(50)
BEGIN
SELECT vipname,vipsex INTO vname,vsex FROM vip WHERE vipid = v_id;
RETURN CONCAT(vname,'--',vsex);
END$$
DELIMITER ;
DROP FUNCTION fun2;
SELECT fun2(1,@vname,@vsex) '名字--性别';
 --3. 创建过程,根据输入的成绩编号【pk】,获取该学号,科目号以及成绩 
 USE myschool;
 --过程
 delimiter$$
			CREATE PROCEDURE demo3(mid INT , OUT sno VARCHAR(50),OUT sid INT,OUT sresult INT)
			 BEGIN
			  SELECT StudentNo,SubjectId,StudentResult INTO sno,sid,sresult FROM result WHERE Id = mid;
 END$$
 delimiter ;
 DROP PROCEDURE demo3;
 CALL demo3(1,@sno,@sid,@sresult);
 SELECT  @sno,@sid,@sresult;
 --函数
  DELIMITER $$
CREATE FUNCTION fun3(mid INT,sno VARCHAR(50),sid INT,sresult INT) RETURNS VARCHAR(50)
BEGIN
SELECT StudentNo,SubjectId,StudentResult INTO sno,sid,sresult FROM result WHERE Id = mid;
RETURN CONCAT(sno,'--',sid,'--',sresult);
END$$
DELIMITER ;
DROP FUNCTION fun3;
SELECT fun3(1,@sno,@sid,@sresult) '学号--id--成绩';
 --4. 创建过程,根据输入的成绩编号【pk】,获取该学生名字,科目名号以及成绩 
 --过程
  delimiter$$
			CREATE PROCEDURE demo4(mid INT , OUT sname VARCHAR(50),OUT subname VARCHAR(50),OUT sresult INT)
			 BEGIN
			 DECLARE sid int;
			 DECLARE sno VARCHAR(50);
			  SELECT SubjectId,StudentNo,StudentResult INTO sid,sno,sresult FROM result WHERE Id = mid;
				SELECT SubjectName INTO subname FROM subjects WHERE SubjectId = sid;
				SELECT StudentName INTO sname FROM student WHERE StudentNo = sno;
 END$$
 delimiter ;
 DROP PROCEDURE demo4;
 CALL demo4(1,@sname,@subname,@sresult);
 SELECT  @sname,@subname,@sresult;
 --函数
   DELIMITER $$
CREATE FUNCTION fun4(mid INT,sname VARCHAR(50), subname VARCHAR(50), sresult INT)RETURNS VARCHAR(50)
BEGIN
DECLARE sid int;
			 DECLARE sno VARCHAR(50);
			  SELECT SubjectId,StudentNo,StudentResult INTO sid,sno,sresult FROM result WHERE Id = mid;
				SELECT SubjectName INTO subname FROM subjects WHERE SubjectId = sid;
				SELECT StudentName INTO sname FROM student WHERE StudentNo = sno;
RETURN CONCAT(sname,'--',subname,'--',sresult);
END$$
DELIMITER ;
DROP FUNCTION fun4;
SELECT fun4(1,@sname,@subname,@sresult) '姓名--科目--成绩';
 --5. 输入员工号,查找员工名字,上级领导名字 以及 工资 
 --过程
 USE mytest;
   delimiter$$
			CREATE PROCEDURE demo5(eid INT , OUT ename VARCHAR(50),OUT mname VARCHAR(50),OUT esalary INT)
			 BEGIN
			 DECLARE mid int;
			  SELECT CONCAT(first_name,'-',last_name),manager_id,salary INTO ename,mid,esalary FROM employees WHERE employee_id  = eid;
				SELECT CONCAT(first_name,'-',last_name)  INTO mname FROM employees WHERE employee_id  = mid;
 END$$
 delimiter ;
 DROP PROCEDURE demo5;
 CALL demo5(105,@ename,@mname,@esalary);
 SELECT  @ename,@mname,@esalary;
 --函数
    delimiter$$
			CREATE FUNCTION fun5(eid INT ,  ename VARCHAR(50), mname VARCHAR(50), esalary INT)RETURNS VARCHAR(50)
			 BEGIN
			 DECLARE mid int;
			  SELECT CONCAT(first_name,'-',last_name),manager_id,salary INTO ename,mid,esalary FROM employees WHERE employee_id  = eid;
				SELECT CONCAT(first_name,'-',last_name)  INTO mname FROM employees WHERE employee_id  = mid;
				RETURN CONCAT(ename,'-',mname,'-',esalary);
 END$$
 delimiter ;
 DROP FUNCTION fun5;
 SELECT fun5(105,@ename,@mname,@esalary) '员工名-领导名-工资';
 --7. 使用存储函数|过程 传入学号,获取学生的姓名,总分,平均分
USE myschool;
--过程	
 delimiter$$
 CREATE PROCEDURE demo7(sno VARCHAR(50),OUT sname VARCHAR(50),OUT sumscore INT,OUT  avgscore INT)
 BEGIN
		SELECT StudentName INTO sname FROM student WHERE StudentNo = sno;
		SELECT SUM(StudentResult),AVG(StudentResult) INTO sumscore, avgscore FROM result WHERE StudentNo = sno GROUP BY StudentNo;
 END$$
 delimiter ;
 drop PROCEDURE demo7;
 CALL demo7('s1001',@sname,@sumscore,@avgscore);
 SELECT @sname,@sumscore,@avgscore;
 --函数
  delimiter$$
 CREATE FUNCTION fun7(sno VARCHAR(50), sname VARCHAR(50), sumscore INT,  avgscore INT)RETURNS VARCHAR(50)
 BEGIN
		SELECT StudentName INTO sname FROM student WHERE StudentNo = sno;
		SELECT SUM(StudentResult),AVG(StudentResult) INTO sumscore, avgscore FROM result WHERE StudentNo = sno GROUP BY StudentNo;
		RETURN CONCAT(sname,'-',sumscore,'-',avgscore);
 END$$
 delimiter ;
 SELECT fun7('s1001',@sname,@sumscore,@avgscore) '名字-总分-平均分';

过程

8. 输入,科目名字,学时,以及gradeid ,将该数据插入到数据库

9. 根据传入的科目编号删除科目信息,如果该科目以及被考过试,则不能删除

--8. 输入,科目名字,学时,以及gradeid ,将该数据插入到数据库 
  delimiter$$
 CREATE PROCEDURE demo8(sid INT,sname VARCHAR(50), shour INT, gid INT)
 BEGIN
		INSERT INTO subjects VALUES(sid,sname,shour,gid);
		 SELECT * FROM subjects;
 END$$
 delimiter ;
 drop PROCEDURE demo8;
 CALL demo8(6,'近代史',48,2);
 --9. 根据传入的科目编号删除科目信息,如果该科目已经被考过试,则不能删除 
 delimiter$$
 CREATE PROCEDURE demo9(sid INT)
 BEGIN
 DECLARE scount INT;
	   SELECT COUNT(1) into scount FROM result WHERE SubjectId = sid;
		 IF scount = 0 THEN
		    DELETE FROM subjects WHERE SubjectId = sid;
				END if;
				SELECT * FROM subjects;
 END$$
 delimiter ;
 drop PROCEDURE demo9;
 CALL demo9(5);

触发器

10. 自动更新会员等级, -- 总金额达到2000的时候,等级编号变为2 -- 总金额达到5000的时候,等级编号变为3 -- 总金额达到10000的时候,等级编号变为4 -- 总金额达到20000的时候,等级编号变为5

USE pppp;
 delimiter$$
 CREATE TRIGGER setlevel AFTER INSERT ON sales FOR EACH ROW
 BEGIN 
 DECLARE summoney INT;
 SELECT SUM(smoney) into summoney FROM sales WHERE vipid = new.vipid;
 IF summoney >= 20000 THEN
  update vip SET viplevel = 5 WHERE vipid = new.vipid;
	ELSEif summoney >= 10000 THEN
  update vip SET viplevel = 4 WHERE vipid = new.vipid;
	ELSEif summoney >= 5000 THEN
  update vip SET viplevel = 3 WHERE vipid = new.vipid;
	ELSEif summoney >= 2000 THEN
	update vip SET viplevel = 2 WHERE vipid = new.vipid;
	END if;
 END$$
 delimiter ;
 INSERT INTO sales VALUES(1,2000,null,1);
 SELECT * FROM vip WHERE vipid =1;
 INSERT INTO sales VALUES(2,3000,null,1);
  SELECT * FROM vip WHERE vipid =1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗着,享受着

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值