SQL题库:sqllearning4?—触发器、数据库存储练习

2021/10/10 16:50:29

本文主要是介绍SQL题库:sqllearning4?—触发器、数据库存储练习,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

出处

MySQL数据库存储过程讲解与实例_Xiar_c的博客-CSDN博客_mysql存储过程实例详解https://blog.csdn.net/weixin_41177699/article/details/80553643#comments_15462838


MySQL数据库触发器讲解与案例_Xiar_c的博客-CSDN博客_mysql数据库触发器一、触发器语法了解二、结合学生选课表进行实操一、触发器语法了解:    MySQL 5.1开始包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。【创建触发器】在MySQL中,创建触发器语法如下:CREATE TRIGGER trigger_name trigger_time trigger_eventON ...https://blog.csdn.net/weixin_41177699/article/details/80302987?spm=1001.2014.3001.5501

准备工作

#建学生情况表xsqk
DROP table IF EXISTS xsqk;
create table xsqk
(
系别 char(10),
班级 Char(12),
专业 Varchar(30),
学号 Char(8) not null primary key,
姓名 Char(8) not null,
性别 Char(2) default '男',
出生年月 DATE,
总学分 Tinyint(1) ,
备注 Text(16)
);

#建学生课程表xskc
DROP table IF EXISTS xskc;
create table xskc
(
课程号 char(3) not null primary key,
课程名Char(16) not null,
开课学期Tinyint (1) not null check (开课学期([123456789])),
学时Tinyint (1) not null,
学分 Tinyint (1)
);

#建学生成绩表xscj
DROP table IF EXISTS xscj;
create table xscj
(
学号 char(8) not null primary key,
课程号Char(3) not null primary key,
成绩Tinyint (1),
学分Tinyint (1) 
);


#添加xsqk记录
INSERT INTO xsqk VALUES('计算机','计算机0203','计算机应用与维护','02020101','王玲玲','女','1981-8-26','9',NULL);
INSERT INTO xsqk VALUES('计算机','计算机0203','计算机应用与维护','02020102','张燕红','女',' 1981-10-20','9',NULL);
INSERT INTO xsqk VALUES('计算机','计算机0203','计算机应用与维护','02020103','杨勇','男',' 1982-3-15', NULL,NULL);
INSERT INTO xsqk VALUES('计算机','计算机0203','计算机应用与维护','02020104','王红庆','男',' 1983-5-17', NULL,NULL);
INSERT INTO xsqk VALUES('计算机','计算机0203','计算机应用与维护','02020105','陈园','女',' 1982-4-12', NULL,NULL);
INSERT INTO xsqk VALUES('计算机','信息管理0201','信息管理','02020201','黄薇娜','女',' 1983-8-19', '8',NULL);
INSERT INTO xsqk VALUES('计算机','信息管理0201','信息管理','02020202','沈昊','男',' 1982-3-18', '8',NULL);
INSERT INTO xsqk VALUES('计算机','信息管理0201','信息管理','02020203','傅亮达','男',' 1983-1-22', NULL,NULL);
INSERT INTO xsqk VALUES('计算机','信息管理0201','信息管理','02020204','任建刚','男',' 1981-12-21', NULL,NULL);
INSERT INTO xsqk VALUES('计算机','信息管理0201','信息管理','02020205','叶小红','女',' 1983-7-16', NULL,NULL);

 #添加xskc记录
INSERT INTO xskc VALUES('101','计算机文化基础','1','86','4');
INSERT INTO xskc VALUES('102','Qbasic','1','68','4');
INSERT INTO xskc VALUES('205','离散数学','3','64','4');
INSERT INTO xskc VALUES('206','VC','2','68','4');
INSERT INTO xskc VALUES('208','数据结构','2','68','4');
INSERT INTO xskc VALUES('210','操作系统','3','68','4');
INSERT INTO xskc VALUES('212','计算机组成','4','86','5');
INSERT INTO xskc VALUES('216','数据库原理','2','68','4');
INSERT INTO xskc VALUES('301','计算机网络','5','56','3');


#添加xscj记录

INSERT INTO xscj VALUES('02020101','101','85','4');
INSERT INTO xscj VALUES('02020101','102','70','5');
INSERT INTO xscj VALUES('02020102','101','90','4');
INSERT INTO xscj VALUES('02020102','102','80','5');
INSERT INTO xscj VALUES('02020201','101','86','4');
INSERT INTO xscj VALUES('02020201','208','80','4');
INSERT INTO xscj VALUES('02020202','208','50','4');
INSERT INTO xscj VALUES('02020202','216','60','4');

查看数据

 

存储过程练习

//*
MySQL存储过程的创建语法
DELIMITER //
  CREATE PROCEDURE myproc(OUT s int)
    BEGIN
      SELECT COUNT(*) INTO s FROM students;
    END
    //
DELIMITER ;
*//

