MySQL SQL 编程练习

news2024/11/16 22:34:29

目录

创建表并插入数据

查看表结构

创建触发器

创建INSERT 触发器

创建DELETE 触发器

创建更新触发器

创建存储过程

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

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

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


创建表并插入数据

# 创建goods商品表
mysql> CREATE TABLE goods
    -> (
    ->    gid CHAR(8) PRIMARY KEY, #商品编号
    ->    name VARCHAR(10),        #商品名
    ->    price DECIMAL(8,2),      #价格
    ->    num  INT                 #数量
    -> );
Query OK, 0 rows affected (0.01 sec)

# 创建orders订单表
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.05 sec)

# 给goods表插入数据 
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

查看表结构

mysql> desc goods;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| gid   | char(8)      | NO   | PRI | NULL    |       |
| name  | varchar(10)  | YES  |     | NULL    |       |
| price | decimal(8,2) | YES  |     | NULL    |       |
| num   | int          | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> desc orders;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| oid   | int          | NO   | PRI | NULL    | auto_increment |
| gid   | char(10)     | NO   |     | NULL    |                |
| name  | varchar(10)  | YES  |     | NULL    |                |
| price | decimal(8,2) | YES  |     | NULL    |                |
| onum  | int          | YES  |     | NULL    |                |
| otime | date         | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

创建触发器

创建INSERT 触发器

create trigger insert_after_orders_trigger 
    after insert on orders 
    for each row update goods
    begin
        set num=num-new.onum where gid=new.gid;
    end //


mysql> insert into orders(gid,name,price,onum,otime) value('A0001','橡皮','2.5',20,now());
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from goods;
+-------+-----------+-------+------+
| gid   | name      | price | num  |
+-------+-----------+-------+------+
| A0001 | 橡皮      |  2.50 |   80 |
| B0001 | 小楷本    |  2.80 |  210 |
| C0001 | 铅笔      |  1.20 |  120 |
| D0001 | 计算器    | 28.00 |   20 |
+-------+-----------+-------+------+
4 rows in set (0.00 sec)

mysql> select * from orders;
+-----+-------+--------+-------+------+------------+
| oid | gid   | name   | price | onum | otime      |
+-----+-------+--------+-------+------+------------+
|   1 | A0001 | 橡皮   |  2.50 |   20 | 2024-07-25 |
+-----+-------+--------+-------+------+------------+
1 row in set (0.00 sec)

创建DELETE 触发器

mysql> DELIMITER //
mysql> CREATE TRIGGER TRIGGER_DELETE_AFTER_ORDERS
    ->     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> SELECT * FROM goods;
+-------+-----------+-------+------+
| gid   | name      | price | num  |
+-------+-----------+-------+------+
| A0001 | 橡皮      |  2.50 |   80 |
| B0001 | 小楷本    |  2.80 |  210 |
| C0001 | 铅笔      |  1.20 |  120 |
| D0001 | 计算器    | 28.00 |   20 |
+-------+-----------+-------+------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM orders;
+-----+-------+--------+-------+------+------------+
| oid | gid   | name   | price | onum | otime      |
+-----+-------+--------+-------+------+------------+
|   1 | A0001 | 橡皮   |  2.50 |   20 | 2024-07-25 |
+-----+-------+--------+-------+------+------------+
1 row in set (0.00 sec)

mysql> DELETE FROM orders WHERE gid = 'A0001';
Query OK, 1 row affected (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)

创建更新触发器

mysql> delimiter //
mysql>  CREATE TRIGGER TRIGGER_UPDATE_AFTER_ORDERS
    ->      AFTER UPDATE ON orders
    ->      FOR EACH ROW
    ->      BEGIN
    ->           UPDATE goods SET num = num + (old.onum-new.onum);
    ->      END //
Query OK, 0 rows affected (0.00 sec)


mysql> DELIMITER ;

mysql> SELECT * FROM goods;
+-------+-----------+-------+------+
| gid   | name      | price | num  |
+-------+-----------+-------+------+
| A0001 | 橡皮      |  2.50 |  100 |
| B0001 | 小楷本    |  2.80 |  210 |
| C0001 | 铅笔      |  1.20 |  100 |
| D0001 | 计算器    | 28.00 |   20 |
+-------+-----------+-------+------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM orders;
+-----+-------+--------+-------+------+------------+
| oid | gid   | name   | price | onum | otime      |
+-----+-------+--------+-------+------+------------+
|   2 | C0001 | 铅笔   |  1.20 |   20 | 2024-07-25 |
+-----+-------+--------+-------+------+------------+
1 row in set (0.00 sec)

