MySQL第五次作业(触发器、存储过程)

题目

1、换库并建表

sql 复制代码
mysql> use mydb16_trigger;
Database changed
mysql>
mysql> create table goods (
    ->     gid char(8) primary key,
    ->     name varchar(10),
    ->     price decimal(8,2),
    ->     num int
    -> );
Query OK, 0 rows affected (0.04 sec)

mysql>
mysql> create table orders (
    ->     oid int primary key auto_increment,
    ->     gid char(10) not null,
    ->     name varchar(10),
    ->     price decimal(8,2),
    ->     onum int,
    ->     otime date
    -> );
Query OK, 0 rows affected (0.04 sec)

mysql> insert into goods values
    -> ('a0001', '橡皮', 2.5, 100),
    -> ('b0001', '小楷本', 2.8, 210),
    -> ('c0001', '铅笔', 1.2, 120),
    -> ('d0001', '计算器', 28, 20);
Query OK, 4 rows affected (0.02 sec)
Records: 4  Duplicates: 0  Warnings: 0

2、触发器的设置

2.1 在订单表中增加订单数量后,商品表商品数量同步减少对应的商品订单出数量,并测试
sql 复制代码
mysql> create trigger orders_after_insert_trigger
    -> after insert on orders for each row
    -> update goods set num=num-new.onum where gid = new.gid;
Query OK, 0 rows affected (0.01 sec)

#测试
mysql> select * from orders;
Empty set (0.01 sec)

mysql> select * from goods;
+-------+--------+-------+------+
| gid   | name   | price | num  |
+-------+--------+-------+------+
| a0001 | 橡皮   |  2.50 |  100 |
| b0001 | 小楷本 |  2.80 |  210 |
| c0001 | 铅笔   |  1.20 |  120 |
| d0001 | 计算器 | 28.00 |   20 |
+-------+--------+-------+------+
4 rows in set (0.00 sec)

mysql> insert into orders (gid,name,price,onum,otime) values ('C0001','铅笔'
,1.2,80,now());
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> select * from orders;
+-----+-------+------+-------+------+------------+
| oid | gid   | name | price | onum | otime      |
+-----+-------+------+-------+------+------------+
|   1 | C0001 | 铅笔 |  1.20 |   80 | 2025-02-10 |
+-----+-------+------+-------+------+------------+
1 row in set (0.00 sec)

mysql> select * from goods;
+-------+--------+-------+------+
| gid   | name   | price | num  |
+-------+--------+-------+------+
| a0001 | 橡皮   |  2.50 |  100 |
| b0001 | 小楷本 |  2.80 |  210 |
| c0001 | 铅笔   |  1.20 |   40 |
| d0001 | 计算器 | 28.00 |   20 |
+-------+--------+-------+------+
4 rows in set (0.00 sec)
2.2 客户取消订单,恢复商品表对应商品的数量
sql 复制代码
mysql> create trigger orders_after_delete_trigger
    -> after delete on orders for each row
    -> update goods set num=num+old.onum where gid=old.gid;
Query OK, 0 rows affected (0.02 sec)

#测试
mysql> delete from orders where gid='C0001';
Query OK, 1 row affected (0.00 sec)

mysql> select * from orders;
Empty set (0.00 sec)

mysql> select * from goods;
+-------+--------+-------+------+
| gid   | name   | price | num  |
+-------+--------+-------+------+
| a0001 | 橡皮   |  2.50 |  100 |
| b0001 | 小楷本 |  2.80 |  210 |
| c0001 | 铅笔   |  1.20 |  120 |
| d0001 | 计算器 | 28.00 |   20 |
+-------+--------+-------+------+
4 rows in set (0.00 sec)
2.3 客户修改订单,商品表对应商品数量同步更新
sql 复制代码
mysql> create trigger orders_after_update_trigger
    -> after update on orders for each row
    -> update goods set num=num+(old.onum-new.onum) where gid=old.gid;

#测试
mysql> select * from goods;
+-------+--------+-------+------+
| gid   | name   | price | num  |
+-------+--------+-------+------+
| a0001 | 橡皮   |  2.50 |  100 |
| b0001 | 小楷本 |  2.80 |  210 |
| c0001 | 铅笔   |  1.20 |  120 |
| d0001 | 计算器 | 28.00 |   20 |
+-------+--------+-------+------+
4 rows in set (0.00 sec)

mysql> select * from orders;
Empty set (0.00 sec)