1. 创建一存储过程,求l+2+3+…+n,并打印结果。
-- 先使用MySQL语句创建存储过程,再使用call语句调用这一存储过程查看结果,可以看到由于未输入n的值,sum结果为0。
DELIMITER //
CREATE PROCEDURE addresult()
BEGIN
    DECLARE i INT;
		DECLARE sum INT;
		DECLARE n INT;
		
		SET i=1;
		SET sum=0;
		
		WHILE i <= n DO
		  SET sum=sum+i;
	    SET i=i+1;
	  END WHILE;
    SELECT sum;
		END
    //
DELIMITER ;

CALL addresult;

2.调用上面的addresult存储过程,打印l十2+3+…+10的结果。
-- 在第一题的addresult过程基础上,加上一条“set n=10”语句,设定n的值,调用该过程后打印结果,可以看到结果为sum=1+2+3+...+10=55。
DELIMITER //
DROP PROCEDURE IF EXISTS addresult;
CREATE PROCEDURE addresult()
BEGIN
    DECLARE i INT;
		DECLARE sum INT;
		DECLARE n INT;
		
		SET i=1;
		SET sum=0;
		SET n=10;
		
		WHILE i <= n DO
		  SET sum=sum+i;
	    SET i=i+1;
	  END WHILE;
    SELECT sum;		
END
    //
DELIMITER ;

CALL addresult;

3. 修改上述存储过程为addresult1,使得n为输入参数,其具体值由用户调用此存储过程时指定。
-- 在这里需要注意的是,MySQL存储过程只能改名字和定义,不能改里面的内容。要删了重新建。所以这里选择重新建立一个addresult1过程,调用后输入n,查看打印结果。
DELIMITER //
DROP PROCEDURE IF EXISTS addresult1;
CREATE PROCEDURE addresult1 (IN n INT)
BEGIN
    DECLARE i INT;
		DECLARE sum INT;
		
		SET sum=0;
		SET i=1;
		
		WHILE i <= n DO
		  SET sum=sum+i;
	    SET i=i+1;
	  END WHILE;
    SELECT sum;		
		END
    //
DELIMITER ;



4.调用上面修改后的addresult1存储过程,打印l+2+3+…+100的结果。
-- 调用上述过程,输入参数n为100,可以看到打印结果中sum=5050,结果正确。
CALL addresult1;

5. 修改上述存储过程为addresult2,将n参数设定默认值为10,并改设sum为输出参数,让主程序能够接收计算结果。
-- 将3中存储过程中的“in n int”修改为“out sum int”,并在存储过程中设定n默认值为10。
DELIMITER //
DROP PROCEDURE IF EXISTS addresult2;
CREATE PROCEDURE addresult2 (OUT sum INT)
BEGIN
    DECLARE i INT;
		DECLARE n INT;
		
	  SET sum=0;	
		SET i=1;
		SET n=10;
		
		WHILE i <= n DO
		  SET sum=sum+i;
	    SET i=i+1;
	  END WHILE;
    SELECT sum;
		END
    //
DELIMITER ;

6.调用上面修改后的addresult2存储过程,设置变量接收计算l+2+3+…+10的结果。
-- 调用addresult2过程,可以看到输出结果sum=55。
CALL addresult2;

7.创建一存储过程Proc_Student,用于显示学号为“0102”的学生基本信息(包括学号、姓名、性别和系)。
-- 创建存储过程,将查询语句写在存储过程中,相当于将一个查询语句封装在存储过程中,通过调用这个存储过程,便可执行该查询操作。
DELIMITER //
CREATE PROCEDURE proc_student ()
BEGIN
    SELECT 学号,姓名,性别,系别
		FROM xsqk
		WHERE 学号='0102';
		END
    //
DELIMITER ;

8.创建一存储过程Stu_grade,通过读取某门课的编号,求出不及格的学生的学号。
-- 同上一题,将查询过程封装在存储过程中,并且使用“int ID int”来实现课程编号的自定义输入,再根据输入的课程编号进行查询。
DELIMITER //
CREATE PROCEDURE stu_grade (IN ID INT)
BEGIN
    SELECT 学号
		FROM xscj
		WHERE 成绩<60 AND 课程号=ID;
		END
    //
DELIMITER ;

9.调用上面的存储过程Stu_grade,求出课程编号为“0101”的不及格的学生。
-- 调用存储过程Stu_grade,输入课程编号为“0101”,查看打印结果。
CALL stu_grade;

10.创建一存储过程avgGrade,通过读取学生的学号,以参数形式返回该学生的平均分。
-- 在创建存储过程时,设定学号为输入,平均成绩为输出,且因为平均成绩可能出现小数,所以设定其数据类型为float。通过select语句将平均分以参数形式返回。

DELIMITER //
CREATE PROCEDURE avgGrade (IN xuehao INT,OUT avggrade FLOAT)
BEGIN
    SELECT AVG(成绩)
		FROM xscj
		WHERE 学号=xuehao;
		SELECT avggrade;
		END
    //
