diff --git "a/\351\203\255\345\260\217\347\207\225/20240920 \350\247\206\345\233\276\347\254\224\350\256\260\345\222\214\344\275\234\344\270\232\357\274\21010\357\274\211.md" "b/\351\203\255\345\260\217\347\207\225/20240920 \350\247\206\345\233\276\347\254\224\350\256\260\345\222\214\344\275\234\344\270\232\357\274\21010\357\274\211.md" index d893b01a6ab6f4b23d644172c7075fe904676444..8860358ab931c0bd1f5ea1b7caf8c1d74e918ed5 100644 --- "a/\351\203\255\345\260\217\347\207\225/20240920 \350\247\206\345\233\276\347\254\224\350\256\260\345\222\214\344\275\234\344\270\232\357\274\21010\357\274\211.md" +++ "b/\351\203\255\345\260\217\347\207\225/20240920 \350\247\206\345\233\276\347\254\224\350\256\260\345\222\214\344\275\234\344\270\232\357\274\21010\357\274\211.md" @@ -2,7 +2,7 @@ ## 一. 视图概念 -1. **视图**是一个查询语句的结果集 +1. **视图**是一个查询语句的结果集,视图是一个虚拟表 2. 为什么要有视图 1. 有些语句复杂,要连接多个表,且有多个过滤条件,视图可以直接将语句保存到服务器,方便下次使用,而不用从新网络接收 2. 视图可以重复利用 @@ -138,7 +138,7 @@ SELECT * FROM view_mgr_subordinates; CREATE VIEW view_dept_avg_salary AS SELECT d.dname, AVG(e.sal) AS avg_salary FROM dept d -JOIN emp e ON d.deptno = e.deptno +left JOIN emp e ON d.deptno = e.deptno GROUP BY d.dname; SELECT * FROM view_dept_avg_salary; @@ -147,7 +147,7 @@ SELECT * FROM view_dept_avg_salary; CREATE VIEW view_emp_hired_after_2001 AS SELECT ename, hiredate FROM emp -WHERE YEAR(hiredate) > 2001; +WHERE YEAR(hiredate) >= 2001; SELECT * FROM view_emp_hired_after_2001; diff --git "a/\351\203\255\345\260\217\347\207\225/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/\351\203\255\345\260\217\347\207\225/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 0000000000000000000000000000000000000000..8f7f5db4782d683775232cf3386b14b924aff8aa --- /dev/null +++ "b/\351\203\255\345\260\217\347\207\225/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,122 @@ +# 20240924 存储过程 练习及作业 + +## B、课后作业,创建无参的存储过程,实现: +#### -- 1.获取每个部门薪水最高的员工,显示员工编号,姓名,部门编号,薪水 + +```sql +-- 1.获取每个部门薪水最高的员工,显示员工编号,姓名,部门编号,薪水 +delimiter // +CREATE PROCEDURE empB1() +BEGIN + SELECT e.empno,e.ename,e.deptno,e.sal + FROM emp e + INNER JOIN + (SELECT deptno,MAX(sal) as max_sal FROM emp GROUP BY deptno) ed + ON e.deptno = ed.deptno AND e.sal = ed.max_sal; +END // +delimiter ; + +CALL empB1; + +``` + +![image-20240924172509348](C:\Users\HeZhan\AppData\Roaming\Typora\typora-user-images\image-20240924172509348.png) + +#### -- 2.找出没有员工的部门名称 + +```sql +-- 2.找出没有员工的部门名称 +delimiter // +CREATE PROCEDURE empB2() +BEGIN + SELECT d.dname + FROM dept d + LEFT JOIN emp e ON d.deptno = e.deptno + WHERE e.empno IS NULL; +END // +delimiter ; + +CALL empB2; +``` + +![image-20240924172520712](C:\Users\HeZhan\AppData\Roaming\Typora\typora-user-images\image-20240924172520712.png) + +#### -- 3.创建一个存储过程,删除薪水低于薪水等级3的员工,并查询剩余员工数 + +```sql +-- 3.创建一个存储过程,删除薪水低于薪水等级3的员工,并查询剩余员工数 +delimiter // +CREATE PROCEDURE empB3() +BEGIN + DELETE FROM emp + WHERE sal < (SELECT losal FROM salgrade WHERE grade = 3); + + SELECT COUNT(*) AS emp_num FROM emp; +END // +delimiter ; + +CALL empB3; +``` + +![image-20240924172537131](C:\Users\HeZhan\AppData\Roaming\Typora\typora-user-images\image-20240924172537131.png) + +#### -- 4.调用存储过程,检查并返回最高薪水和最低薪水的员工信息 + +```sql +-- 4.调用存储过程,检查并返回最高薪水和最低薪水的员工信息 +delimiter // +CREATE PROCEDURE empB4() +BEGIN + SELECT e.* + FROM emp e ORDER BY e.sal DESC LIMIT 1; + + SELECT e.* + FROM emp e ORDER BY e.sal ASC LIMIT 1; +END // +delimiter ; + +CALL empB4; + +``` + +![image-20240924172553138](C:\Users\HeZhan\AppData\Roaming\Typora\typora-user-images\image-20240924172553138.png) + +## C、预习作业,(可利用参数或变量实现) +#### -- 1.利用存储过程重置员工薪水,提升薪水低于20000的员工薪水,提升额为当前最低薪水值的一半。最终显示最新的员工信息表 + +```sql +1.利用存储过程重置员工薪水,提升薪水低于20000的员工薪水,提升额为当前最低薪水值的一半。最终显示最新的员工信息表 +delimiter // +CREATE PROCEDURE study1() +BEGIN + DECLARE half_min_sal numeric(8,2); + SELECT MIN(sal) / 2 INTO half_min_sal FROM emp WHERE sal < 20000; + UPDATE emp SET sal = sal + half_min_sal WHERE sal < 20000; + SELECT * FROM emp; +END // +delimiter ; + +CALL study1(); +-- +``` + +![image-20240924173349789](C:\Users\HeZhan\AppData\Roaming\Typora\typora-user-images\image-20240924173349789.png) + +#### -- 2.利用存储过程,将低于全公司平均薪资水平的员工薪水改成平均工资。 + +```sql +2.利用存储过程,将低于全公司平均薪资水平的员工薪水改成平均工资。 +delimiter // +CREATE PROCEDURE study2() +BEGIN + DECLARE avg_sal numeric(8,2); + SELECT AVG(sal) INTO avg_sal FROM emp; + UPDATE emp SET sal = avg_sal WHERE sal < avg_sal; + SELECT * FROM emp; +END // +delimiter ; + +CALL study2(); +``` + +![image-20240924173447594](C:\Users\HeZhan\AppData\Roaming\Typora\typora-user-images\image-20240924173447594.png) \ No newline at end of file diff --git "a/\351\203\255\345\260\217\347\207\225/20240924 \346\225\260\346\215\256\345\272\223\347\232\204\345\255\230\345\202\250\350\277\207\347\250\213.md" "b/\351\203\255\345\260\217\347\207\225/20240924 \346\225\260\346\215\256\345\272\223\347\232\204\345\255\230\345\202\250\350\277\207\347\250\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..e8e0949761bc8d83929f2fe335acb9968e5bb6fd --- /dev/null +++ "b/\351\203\255\345\260\217\347\207\225/20240924 \346\225\260\346\215\256\345\272\223\347\232\204\345\255\230\345\202\250\350\277\207\347\250\213.md" @@ -0,0 +1,244 @@ +# 20240924 数据库的存储过程 + +## 一. 概念 + +#### 存储过程:(procedure)是事先经过编译并储存在数据库中的一段sql语句的集合。 + +**数据库sql语言层面的代码封装与重用** + +**存储过程是没有返回中的函数,函数是有返回值的存储过程。** + +## 二. 存储过程语句 + +### 1.创建 + +```sql +create procedure 存储过程名称(参数); +begin + --sql语句 +end; +``` + +### 2.查询现有的存储过程有哪些 + +```sql +show procedure status where 条件 and 条件; +``` + +### 3.如何调用以写好的存储过程 + +```sql +call 存储过程名称() +``` + +### 4.删除存储过程 不带括号 + +```sql +drop procedure if exists 存储过程名称; +``` + +### 5.如何修改一个存储过程 + +**mysql中不可修改** + +### 6.改分隔符号 + +-- mysql 一个语句的结束,默认以;号结束,只要碰到第一个;号就执行 + +既然是因为默认的分隔符引用bug,可以事先修改默认的分隔符 + +**delimiter // (其他分隔符号)** + +## 三. 命令行界面代码 + +```sql +----完整语法 + +-- 如果公司有100个部门,需要根据部门名称,查询该部门所有员工的名单, +select e.*,dname from dept d join emp e on d.deptno=e.deptno where dname='教研部' + +-- 1 改分隔符 +delimiter // +-- 2 创建过程 +create procedure pro_searchEmpByDname(in searchName varchar(20) +) +-- 2.1 BEGIN +begin +-- 2.2 SQL语句 集 + select e.*,dname from dept d join emp e on d.deptno=e.deptno where dname=searchName; +-- 2.3 END +end // +-- 3 还原分隔符 +delimiter ; + +-- 调用存储过程,查询销售部的员工信息 +call pro_searchEmpByDname('销售部'); +call pro_searchEmpByDname('教研部'); +``` + + + +## 四. 习题 + +### A、课堂练习 +#### -- 1. 获取所有员工的姓名和薪水 + +```sql +-- 1. 获取所有员工的姓名和薪水 + +DROP procedure if EXISTS emp1; + +delimiter // +create procedure emp1() +begin + select ename,sal from emp; +end // +delimiter ; + +CALL emp1(); + +``` + +![image-20240924161815509](https://gitee.com/crane-stack/picture/raw/master/202409241618627.png) + +#### -- 2. 获取薪水最高的员工信息 + +```sql + +-- 2. 获取薪水最高的员工信息 +DROP procedure if EXISTS emp2; + +delimiter // +create procedure emp2() +begin + select * from emp ORDER BY sal DESC LIMIT 1; +end // +delimiter ; + +CALL emp2(); +``` + +![image-20240924161842236](https://gitee.com/crane-stack/picture/raw/master/202409241618300.png) + +#### -- 3. 计算公司员工的平均薪水 + +```sql +-- 3. 计算公司员工的平均薪水 +DROP procedure if EXISTS emp3; + +delimiter // +create procedure emp3() +begin + select avg(sal) as avg_sal from emp ; +end // +delimiter ; + +CALL emp3(); +``` + +![image-20240924161901950](https://gitee.com/crane-stack/picture/raw/master/202409241619001.png) + +#### -- 4. 获取每个部门的员工数量 + +```sql +-- 4. 获取每个部门的员工数量 +DROP procedure if EXISTS emp4; + +delimiter // +create procedure emp4() +begin + select deptno,count(*) as emp_num from emp GROUP BY deptno; +end // +delimiter ; + +CALL emp4(); +``` + +![image-20240924161933916](https://gitee.com/crane-stack/picture/raw/master/202409241619988.png) + +#### -- 5. 根据员工姓名(变量),查询其姓名,及所在部门的名称和工资,工资等级 + +```sql + +-- 5. 根据员工姓名(变量),查询其姓名,及所在部门的名称和工资,工资等级 +DROP procedure if EXISTS emp5; + +delimiter // +create procedure emp5() +begin + select e.ename, d.dname, e.sal, s.grade + FROM emp e + JOIN dept d on e.deptno = d.deptno + JOIN salgrade s on e.sal BETWEEN s.losal and s.hisal; +end // +delimiter ; + +CALL emp5(); +``` + +![image-20240924162008409](https://gitee.com/crane-stack/picture/raw/master/202409241620500.png) + +#### -- 6. 计算每个薪水等级的员工数量 + +```sql +-- 6. 计算每个薪水等级的员工数量 +DROP procedure if EXISTS emp6; + +delimiter // +create procedure emp6() +begin + select s.grade,COUNT(*)as emp_num + from emp e + join salgrade s on e.sal between s.losal and s.hisal + GROUP BY s.grade; +end // +delimiter ; + +call emp6(); +``` + +![image-20240924162028732](https://gitee.com/crane-stack/picture/raw/master/202409241620802.png) + +#### -- 7. 列出所有部门及其对应的员工数量(包括空部门) + +```sql +-- 7. 列出所有部门及其对应的员工数量(包括空部门) +DROP procedure if EXISTS emp7; + +delimiter // +create procedure emp7() +begin + select d.deptno,d.dname,COUNT(e.empno) as emp_num + from dept d + left join emp e on d.deptno = e.deptno + GROUP BY d.deptno,d.dname; +end // +delimiter ; + +CALL emp7(); +``` + +![image-20240924162047841](https://gitee.com/crane-stack/picture/raw/master/202409241620913.png) + +#### -- 以上用存储过程实现,请调用 + +```sql +CALL emp1(); +CALL emp2(); +CALL emp3(); +CALL emp4(); +CALL emp5(); +CALL emp6(); +CALL emp7(); +``` + + + +#### -- 8.删除第2个存储过程 + +```sql +DROP procedure if EXISTS emp2; + +``` + +![image-20240924162125088](https://gitee.com/crane-stack/picture/raw/master/202409241621143.png) \ No newline at end of file