数据库实验七:综合实验-水果商店进阶二

一、实验目的

综合运用SQL语言相关知识如变量、游标、函数、触发器等解决实际问题。

二、实验内容

设计并完成以下实验,要求附上源码,测试效果截图。

1.在客户表customers中添加“VIP”字段

在客户表customers中添加“VIP”字段,默认值0,根据已购买的累计金额自动更新等级,如累计100-199一星VIP折扣9.9,200-299二星VIP折扣9.7,500-999三星VIP折扣9.5,1000-1999四星VIP折扣9,之后的8.5折。

①根据已购买情况自动修改客户表中所有客户的VIP信息

源码:

ALTER TABLE customers ADD VIP INT NOT NULL DEFAULT(0);

#游标
CREATE PROCEDURE c_vip()
BEGIN
	DECLARE vip_price DECIMAL(6,2);
	DECLARE vip_id INT(10);
	DECLARE done TINYINT DEFAULT 0;
	DECLARE c_vip CURSOR FOR SELECT c_id,SUM(original_price) FROM orders GROUP BY c_id;
	DECLARE CONTINUE HANDLER FOR NOT found SET done=1;
	
OPEN c_vip;
read_loop:LOOP
	FETCH c_vip INTO vip_id,vip_price;
	IF done THEN
		LEAVE read_loop;
	END IF;
	UPDATE customers SET VIP=CASE
		WHEN vip_price BETWEEN 0 AND 100 
			THEN 0
		WHEN vip_price BETWEEN 100 AND 199 
			THEN 1
		WHEN vip_price BETWEEN 200 AND 499 
			THEN 2
		WHEN vip_price BETWEEN 500 AND 999 
			THEN 3
		WHEN vip_price BETWEEN 1000 AND 1999 
			THEN 4
		WHEN vip_price > 1999 
			THEN 5
		END
		WHERE c_id=vip_id;
	
	END LOOP read_loop;

CLOSE c_vip;
END

运行测试结果截图:
在这里插入图片描述

②在订单表orders中插入新订单时自动计算并插入当前客户的折扣信息(不修改原订单的折扣)

源码:

CREATE TRIGGER discount_vip BEFORE INSERT ON orders FOR EACH ROW 
	BEGIN
		DECLARE re_vip INT(10);
		SET re_vip=(SELECT VIP FROM customers WHERE c_id=new.c_id);
		SET new.discount=(CASE 
			WHEN re_vip=0 THEN 1
			WHEN re_vip=1 THEN 0.99
			WHEN re_vip=2 THEN 0.97
			WHEN re_vip=3 THEN 0.95
			WHEN re_vip=4 THEN 0.9
			WHEN re_vip=5 THEN 0.85
     END);
END;

运行测试结果截图:

插入“30009”一行:
在这里插入图片描述
在这里插入图片描述

2.查询指定客户的“总优惠金额”,即累计每次购买时为客户优惠金额

源码:SELECT SUM(original_price-pay) "总优惠金额" FROM orders WHERE c_id = 10001;
运行测试结果截图:
在这里插入图片描述

3.f_id中t字母开头的是特价产品,限制每一位客户每次够买特价产品不能超过50元

源码:

CREATE TRIGGER t_fruits BEFORE INSERT ON orderitems FOR EACH ROW 
	BEGIN
		DECLARE t_price DECIMAL(8,2);
		DECLARE t_fruits CURSOR FOR SELECT new.quantity*new.item_price FROM orderitems WHERE new.f_id LIKE 't%';
		
		OPEN t_fruits;
		FETCH t_fruits INTO t_price;
		IF
			t_price > 50
		THEN
			SIGNAL SQLSTATE 'HY000' SET message_text='购买特价商品不得超过50元!';
		END IF;
		
		CLOSE t_fruits;
	END

运行测试(购买正常及错误的)结果截图:
正常:
在这里插入图片描述
错误:
在这里插入图片描述

三、实验小结

1.实验中遇到的问题及解决过程

第一题中设计游标时报错:
在这里插入图片描述
原因是在更新等级的循环后面少了一次“end”:
在这里插入图片描述

2.实验中产生的错误及原因分析

产生错误:添加完触发器后增加记录时报错
在这里插入图片描述
原因分析:
查找字符’t’忘记在其后加上“%”
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Moonee_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值