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)
相关推荐
敲上瘾21 分钟前
MySQL数据类型
数据库·c++·mysql·数据库开发·数据库架构
野犬寒鸦5 小时前
MySQL索引使用规则详解:从设计到优化的完整指南
java·数据库·后端·sql·mysql
A尘埃7 小时前
K8S有状态服务部署(MySQL、Redis、ES、RabbitMQ、Nacos、ZipKin、Sentinel)
redis·mysql·kubernetes
吻等离子8 小时前
解决 MySQL 数据库无法远程连接的问题
数据库·mysql·adb
后院那片海8 小时前
MySQL数据库操作
数据库·mysql
杨云龙UP9 小时前
SQL Server 中的 GO 及其与其他数据库的对比
数据库·sql·mysql·oracle·sqlserver
Linux运维技术栈9 小时前
MySQL 8.0 单节点部署与一主两从架构搭建实战
数据库·mysql·架构
潜龙952710 小时前
第3.2.3节 Android动态调用链路的获取
android·调用链路
追随远方10 小时前
Android平台FFmpeg音视频开发深度指南
android·ffmpeg·音视频
撰卢12 小时前
MySQL 1366 - Incorrect string value:错误
android·数据库·mysql