mysql> UPDATE orders SET onum = 40 WHERE name = '铅笔';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM goods;
+-------+-----------+-------+------+
| gid   | name      | price | num  |
+-------+-----------+-------+------+
| A0001 | 橡皮      |  2.50 |   80 |
| B0001 | 小楷本    |  2.80 |  190 |
| C0001 | 铅笔      |  1.20 |   80 |
| D0001 | 计算器    | 28.00 |    0 |
+-------+-----------+-------+------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM orders;
+-----+-------+--------+-------+------+------------+
| oid | gid   | name   | price | onum | otime      |
+-----+-------+--------+-------+------+------------+
|   2 | C0001 | 铅笔   |  1.20 |   40 | 2024-07-25 |
+-----+-------+--------+-------+------+------------+
1 row in set (0.00 sec)

创建存储过程

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

mysql> USE mydb7_openlab
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-------------------------+
| Tables_in_mydb7_openlab |
+-------------------------+
| dept                    |
| emp                     |
| emp_new                 |
| user                    |
+-------------------------+
4 rows in set (0.00 sec)


mysql> desc emp_new;
+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| sid            | int         | YES  |     | NULL    |       |
| name           | varchar(11) | YES  |     | NULL    |       |
| age            | int         | YES  |     | NULL    |       |
| worktime_start | date        | YES  |     | NULL    |       |
| incoming       | int         | YES  |     | NULL    |       |
| dept2          | int         | YES  |     | NULL    |       |
+----------------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)

mysql> SELECT name,age FROM emp_new;
+---------+------+
| name    | age  |
+---------+------+
| 张三    |   35 |
| 李四    |   32 |
| 王五    |   24 |
| 赵六    |   57 |
| 荣七    |   64 |
| 牛八    |   55 |
+---------+------+
6 rows in set (0.00 sec)


mysql> DELIMITER //
mysql> CREATE PROCEDURE s1()
    -> BEGIN 
    ->     SELECT name,age FROM emp_new;
    -> END //
Query OK, 0 rows affected (0.00 sec)


mysql> DELIMITER ;
mysql> CALL s1();
+---------+------+
| name    | age  |
+---------+------+
| 张三    |   35 |
| 李四    |   32 |
| 王五    |   24 |
| 赵六    |   57 |
| 荣七    |   64 |
| 牛八    |   55 |
+---------+------+
6 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)




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

mysql> desc emp_new;
+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| sid            | int         | YES  |     | NULL    |       |
| name           | varchar(11) | YES  |     | NULL    |       |
| age            | int         | YES  |     | NULL    |       |
| worktime_start | date        | YES  |     | NULL    |       |
| incoming       | int         | YES  |     | NULL    |       |
| dept2          | int         | YES  |     | NULL    |       |
+----------------+-------------+------+-----+---------+-------+

mysql> SELECT * FROM emp_new;
+------+---------+------+----------------+----------+-------+
| sid  | name    | age  | worktime_start | incoming | dept2 |
+------+---------+------+----------------+----------+-------+
| 1789 | 张三    |   35 | 1980-01-01     |     4000 |   101 |
| 1674 | 李四    |   32 | 1983-04-01     |     3500 |   101 |
| 1776 | 王五    |   24 | 1990-07-01     |     2000 |   101 |
| 1568 | 赵六    |   57 | 1970-10-11     |     7500 |   102 |
| 1564 | 荣七    |   64 | 1963-10-11     |     8500 |   102 |
| 1879 | 牛八    |   55 | 1971-10-20     |     7300 |   103 |
+------+---------+------+----------------+----------+-------+
6 rows in set (0.00 sec)


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.01 sec)


mysql> DELIMITER ;
mysql> CALL s2('张三',@out_age);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @out_age;
+----------+
| @out_age |
+----------+
|       35 |
+----------+
1 row in set (0.00 sec)

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