mysql> select * from orders;
+-------+-------+--------+-------+------+------------+
| oid   | gid   | name   | price | onum | otime      |
+-------+-------+--------+-------+------+------------+
| 10002 | b0001 | 小楷本 |  2.80 |   30 | 2025-02-10 |
+-------+-------+--------+-------+------+------------+
1 row in set (0.00 sec)

mysql> select * from goods;
+-------+--------+-------+------+
| gid   | name   | price | num  |
+-------+--------+-------+------+
| a0001 | 橡皮   |  2.50 |  100 |
| b0001 | 小楷本 |  2.80 |  180 |
| c0001 | 铅笔   |  1.20 |  120 |
| d0001 | 计算器 | 28.00 |   20 |
+-------+--------+-------+------+
4 rows in set (0.00 sec)

#修改订单数量,商品表数量跟着变化
mysql> update orders set onum=50 where gid='b0001';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from orders;
+-------+-------+--------+-------+------+------------+
| oid   | gid   | name   | price | onum | otime      |
+-------+-------+--------+-------+------+------------+
| 10002 | b0001 | 小楷本 |  2.80 |   50 | 2025-02-10 |
+-------+-------+--------+-------+------+------------+
1 row in set (0.00 sec)

mysql> select * from goods;
+-------+--------+-------+------+
| gid   | name   | price | num  |
+-------+--------+-------+------+
| a0001 | 橡皮   |  2.50 |  100 |
| b0001 | 小楷本 |  2.80 |  160 |
| c0001 | 铅笔   |  1.20 |  120 |
| d0001 | 计算器 | 28.00 |   20 |
+-------+--------+-------+------+
4 rows in set (0.00 sec)

3、存储过程

3.1 创建提取emp_new表所有员工姓名和工资的存储过程s1
sql 复制代码
mysql> use mydb7_openlab
Database changed
mysql> delimiter //
mysql> create procedure s1()#无参
    -> begin
    ->          select name,incoming from emp_new;
    -> end //
Query OK, 0 rows affected (0.02 sec)

mysql> delimiter ;
mysql> call s1();
+------+----------+
| name | incoming |
+------+----------+
| 张三 |     4000 |
| 李四 |     3500 |
| 王五 |     2000 |
| 赵六 |     7500 |
| 荣七 |     8500 |
| 牛八 |     7300 |
+------+----------+
6 rows in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)
3.2 创建存储过程s2,实现输入员工姓名后返回员工的年龄
sql 复制代码
mysql> delimiter //
mysql> create procedure s2(in in_name varchar(11),out out_age int)
    -> begin
    ->           select age into out_age from emp_new where name=in_name;
    -> end //
Query OK, 0 rows affected (0.02 sec)

mysql>  delimiter ;
mysql>  call s2('赵六',@age);
Query OK, 1 row affected (0.00 sec)

mysql> select @age;
+------+
| @age |
+------+
|   57 |
+------+
1 row in set (0.00 sec)
3.3 创建一个存储过程s3,有2个参数,传入部门号,返回该部门的平均工资
sql 复制代码
mysql> delimiter //
mysql> create procedure s3(in in_dept int,out out_avg_sal double)
    -> begin
    ->             select round(avg(incoming),2) into out_avg_sal from emp_new where dept2=in_dept group by dept2;
    -> end //
Query OK, 0 rows affected (0.02 sec)

mysql> delimiter ;
mysql> call s3(101,@avg_sal);
Query OK, 1 row affected (0.00 sec)

mysql> select @avg_sal;
+----------+
| @avg_sal |
+----------+
|  3166.67 |
+----------+
1 row in set (0.00 sec)
相关推荐
CYRUS_STUDIO1 小时前
利用 Linux 信号机制(SIGTRAP)实现 Android 下的反调试
android·安全·逆向
CYRUS_STUDIO2 小时前
Android 反调试攻防实战:多重检测手段解析与内核级绕过方案
android·操作系统·逆向
得物技术3 小时前
MySQL单表为何别超2000万行?揭秘B+树与16KB页的生死博弈|得物技术
数据库·后端·mysql
xiaok3 小时前
mysql中怎么创建一个可控权限数据库账号密码给到开发者
mysql
黄林晴5 小时前
如何判断手机是否是纯血鸿蒙系统
android
火柴就是我6 小时前
flutter 之真手势冲突处理
android·flutter
法的空间6 小时前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
循环不息优化不止6 小时前
深入解析安卓 Handle 机制
android
恋猫de小郭6 小时前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter
jctech6 小时前
这才是2025年的插件化!ComboLite 2.0:为Compose开发者带来极致“爽”感
android·开源