From 86689be24e8288bc34608b5cdf04ac5d45c3e4ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E4=BD=B3=E5=AE=87=2E?= <2541095587@qq.com> Date: Wed, 25 Sep 2024 21:19:28 +0800 Subject: [PATCH] =?UTF-8?q?20240924=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...40\345\217\212\344\275\234\344\270\232.md" | 227 ++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 "\345\220\264\344\275\263\345\256\207/20240924 \345\255\230\345\202\250\350\277\207\347\250\213 \347\273\203\344\271\240\345\217\212\344\275\234\344\270\232.md" diff --git "a/\345\220\264\344\275\263\345\256\207/20240924 \345\255\230\345\202\250\350\277\207\347\250\213 \347\273\203\344\271\240\345\217\212\344\275\234\344\270\232.md" "b/\345\220\264\344\275\263\345\256\207/20240924 \345\255\230\345\202\250\350\277\207\347\250\213 \347\273\203\344\271\240\345\217\212\344\275\234\344\270\232.md" new file mode 100644 index 0000000..7679a89 --- /dev/null +++ "b/\345\220\264\344\275\263\345\256\207/20240924 \345\255\230\345\202\250\350\277\207\347\250\213 \347\273\203\344\271\240\345\217\212\344\275\234\344\270\232.md" @@ -0,0 +1,227 @@ +# 一,笔记 + +1. #### 创建无参存储过程 + + 1. ```sql + delimiter 设置新分隔符 + create procedure 存储过程名() + begin + sql语句集; + end 新分割符 + delimiter ;(还原分隔符) + ``` + +2. #### 创建有参存储过程 + + 1. ```sql + delimiter 设置新分隔符 + create procedure 存储过程名(in 赋值变量名 数据类型(长度)) + begin + select * from 表名 where 字段 = 赋值变量名; + ······ + end 新分割符 + delimiter ;(还原分隔符) + ``` + +3. #### 删除存储过程 + + 1. ```sql + drop procedure 存储过程名; + ``` + +4. #### 使用存储过程 + + 1. ```sql + call 存储过程名(); + ``` + + +# 二、课堂练习 + +1. #### 获取所有员工的姓名和薪水 + + ```sql + delimiter // + create procedure test1() + begin + select ename 员工姓名,sal 薪水 from emp where mgr is not null; + end// + delimiter ; + call test1(); + ``` + +2. #### 获取薪水最高的员工信息 + + ```sql + delimiter // + create procedure test2() + BEGIN + select * from emp where sal = (SELECT MAX(sal) from emp where mgr is not null); + end// + delimiter ; + ``` + +3. #### 计算公司员工的平均薪水 + + ```sql + delimiter // + create procedure test3(out 员工平均薪水 decimal(10,5) ) + BEGIN + select AVG(sal) into 员工平均薪水 from emp where mgr is not null; + select 员工平均薪水; + END // + delimiter ; + call test3(@sal); + ``` + +4. #### 获取每个部门的员工数量 + + ```sql + delimiter // + create procedure test4() + begin + select dname 部门名称,COUNT(empno) 员工数量 from dept d + left join (select * from emp where mgr is not null) e on e.deptno = d.deptno + GROUP BY d.dname; + end // + delimiter ; + call test4(); + ``` + +5. #### 根据员工姓名(变量),查询其姓名,及所在部门的名称和工资,工资等级 + + ```sql + delimiter // + create procedure test5(in e_name varchar(20)) + begin + select ename 姓名,dname 部门名称,sal 工资,grade 工资等级 from dept d + join (select * from emp where mgr is not null) e on e.deptno = d.deptno + join salgrade s on e.sal BETWEEN s.losal and s.hisal + where ename = e_name; + end // + delimiter ; + call test5('甘宁'); + ``` + +6. #### 计算每个薪水等级的员工数量 + + ```sql + delimiter // + CREATE procedure test6() + BEGIN + select grade 薪水等级,count(empno) 员工数量 from salgrade s + INNER JOIn (select * from emp where mgr is not null) e on e.sal BETWEEN s.losal and s.hisal + GROUP BY s.grade; + end // + delimiter ; + call test6(); + ``` + +7. #### 列出所有部门及其对应的员工数量(包括空部门) + + ```sql + delimiter // + create procedure test7() + begin + select dname 部门名称,count(e.empno) 员工数量 from dept d + LEFT JOIN (select * from emp where mgr is not null) e on e.deptno = d.deptno + GROUP BY d.dname; + end // + delimiter ; + call test7(); + ``` + +8. #### 以上用存储过程实现,请调用 + +9. #### 删除第2个存储过程 + + ```sql + drop procedure test2; + ``` + +# 三、课后作业,创建无参的存储过程,实现: + +#### 1.获取每个部门薪水最高的员工,显示员工编号,姓名,部门编号,薪水 + +```sql +delimiter // +create procedure b_1() +begin +select empno 员工编号,ename 姓名,e.deptno 部门编号,sal 薪水 +from emp e +where sal IN (select max(sal) max_sal from emp where mgr is not null GROUP BY deptno) ORDER BY e.deptno; +end // +delimiter ; +call b_1(); +``` + +#### 2.找出没有员工的部门名称 + +```sql +delimiter // +create procedure b_2() +begin +select d.deptno,dname,empno,ename from dept d +LEFT JOIN emp e on e.deptno = d.deptno +where empno is null; +end // +delimiter ; +call b_2(); +``` + +#### 3.创建一个存储过程,删除薪水低于薪水等级3的员工,并查询剩余员工数 + +```sql +delimiter // +create procedure b_3() +begin +DELETE from emp where sal < (select losal FROM salgrade where grade = 3) and mgr is not null; +SELECT count(*) from emp where mgr is not null; +end // +delimiter ; +call b_3(); +``` + +#### 4.调用存储过程,检查并返回最高薪水和最低薪水的员工信息 + +```sql +delimiter // +create procedure b_4() +BEGIN +select * from emp where sal = (select MAX(sal) from emp where mgr is not null); +select * from emp where sal = (select Min(sal) from emp where mgr is not null); +end // +delimiter ; +call b_4(); +``` + +# 四、预习作业,(可利用参数或变量实现) + +#### 1.利用存储过程重置员工薪水,提升薪水低于20000的员工薪水,提升额为当前最低薪水值的一半。最终显示最新的员工信息表 + +```sql +delimiter // +create procedure demo1(out min_sal decimal(8,2) ) +begin +select * from emp; +select min(sal) / 2 into min_sal from emp; +update emp set sal = sal + (select min_sal) where sal < 20000; +SELECT * from emp; +end // +delimiter ; +call demo1(@sal); +``` + +#### 2.利用存储过程,将低于全公司平均薪资水平的员工薪水改成平均工资。 + +```sql +delimiter // +create procedure demo2(out avgsal decimal(8,2)) +begin +SELECT * from emp; +select avg(sal) into avgsal from emp where mgr is not null; +update emp set sal = (select avgsal) where sal < (select avgsal); +end // +delimiter ; +call demo2(@sal); +``` -- Gitee