mysql> desc emp_new;
+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| sid            | int         | YES  |     | NULL    |       |
| name           | varchar(11) | YES  |     | NULL    |       |
| age            | int         | YES  |     | NULL    |       |
| worktime_start | date        | YES  |     | NULL    |       |
| incoming       | int         | YES  |     | NULL    |       |
| dept2          | int         | YES  |     | NULL    |       |
+----------------+-------------+------+-----+---------+-------+

mysql> SELECT * FROM emp_new;
+------+---------+------+----------------+----------+-------+
| sid  | name    | age  | worktime_start | incoming | dept2 |
+------+---------+------+----------------+----------+-------+
| 1789 | 张三    |   35 | 1980-01-01     |     4000 |   101 |
| 1674 | 李四    |   32 | 1983-04-01     |     3500 |   101 |
| 1776 | 王五    |   24 | 1990-07-01     |     2000 |   101 |
| 1568 | 赵六    |   57 | 1970-10-11     |     7500 |   102 |
| 1564 | 荣七    |   64 | 1963-10-11     |     8500 |   102 |
| 1879 | 牛八    |   55 | 1971-10-20     |     7300 |   103 |
+------+---------+------+----------------+----------+-------+
6 rows in set (0.00 sec)

mysql> DELIMITER //
mysql> CREATE PROCEDURE s3(IN in_dept2 INT,OUT avg_incoming DOUBLE)
    -> BEGIN
    ->      SELECT ROUND(AVG(incoming),2) INTO avg_incoming  FROM emp_new WHERE dept2 = in_dept2;
    -> END //
Query OK, 0 rows affected (0.00 sec)

mysql> CALL s3(101,@AVG_incoming);
    -> //
Query OK, 1 row affected (0.00 sec)