DELIMITER ;

11.调用上面的存储过程avgGrade,求出学号为“990102014”的平均分。
-- 输入学号与输出参数,可以看到该学生的平均成绩被打印出来。

CALL avgGrade;

12.删除上述存储过程avgGrade。
-- 对于存储过程的删除,使用drop语句即可。
DROP PROCEDURE avgGrade;

13.创建存储过程search,该存储过程有三个参数,分别为t、p1,p2,根据这些参数,找出书名与t有关,价格在p1与p2(p2>=p1)之间的书的编号,书名,价格,出舨日期。如果用户调用时没有指定t参数的值.则表示可为任意值,如用户没有指定p2,则书本价格没有上限。用到的关系为:titles (title_id,title,price,pubdate)。


DELIMITER //
DROP PROCEDURE IF EXISTS search;
CREATE PROCEDURE search (t VARCHAR(20),p1 INT,p2 VARCHAR(20))
BEGIN
    IF t IS NULL
		AND p2 IS NULL THEN
		SELECT 书号,书名,定价,出版日期 
		FROM 图书 
		WHERE 定价>p1;
		
		ELSEIF t IS NULL
		AND p2 IS NOT NULL THEN
		SELECT 书号,书名,定价,出版日期 
		FROM 图书 
		WHERE 定价>p1 AND 定价<=p2;
		
		ELSEIF t IS NOT NULL
		AND p2 IS NULL THEN
		SELECT 书号,书名,定价,出版日期 
		FROM 图书 
		WHERE 定价>p1 AND 书名 LIKE CONCAT('%',t,'%');	
		
		ELSEIF t IS NOT NULL
		AND p2 IS NOT NULL THEN
		SELECT 书号,书名,定价,出版日期 
		FROM 图书 
		WHERE 定价>p1 AND 定价<=p2 AND 书名 LIKE CONCAT('%',t,'%');	
		
		END IF;
		
		END
    //
DELIMITER ;


14.调用上面的存储过程search,求出书名与computer有关,而且价格小于$20大于$10的书。

-- 调用存储过程search,将参数computer,10,20传入,查看打印结果。

CALL search;

触发器练习

//*
【创建触发器】
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt

trigger_name:标识触发器名称,用户自行指定;
trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;
trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句。

【查看触发器】
SHOW TRIGGERS [FROM schema_name];

【删除触发器】
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
*//

1、在学生成绩库中创建触发器trigger1,实现如下功能:当在学生成绩表(xscj)中插入一条学生选课信息后,自动实现更新该学生在学生情况表(xsqk)中的总学分信息。
-- 分析:根据题意,要求在学生成绩表中插入一条记录时,自动更新学生情况表中的相应记录信息。可以通过在学生成绩表中定义INSERT类型的触发器,触发器中语句要完成的功能是更新学生情况表中的相应学生的总学分信息。其实,只要在该生原总学分基础上加上新选课程的学分就可以了。

CREATE TRIGGER trigger1 AFTER INSERT ON xscj
FOR EACH ROW
BEGIN
  UPDATE xsqk
	SET 总学分=总学分+new.学分 WHERE 学号=new.学号;
END

2、创建触发器trigger3,实现当删除学生课程表中某门课程的记录时,对应学生成绩表中所有有关此课程的记录均删除。

CREATE TRIGGER trigger3 AFTER DELETE ON xskc
FOR EACH ROW
BEGIN
  DELETE xscj FROM xscj
	WHERE xscj.课程号=old.课程号;
END

3、创建触发器trigger4,实现当修改学生课程表(xskc)中的某门课的课程号时,对应学生成绩表(xscj)中的课程号也作相应修改。

CREATE TRIGGER trigger4 AFTER UPDATE ON xskc
FOR EACH ROW
BEGIN
   UPDATE xscj
	 SET xscj.课程号=new.课程号
	 WHERE xscj.课程号=old.课程号;
END

-- 将学生课程表中Qbasic课程的课程号改为505后,在xscj中的课程号也发生改变,变成了505

4、创建触发器trigger5,实现当向学生成绩表(xscj)中插入一条选课记录时,查看该学生的信息是否存在在学生信息表中,如果不存在,则把该学生的基本信息加入到学生信息表中。

CREATE TRIGGER trigger5 AFTER INSERT ON xscj
FOR EACH ROW
BEGIN
   IF NOT EXISTS (SELECT * FROM xsqk WHERE 学号=new.学号) THEN
	 INSERT INTO xsqk (学号,姓名) VALUES (new.学号,'未知');
	 END IF;
END


-- 使用以上语句,因为在xscj表中只可能插入学生的学号,而在更新xsqk表时,发现姓名是不能为空的,所以在触发器处设定姓名为“未知”。在xscj表中插入了一条学号为4444444的记录后,在xsqk表中,可以看到增加了一条相应的记录。



这篇关于SQL题库:sqllearning4?—触发器、数据库存储练习的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程