使用sql语句完成任务:(一)存储函数的创建与使用 1.定义一个函数,计算两个数的最大公约数。 a) 输入两个整数。 b) 输出最大公约数。 c) 请用两种不同的方法实现gcd1()和gcd2()。 d) 调用c)中的两个函数,查找45和18的最大公约数。 e) 提示:可以通过辗转相除法找到两个数的最大公约数,流程图6-1如下。 图 6 1最大公约数流程图 2.课程的评分通常分为百分制和等级制。创建存储函数do_convert(),实现其转换,要求: a) 输入指定百分制成绩。 b) 输出对应的等级制成绩。 c) 转换规则,如果>=90分则为优秀,80-90(包含80)为良好,70-80(包含70)为中等,60-70(包含60)为及格,否则为不及格。 d) 查询该函数是否创建成功。 e) 使用d)中的函数,查询A课程学生的等级成绩,查询输出如下。 输出如下: 学生学号 学生姓名 学生班级号 等级制成绩 (二)触发器的创建与使用 1.使用触发器实现单列取值的范围约束。要求tbl_student学生表的生日字段要么为空,要么必须大于等于‘1900-01-01‘,小于今年。 a) 实现触发器birthday_check_trigger对表的更新约束。 b) 请找两个例子,验证触发器是否是实现了检查约束。 2.在进销存数据库创建触发器,对数据进行一致性约束。当销售表tbl_sell增加一条数据时,商品表的tbl_goods库存量减去对应的销量。当进货表tbl_receive增加一条数据时,商品表的库存量增加对应的进货数量。
时间: 2024-02-16 15:03:06 浏览: 79
SQL代码_存储过程、存储函数、查询语句_purplev97_indeed7go_
对于第一部分,存储函数的创建与使用,我可以给出以下的 SQL 代码实现:
1. gcd1() 函数的创建:
```
CREATE FUNCTION gcd1(a INT, b INT)
RETURNS INT
BEGIN
DECLARE r INT;
WHILE b != 0 DO
SET r = a % b;
SET a = b;
SET b = r;
END WHILE;
RETURN a;
END;
```
2. gcd2() 函数的创建:
```
CREATE FUNCTION gcd2(a INT, b INT)
RETURNS INT
BEGIN
IF b = 0 THEN
RETURN a;
ELSE
RETURN gcd2(b, a % b);
END IF;
END;
```
3. 调用 gcd1() 和 gcd2() 函数:
```
SELECT gcd1(45, 18);
SELECT gcd2(45, 18);
```
4. do_convert() 函数的创建:
```
CREATE FUNCTION do_convert(score INT)
RETURNS VARCHAR(10)
BEGIN
DECLARE grade VARCHAR(10);
IF score >= 90 THEN
SET grade = '优秀';
ELSEIF score >= 80 THEN
SET grade = '良好';
ELSEIF score >= 70 THEN
SET grade = '中等';
ELSEIF score >= 60 THEN
SET grade = '及格';
ELSE
SET grade = '不及格';
END IF;
RETURN grade;
END;
```
5. 查询 do_convert() 函数是否创建成功:
```
SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM information_schema.ROUTINES
WHERE ROUTINE_NAME = 'do_convert';
```
6. 使用 do_convert() 函数查询 A 课程学生的等级成绩:
```
SELECT student_id, student_name, class_id, do_convert(score)
FROM score
WHERE course_name = 'A';
```
对于第二部分,触发器的创建与使用,我可以给出以下的 SQL 代码实现:
1. 创建生日检查触发器:
```
CREATE TRIGGER birthday_check_trigger
BEFORE INSERT ON tbl_student
FOR EACH ROW
BEGIN
IF NEW.birthday < '1900-01-01' OR NEW.birthday > CURDATE() THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Birthday must be between 1900-01-01 and today.';
END IF;
END;
```
2. 验证触发器是否实现了检查约束,例如:
```
-- 例子1:插入生日为空的记录
INSERT INTO tbl_student (student_id, student_name, birthday, class_id) VALUES (1, 'Tom', NULL, 1);
-- 例子2:插入生日不在范围内的记录
INSERT INTO tbl_student (student_id, student_name, birthday, class_id) VALUES (2, 'Jerry', '1899-12-31', 2);
```
3. 创建销售和进货触发器:
```
-- 销售表
CREATE TRIGGER sell_trigger
AFTER INSERT ON tbl_sell
FOR EACH ROW
BEGIN
UPDATE tbl_goods
SET stock = stock - NEW.quantity
WHERE goods_id = NEW.goods_id;
END;
-- 进货表
CREATE TRIGGER receive_trigger
AFTER INSERT ON tbl_receive
FOR EACH ROW
BEGIN
UPDATE tbl_goods
SET stock = stock + NEW.quantity
WHERE goods_id = NEW.goods_id;
END;
```
阅读全文