mysql> DELIMITER ;
mysql> SELECT @AVG_incoming;
+---------------+
| @AVG_incoming |
+---------------+
|       3166.67 |
+---------------+
1 row in set (0.00 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1949715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Apache ShardingSphere Proxy5.5.0实现MySQL分库分表与读写分离

1. 前提准备 1.1 主机IP:192.168.186.77 version: 3.8services:mysql-master:image: mysql:latestcontainer_name: mysql-masterenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_USER: masterMYSQL_PASSWORD: 123456MYSQL_DATABASE: db1 ports:- "3306:3306&quo…

搭建NFS、web、dns服务器

目录 1、搭建一个nfs服务器,客户端可以从该服务器的/share目录上传并下载文件 服务端配置: 客户端测试: 2、搭建一个Web服务器,客户端通过www.haha.com访问该网站时能够看到内容:this is haha 服务端配置: 客户端…

UE5+OpenCV配置(Windows11系统)

一、概述 因为需要在UE5中使用OpenCV这些工具进行配置,所以在网络上参考借鉴一些资料进行配置。查询到不少的资料,最后将其配置成功。在这里顺便记录一下自己的配置成功的过程。 二、具体过程 (一)版本 使用Windows11系统、UE5.…

vue3前端开发-小兔鲜项目-路由拦截器增加token的携带

vue3前端开发-小兔鲜项目-路由拦截器增加token的携带!实际开发中,很多业务接口的请求,都要求必须是登录状态!为此,这个token信息就会频繁的被加入到了请求头部信息中。request请求头内既然需要频繁的携带这个token.我们…

百易云资产管理运营系统 comfileup.php 文件上传致RCE漏洞复现(XVE-2024-18154)

0x01 产品简介 百易云资产管理运营系统,是专门针对企业不动产资产管理和运营需求而设计的一套综合解决方案。该系统能够覆盖资产的全生命周期管理,包括资产的登记、盘点、评估、处置等多个环节,同时提供强大的运营分析功能,帮助企业优化资产配置,提升运营效率。 0x02 漏…

BUUCTF [安洵杯 2019]easy_serialize_php

这道题题目说easy但是对我来说极其不友好!看了很多wp讲的模棱两可,我尽量来说清楚点 代码解析: 这里$function $_GET[f],是我们通过get方式传递的,因为注释提示有东西先传fphpinfo看看 找到了一个东西,很…

linux下usb抓包:wireshark+usbmon

step1. 加载usbmon模块 sudo mount -t debugfs none /sys/kernel/debug #这一步一般不用做,debugfs默认都是挂载的 sudo modprobe usbmon #如果这个命令找不到usbmon,那手动从/lib/modules中insmod sudo apt-get install wireshark 若加载成功&…

收银系统对零售连锁门店有什么作用?

随着人们生活水平的提高,各类零售门店也越来越多,对于零售连锁门店来说,如何提高客流量和客户忠诚度,提高会员的单次消费能力是一个重大的问题,能够决定性影响门店盈利额;从收银软件出发,一款好…

【文心智能体】00后疯感工牌生成器,低代码工作流的简单应用以及图片快速响应解决方案,干活满满,不容错过哦

背景 文心智能体平台,开启新一轮活动,超级创造营持续百日活动。 在AI 浪潮席卷的今天,如雨后春笋般丛生的 AI 应用,昭告着时代风口显然已随之到来。 如何能把握住时代红利,占据风口,甚至打造新风向&#x…

设计模式14-享元模式

设计模式14-享元模式 由来动机定义与结构代码推导特点享元模式的应用总结优点缺点使用享元模式的注意事项 由来动机 在很多应用中,可能会创建大量相似对象,例如在文字处理器中每个字符对象。在这些场景下,如果每个对象都独立存在&#xff0c…

Notion的离线替代方案Eidos

什么是 Eidos ? Eidos 是 Notion 的离线替代品。Eidos 是一个可扩展的框架,用于在一个地方管理您一生的个人数据。 软件特点: 一切在您的浏览器内运行。这是一个纯 PWA,没有 Web 服务器。 离线支持:无需互联网连接即可…

【漏洞复现】phpStudy 小皮 Windows面板 存在RCE漏洞

靶场资料后台自行领取【靶场】 image-20240726092307252 PhpStudy小皮面板曝RCE漏洞,本质是存储型XSS引发。攻击者通过登录用户名输入XSS代码,结合后台计划任务功能,实现远程代码执行,严重威胁服务器安全。建议立即更新至安全版…

算法:数值算法

矩阵乘法 定义与性质 矩阵乘法是线性代数中的一个基本运算,它涉及到两个矩阵的点积运算。给定两个矩阵 A(mn)和 B(np),它们的乘积 C(mp)定义为: 其中, Cij …

从零开始:在linux系统安装MongoDB数据完整指南 新手常用命令

1 前言 MongoDB 是为快速开发互联网应用而设计的数据库系统。MongoDB 的设计目标是极简、灵活、作为 Web 应用栈的一部分。MongoDB 的数据模型是面向文档的,所谓文档是一种类似于json的结构。 官网教程:https://www.mongodb.com/docs/manual/ 2 安装部…

Leaflet.VectorGrid加载点矢量瓦片鼠标点击报Cannot read properties of undefined的解决办法

在使用Leaflet.VectorGrid1.3.0进行点矢量瓦片数据的渲染时,再打开事件交互后,以mouseover为例,当事件添加后,鼠标悬停时,并没有展示相应的数据,反而在控制台下方报错。如下方所示: 本文将介绍在…

ZStack Cloud 5.1.8正式发布——GPU运维、物理机硬件监控、克隆云主机网络配置三大亮点简析

云轴科技ZStack Cloud云平台是遵循“简单、弹性、健壮、智能”的“4S”特性的私有云和无缝混合云产品。ZStack Cloud 5.1.8版本正式发布,从用户业务场景和实际需求出发,丰富和完善平台功能,推出一系列重要功能和多项改进,覆盖云主…

[vue3]引入模块出现红色波浪,但是可以正常运行,去除红色波浪号

问题1 解决问题1&#xff1a; 在vite-env.d.ts添加以下语句 declare module "*.vue" {import { DefineComponent } from "vue"const component: DefineComponent<{}, {}, any>export default component }

.NET威胁情报 | 某水务系统堆叠注入可RCE

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

ROM修改进阶教程------修改rom 开机自动安装指定apk 自启脚本完整步骤解析

rom修改的初期认识 在解包修改系统分区过程中。很多客户需求刷完rom后自动安装指定apk。这种与内置apk有区别。而且一些极个别apk无法内置。今天对这种修改rom刷入机型后第一次启动后自动安装指定apk的需求做个步骤解析。 在前期博文中我有做过说明。官方系统固件解…