欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > MySql --- 作业

MySql --- 作业

2025/2/12 6:20:41 来源:https://blog.csdn.net/2401_84359249/article/details/145534505  浏览:    关键词:MySql --- 作业

一. 触发器
1·建立两个表:goods(商品表)、orders(订单表)

mysql> create database mydb16_tigger;
Query OK, 1 row affected (0.01 sec)mysql> use mydb16_tigger;
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.02 sec)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.02 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.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

2·建立触发器,订单表中增加订单数量后,商品表商品数量同步减少对应的商品订单出数量,并测试

mysql> DELIMITER //
mysql>
mysql> CREATE TRIGGER update_goods_num_after_insert-> AFTER INSERT ON orders-> FOR EACH ROW-> BEGIN-> UPDATE goods-> SET num = num - NEW.onum-> WHERE gid = NEW.gid;-> END //
Query OK, 0 rows affected (0.01 sec)INSERT INTO orders (gid, name, price, onum, otime)
VALUES ('A0001', '橡皮', 2.5, 10, CURDATE());SELECT * FROM goods WHERE gid = 'A0001';+-------+------+-------+------+
| gid   | name | price | num  |
+-------+------+-------+------+
| A0001 | 橡皮 |  2.50 |   90 |
+-------+------+-------+------+
1 row in set (0.01 sec)

3·建立触发器,实现功能:客户取消订单,恢复商品表对应商品的数量

mysql> CREATE TRIGGER restore_goods_num_after_delete-> AFTER DELETE ON orders-> FOR EACH ROW-> BEGIN-> UPDATE goods-> SET num = num + OLD.onum-> WHERE gid = OLD.gid;-> END //
Query OK, 0 rows affected (0.01 sec)mysql> DELIMITER ;
mysql> DELETE FROM orders WHERE oid = 1;
Query OK, 1 row affected (0.01 sec)mysql>
mysql> SELECT * FROM goods WHERE gid = 'A0001';
+-------+------+-------+------+
| gid   | name | price | num  |
+-------+------+-------+------+
| A0001 | 橡皮 |  2.50 |  100 |
+-------+------+-------+------+
1 row in set (0.00 sec)

4.建立触发器,实现功能:客户修改订单,商品表对应商品数量同步更新

mysql> CREATE TRIGGER update_goods_num_after_update-> AFTER UPDATE ON orders-> FOR EACH ROW-> BEGIN->     -- 计算订单数量的差值->     DECLARE diff INT;->     SET diff = NEW.onum - OLD.onum;->     -- 更新商品表中的商品数量->     UPDATE goods->     SET num = num - diff->     WHERE gid = NEW.gid;-> END //
Query OK, 0 rows affected (0.01 sec)mysql> DELIMITER ;
mysql> UPDATE orders SET onum = 20 WHERE oid = 1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0mysql> SELECT * FROM goods WHERE gid = 'A0001';
+-------+------+-------+------+
| gid   | name | price | num  |
+-------+------+-------+------+
| A0001 | 橡皮 |  2.50 |  100 |
+-------+------+-------+------+
1 row in set (0.00 sec)

二.存储过程
使用mydb7 openlab库

 USE mydb7_openlab;

创建提取emp_new表所有员工姓名和工资的存储过程s

DELIMITER //CREATE PROCEDURE s()
BEGINSELECT ename, sal FROM emp_new;
END //DELIMITER ;

 创建存储过程s2,实现输入员工姓名后返回员工的年龄

mysql> CREATE PROCEDURE s2(IN emp_name VARCHAR(50), OUT emp_age INT)-> BEGIN->     SELECT TIMESTAMPDIFF(YEAR, birthdate, CURDATE()) INTO emp_age->     FROM emp_new->     WHERE ename = emp_name;-> END //
Query OK, 0 rows affected (0.01 sec)

创建一个存储过程s3,有2个参数,传入部门号,返回该部门的平均工资

mysql> DELIMITER ;
mysql> DELIMITER //
mysql>
mysql> CREATE PROCEDURE s3(IN dept_num INT, OUT avg_sal DECIMAL(8, 2))-> BEGIN->     SELECT AVG(sal) INTO avg_sal->     FROM emp_new->     WHERE deptno = dept_num;-> END //
Query OK, 0 rows affected (0.01 sec)

 

    版权声明:

    本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

    我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com