From 8f6870fca90cd1876d49a57682c507bd2793c8c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=98=8E=E5=87=BD?= <3084917167@qq.com> Date: Wed, 25 Oct 2023 10:02:31 +0000 Subject: [PATCH 1/6] =?UTF-8?q?02=20=E9=99=88=E6=98=8E=E5=87=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈明函 <3084917167@qq.com> --- .../\344\272\213\345\212\241.md" | 147 ++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 "02 \351\231\210\346\230\216\345\207\275/\344\272\213\345\212\241.md" diff --git "a/02 \351\231\210\346\230\216\345\207\275/\344\272\213\345\212\241.md" "b/02 \351\231\210\346\230\216\345\207\275/\344\272\213\345\212\241.md" new file mode 100644 index 0000000..789d7e1 --- /dev/null +++ "b/02 \351\231\210\346\230\216\345\207\275/\344\272\213\345\212\241.md" @@ -0,0 +1,147 @@ +````mysql +#### 事务的概念: + +```mysql +数据库中的事务是指对数据库执行一批操作,在同一个事务当中,这些操作要么全部执行成功,要么全部失败,不会存在部分成功的情况。 +``` + +#### 事务的几个特性: + +```mysql +原子性,一致性,隔离性,持久性 +隔离性分为: +读未提交:read uncommitted +读已提交:read committed +可重复读:repeatable read +串行化:serializable +``` + +#### MySQL中事务操作: + +```mysql +隐式事务:事务自动开启提交或回滚,比如insert,update,delete语句,事务的开启,提交或回滚由MySQL内部自动控制的。 +autocommit为on表示开启了自动提交。 +显示事务: +事务需要手动开启,提交或回滚,由开发者自己控制。 +设置不自动提交事务即关闭自动提交:set autocommit=0; +执行事务操作:commit rollback +开启事务:start transaction +``` + +#### savepoint关键字: + +```mysql +在事务中将一大批操作分为几个部分,然后回滚某个部分可以用savepoint来实现 +格式为: +state transaction, +insert into test1 value(1), +savepoint part1,//设置一个保存点 +insert into test1 value(2) +rollback to part1//将savepoint=part1的语句到当前语句之间所有的操作回滚 +commit//提交事务 +select* from test1; +savepoint需要结合将rollback to sp1一起使用,可以将保存点sp1到rollback to 之间的操作回滚掉 +``` + +#### 只读事务: + +```mysql +start transaction read only; +``` + +```mysql +建表语句: +执行以下SQL,建表插数: +create database test_10119 charset utf8; +use test_10119; +-- 部门表 +create table dept( + deptno int primary key auto_increment, -- 部门编号 + dname varchar(14) , -- 部门名字 + loc varchar(13) -- 地址 +) ; +-- 员工表 +create table emp( + empno int primary key auto_increment,-- 员工编号 + ename varchar(10), -- 员工姓名 - + job varchar(9), -- 岗位 + mgr int, -- 直接领导编号 + hiredate date, -- 雇佣日期,入职日期 + sal int, -- 薪水 + comm int, -- 提成 + deptno int not null, -- 部门编号 + foreign key (deptno) references dept(deptno) +); +insert into dept values(10,'财务部','北京'); +insert into dept values(20,'研发部','上海'); +insert into dept values(30,'销售部','广州'); +insert into dept values(40,'行政部','深圳'); +insert into emp values(7369,'刘一','职员',7902,'1980-12-17',800,null,20); +insert into emp values(7499,'陈二','推销员',7698,'1981-02-20',1600,300,30); +insert into emp values(7521,'张三','推销员',7698,'1981-02-22',1250,500,30); +insert into emp values(7566,'李四','经理',7839,'1981-04-02',2975,null,20); +insert into emp values(7654,'王五','推销员',7698,'1981-09-28',1250,1400,30); +insert into emp values(7698,'赵六','经理',7839,'1981-05-01',2850,null,30); +insert into emp values(7782,'孙七','经理',7839,'1981-06-09',2450,null,10); +insert into emp values(7788,'周八','分析师',7566,'1987-06-13',3000,null,20); +insert into emp values(7839,'吴九','总裁',null,'1981-11-17',5000,null,10); +insert into emp values(7844,'郑十','推销员',7698,'1981-09-08',1500,0,30); +insert into emp values(7876,'郭十一','职员',7788,'1987-06-13',1100,null,20); +insert into emp values(7900,'钱多多','职员',7698,'1981-12-03',950,null,30); +insert into emp values(7902,'大锦鲤','分析师',7566,'1981-12-03',3000,null,20); +insert into emp values(7934,'木有钱','职员',7782,'1983-01-23',1300,null,10); +完成以下练习题 + +1、列出最低薪金大于1500的各种工作。 +select job,min(sal) from emp where sal>1500 group by job; + + +2、列出在部门 "销售部" 工作的员工的姓名,假定不知道销售部的部门编号。 +select e.ename from emp e LEFT JOIN dept d on e.deptno=d.deptno where dname='销售部'; + +3、列出薪金高于公司平均薪金的所有员工。 + +select * from emp where sal>(select avg(sal) from emp); +4、列出与"周八"从事相同工作的所有员工。 + +select * from emp where job = (select job from emp where ename = '周八'); + +5、列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。 +select ename,sal from emp where sal in (select sal from emp where deptno=30); +6、列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。 +select ename,sal from emp where sal>(select max(sal) from emp where deptno=30); +7、列出在每个部门工作的员工数量、平均工资、平均服务年限。 +select + deptno 部门, + count(empno) 员工数量, + avg(sal) 平均工资, + avg(timestampdiff(year,hiredate,now())) 平均服务年限 +from emp group by deptno; +8、列出所有员工的姓名、部门名称和工资。 +select + emp.ename 姓名, + dept.dname 部门名称, + emp.sal+ifnull(comm,0) 工资 +from emp,dept where emp.deptno = dept.deptno; +SELECT ename,de.dname,sal FROM emp e left JOIN dept de ON e.deptno=de.deptno; +9、列出所有部门的详细信息和部门人数。 +SELECT e.deptno,de.dname,COUNT(*) FROM emp e LEFT JOIN dept de ON de.deptno=e.deptno GROUP BY deptno; +10、列出各种工作的最低工资。 +select + distinct job 工作, + min(sal+ifnull(comm,0)) over (partition by job) 最低工资 +from emp; + 11、列出各个部门的 经理 的最低薪金。 +select + deptno 部门, + min(sal) over (partition by deptno) 经理的最低薪金 +from emp where job = '经理'; +12、列出所有员工的年工资,按年薪从低到高排序。 +select ename 姓名,(sal+ifnull(comm,0))*12 年薪 from emp order by 年薪; +``` + + + + +```` + -- Gitee From beef2bc4ebd8d52be86d21324c605d5cf354e8ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=98=8E=E5=87=BD?= <3084917167@qq.com> Date: Wed, 25 Oct 2023 10:04:19 +0000 Subject: [PATCH 2/6] =?UTF-8?q?02=20=E9=99=88=E6=98=8E=E5=87=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈明函 <3084917167@qq.com> --- .../\347\264\242\345\274\225.md" | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 "02 \351\231\210\346\230\216\345\207\275/\347\264\242\345\274\225.md" diff --git "a/02 \351\231\210\346\230\216\345\207\275/\347\264\242\345\274\225.md" "b/02 \351\231\210\346\230\216\345\207\275/\347\264\242\345\274\225.md" new file mode 100644 index 0000000..ab910cd --- /dev/null +++ "b/02 \351\231\210\346\230\216\345\207\275/\347\264\242\345\274\225.md" @@ -0,0 +1,93 @@ +````mysql +#### 索引优点缺点: + +```mysql +索引的优点: +1.提升了select速度 +2.提高了数据检索的效率 +3.降低了数据库的io成本 +``` + +```mysql +索引的缺点: +1.降低了insert,update,delete的速度 +2.提高了查询速度,降低了更新表的速度 +``` + +#### 索引的分类: + +```mysql +单列索引: +方式一: +create index 索引名 on 表名 +直接删除索引: +drop index 索引名 on 表名 +修改表结构追加普通索引: +alter table 表名 add index 索引名(列名) +修改表结构删除索引: +alter table 表名 drop index 索引名 +查看表的索引: +show index from 表名; +``` + +#### 唯一索引: + +```mysql +create unique index 索引名 on 表名(列名) +alter table 表名 add unique 索引名 +alter table 表名 drop primary key +``` + +#### 作业: + +```mysql +create database test_1019 charset utf8; +use test_1019; +create table tb_user( + id int primary key auto_increment comment '主键', + name varchar(50) not null comment '用户名', + phone varchar(11) not null comment '手机号', + email varchar(100) comment '邮箱', + profession varchar(11) comment '专业', + age tinyint unsigned comment '年龄', + gender char(1) comment '性别 , 1: 男, 2: 女', + status char(1) comment '状态', + createtime datetime comment '创建时间' +) comment '系统用户表'; + + + +DROP procedure tb_user +delimiter // +create procedure tb_user() +begin +declare i int; +set i=1; +while i<5000000 DO +insert into tb_user values(null,'小米','15627381937','xiaomi88@qq.com','软件工程',18,'2','4','2003-10-19 00:00:00'); +set i=i+1; +end while; +end // +delimiter; +call tb_user(); +select * from tb_user; + +-- 执行查询文件tb_user.sql,数据准备好了之后,完成如下需求: +-- 1. name字段为姓名字段,该字段的值可能会重复,为该字段创建索引。 +create index idx_name on tb_user(name); +-- 2. phone手机号字段的值,是非空,且唯一的,为该字段创建唯一索引。 +create unique index idx_phone on tb_user(phone); +-- 3. 为profession、age、status创建联合索引。 +create index idx_pas on tb_user(profession,age,`status`); +drop index idx_pas on tb_user; +-- 4. 为email建立合适的索引来提升查询效率。 +create unique index idx_email on tb_user(email); +-- 5. 查看tb_user表的所有的索引数据。 +show index from tb_user; +``` + + + + +```` + -- Gitee From 35b56698233745fe52bc1f7f83ce004bb4da9188 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=98=8E=E5=87=BD?= <3084917167@qq.com> Date: Wed, 25 Oct 2023 10:06:19 +0000 Subject: [PATCH 3/6] =?UTF-8?q?02=20=E9=99=88=E6=98=8E=E5=87=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈明函 <3084917167@qq.com> --- .../\347\252\227\345\217\243.md" | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 "02 \351\231\210\346\230\216\345\207\275/\347\252\227\345\217\243.md" diff --git "a/02 \351\231\210\346\230\216\345\207\275/\347\252\227\345\217\243.md" "b/02 \351\231\210\346\230\216\345\207\275/\347\252\227\345\217\243.md" new file mode 100644 index 0000000..827fec7 --- /dev/null +++ "b/02 \351\231\210\346\230\216\345\207\275/\347\252\227\345\217\243.md" @@ -0,0 +1,45 @@ +````mysql +```mysql +#按员工工资进行排序,查询当前员工与前一位和后一位的工资平均值 +SELECT *,avg(salary) over (ORDER BY salary rows BETWEEN 1 preceding AND 1 following) FROM employee; + +#查询各部门中小于等于当前员工实际薪资的比例 +SELECT ename,dname,salary,CUME_DIST() over (PARTITION by dname ORDER BY salary DESC) FROM employee; + +#查询每个员工工资在全部员工中的排名比例 +SELECT ename,dname,salary,CUME_DIST() over ( ORDER BY salary DESC) FROM employee; + +#将所有员工按照工龄分为4个组,并统计每个组的人数 +SELECT ename,hiredate,NTILE(4) over (ORDER BY TIMESTAMPDIFF( YEAR, hiredate, NOW())) FROM employee; + +#将员工按照工资分为3个组,并统计组别,每组平均工资,工资范围(first_value、last_value) +WITH a AS( +SELECT NTILE(3) over (ORDER BY salary) n,salary FROM employee ) +SELECT n,avg(a.salary),max(salary),min(salary) FROM a GROUP BY a.n; + + #返回员工的实际年龄,如果小于当前日期则减1岁 +SELECT + dname, + ename, + DATEDIFF( NOW(), birth )/365 `DAY` +FROM + employee +ORDER BY + birth; + + #求每个员工还有多少天过生日,并返回下次生日是星期几\ +WITH +a as +(SELECT + ename, + birth, + DATEDIFF(DATE_FORMAT(NOW(),'%Y-%m-%d'),CONCAT(YEAR(NOW()),'-',MONTH(birth),'-',DAY(birth))) as `day` FROM employee) + SELECT + a.ename, + if(a.`day`<0,a.`day`+365,a.`day`) `date` + ,DATE_FORMAT( CONCAT( YEAR ( NOW() + INTERVAL 1 YEAR ), '-', MONTH ( a.birth ), '-', DAY ( a.birth )), '%W' ) `week` + FROM a; + +``` +```` + -- Gitee From 923d8b9eb1ad65d8f1d03089049d02cd44e7654a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=98=8E=E5=87=BD?= <3084917167@qq.com> Date: Wed, 25 Oct 2023 10:16:19 +0000 Subject: [PATCH 4/6] =?UTF-8?q?02=20=E9=99=88=E6=98=8E=E5=87=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈明函 <3084917167@qq.com> --- ...45\350\257\242\347\254\224\350\256\260.md" | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 "02 \351\231\210\346\230\216\345\207\275/\345\255\220\346\237\245\350\257\242\347\254\224\350\256\260.md" diff --git "a/02 \351\231\210\346\230\216\345\207\275/\345\255\220\346\237\245\350\257\242\347\254\224\350\256\260.md" "b/02 \351\231\210\346\230\216\345\207\275/\345\255\220\346\237\245\350\257\242\347\254\224\350\256\260.md" new file mode 100644 index 0000000..2b72301 --- /dev/null +++ "b/02 \351\231\210\346\230\216\345\207\275/\345\255\220\346\237\245\350\257\242\347\254\224\350\256\260.md" @@ -0,0 +1,81 @@ +```mysql +## 子查询 + +含义: + +- 一条查询语句中又嵌套了另一条完整的select语句 +- 外面的语句可以是insert、update、delete、select等,一般select作为外面语句较多 +- 被嵌套的select语句,称为子查询或内查询 +- 在外面的查询语句,称为主查询或外查询 + +特点: + +- 子查询都放在小括号内 + +- 子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧 + +- 子查询优先于主查询执行,主查询使用了子查询的执行结果 + +- 子查询根据查询结果的行数不同分为以下两类: + +- - 单行子查询 + + - - 结果集只有一行 + + - 一般搭配单行操作符使用:> < = <> >= <= + + - 非法使用子查询的情况: + + - - 子查询的结果为一组值 + - 子查询的结果为空 + + - 多行子查询 + + - - 结果集有多行 + - 一般搭配多行操作符使用:any、all、in、not in + +- in:属于子查询结果中的任意一个就行 + +- any和all往往可以用其他查询代替 + +分类: + +按子查询出现的位置: + +> select后面: +> 仅仅支持标量子查询 +> +> from后面: +> 支持表子查询 必须起别名 +> where或having后面:★ +> 标量子查询(单行) √ +> 列子查询 (多行) √ +> +> 行子查询 +> +> exists后面(相关子查询) +> 表子查询 + +按结果集的行列数不同: + +- 标量子查询(结果集只有一行一列) +- 列子查询(结果集只有一列多行) +- 行子查询(结果集有一行多列) +- 表子查询(结果集一般为多行多列) + +**where或having后面** + +- 标量子查询(单行子查询) +- 列子查询(多行子查询) +- 行子查询(多列多行) + +特点: + +- 子查询放在小括号内 +- 子查询一般放在条件的右侧 +- 标量子查询,一般搭配着单行操作符使用> < >= <= = <> +- 列子查询,一般搭配着多行操作符使用**in、any/some、all** +- **in /not in =any** +- 子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果 +``` + -- Gitee From e2c0356b0466ad09d1c31c5e9d45dba09461a438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=98=8E=E5=87=BD?= <3084917167@qq.com> Date: Wed, 25 Oct 2023 10:18:55 +0000 Subject: [PATCH 5/6] =?UTF-8?q?02=20=E9=99=88=E6=98=8E=E5=87=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈明函 <3084917167@qq.com> --- ...52\347\216\257\347\254\224\350\256\260.md" | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 "02 \351\231\210\346\230\216\345\207\275/\345\276\252\347\216\257\347\254\224\350\256\260.md" diff --git "a/02 \351\231\210\346\230\216\345\207\275/\345\276\252\347\216\257\347\254\224\350\256\260.md" "b/02 \351\231\210\346\230\216\345\207\275/\345\276\252\347\216\257\347\254\224\350\256\260.md" new file mode 100644 index 0000000..8eb89cd --- /dev/null +++ "b/02 \351\231\210\346\230\216\345\207\275/\345\276\252\347\216\257\347\254\224\350\256\260.md" @@ -0,0 +1,100 @@ +```mysql +create database text charset utf8; +use text; + +# 0. 准备工作 + + create table student( + id int primary key auto_increment, + name varchar(15) not null, + phone varchar(15) unique, + birth date + ); + + insert into student(name,phone,birth) + values + ('朱茵','13201233453','1982-02-12'), + ('孙燕姿','13501233653','1980-12-09'), + ('田馥甄','13651238755','1983-08-21'), + ('邓紫棋','17843283452','1991-11-12'), + ('刘若英','18635575464','1989-05-18'), + ('杨超越','13761238755','1994-05-11'); + + +# 1. --------------第一题----------------------- + +# 创建存储过程add_student(),实现传入姓名和手机号和生日,插入到 student 表中 + +delimiter // +create procedure add_student(in na varchar(15),in tel varchar(15),in da date) +BEGIN +insert into student(name,phone,birth) + values + (na,tel,da); +END // + +# 调用 + +call add_student('kk','12345678801','1989-05-18'); + +# 查看数据是否成功插入 + +select * from student; + + +# 2.--------------第二题----------------------- + + +# 创建存储过程get_tel(),实现传入学生编号,返回学生姓名和学生电话 + +delimiter // +create procedure get_tel(in n int) +BEGIN +select name 学生姓名,phone 学生电话 FROM student where id=n; +end // + +# 调用 + +call get_tel(1) + + + +# 3.--------------第三题----------------------- + +# 创建存储过程birthday_battle(),实现传入两个学生编号,返回生日日期间隔大小(天数) + +delimiter // +create birthday_battle(in n int,in m int) +BEGIN +select birth FROM student where id=n; +select birth FROM student where id=m; +end // + +#调用 + + +# 4.--------------第四题----------------------- + +# 创建存储过程studen_limit(),根据传入的起始索引和条目数,查询学生表的记录 + + +# 调用 + + + + +# 5.--------------第五题----------------------- + +# 使用inout模式参数创建存储过程get_double(),要求 传入a和b两个值,最终a和b都翻倍并返回 + +# 调用 + + + +# 6. 删除第四题的存储过程 + + + +# 7. 查看第五题中存储过程的信息 +``` + -- Gitee From 89b96fb686bdd1b7ebf4df0dae626a32e5eb5c28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=98=8E=E5=87=BD?= <3084917167@qq.com> Date: Wed, 25 Oct 2023 10:26:35 +0000 Subject: [PATCH 6/6] =?UTF-8?q?02=20=E9=99=88=E6=98=8E=E5=87=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈明函 <3084917167@qq.com> --- ...70\346\240\207\347\254\224\350\256\260.md" | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 "02 \351\231\210\346\230\216\345\207\275/\346\270\270\346\240\207\347\254\224\350\256\260.md" diff --git "a/02 \351\231\210\346\230\216\345\207\275/\346\270\270\346\240\207\347\254\224\350\256\260.md" "b/02 \351\231\210\346\230\216\345\207\275/\346\270\270\346\240\207\347\254\224\350\256\260.md" new file mode 100644 index 0000000..655513a --- /dev/null +++ "b/02 \351\231\210\346\230\216\345\207\275/\346\270\270\346\240\207\347\254\224\350\256\260.md" @@ -0,0 +1,156 @@ +````mysql +## 游标: + +```mysql +1. 声明游标 +declare 游标名 cursor for sql语句 +2. 打开游标 +open 游标名 +3. 使用游标 +fetch 游标名 into 变量1,变量....N +4. 关闭游标 +close 游标名 +``` + +```mysql + declare 处理方式 handler for 错误类型 处理语句 + 处理方式:continue (表示遇到错误不处理,继续执行) + + exit (表示遇到错误马上退出) +``` + +## 作业: + +```mysql +create database test01 charset utf8; +use test01; +-- 部门表 +create table dept( + deptno int primary key auto_increment, -- 部门编号 + dname varchar(14) , -- 部门名字 + loc varchar(13) -- 地址 +) ; +-- 员工表 +create table emp( + empno int primary key auto_increment,-- 员工编号 + ename varchar(10), -- 员工姓名 - + job varchar(9), -- 岗位 + mgr int, -- 直接领导编号 + hiredate date, -- 雇佣日期,入职日期 + sal int, -- 薪水 + comm int, -- 提成 + deptno int not null, -- 部门编号 + foreign key (deptno) references dept(deptno) +); +insert into dept values(10,'财务部','北京'); +insert into dept values(20,'研发部','上海'); +insert into dept values(30,'销售部','广州'); +insert into dept values(40,'行政部','深圳'); +insert into emp values(7369,'刘一','职员',7902,'1980-12-17',800,null,20); +insert into emp values(7499,'陈二','推销员',7698,'1981-02-20',1600,300,30); +insert into emp values(7521,'张三','推销员',7698,'1981-02-22',1250,500,30); +insert into emp values(7566,'李四','经理',7839,'1981-04-02',2975,null,20); +insert into emp values(7654,'王五','推销员',7698,'1981-09-28',1250,1400,30); +insert into emp values(7698,'赵六','经理',7839,'1981-05-01',2850,null,30); +insert into emp values(7782,'孙七','经理',7839,'1981-06-09',2450,null,10); +insert into emp values(7788,'周八','分析师',7566,'1987-06-13',3000,null,20); +insert into emp values(7839,'吴九','总裁',null,'1981-11-17',5000,null,10); +insert into emp values(7844,'郑十','推销员',7698,'1981-09-08',1500,0,30); +insert into emp values(7876,'郭十一','职员',7788,'1987-06-13',1100,null,20); +insert into emp values(7900,'钱多多','职员',7698,'1981-12-03',950,null,30); +insert into emp values(7902,'大锦鲤','分析师',7566,'1981-12-03',3000,null,20); +insert into emp values(7934,'木有钱','职员',7782,'1983-01-23',1300,null,10); + +drop procedure salary_sum; +-- 1.利用游标,查询并计算出emp表中全公司的总薪资(salary和comm) +delimiter // +create procedure salary_sum(out sum_salary double) +begin + declare emp_count int; + declare salary double; + declare com double; + declare sum double default 0; + declare i int default 1; + + # 1. 声明游标 + declare my_salary cursor for select sal,ifnull(comm,0) from emp; + # 处理条件(遇到异常跳出本次循环) + # declare continue handler for 1329 set i = 0; + # 查询有多少员工 + select count(*) into emp_count from emp; + # 2.打开游标 + open my_salary; + # 3. 循环使用游标,累加计算总工资 + while i<= emp_count do + fetch my_salary into salary,com; + set sum = sum + salary + com ; + set i = i+1; + end while; + set sum_salary = sum; + # 4. 关闭游标 + close my_salary; +end //; +delimiter ; + +call salary_sum(@sum); +select @sum; +# select sum(sal+ifnull(comm,0)) from emp; + + + +-- 2.利用游标修改表格,如果sal<1000,则删除工资为此值的员工,如果1000 < sal <= 3000,该员工薪资涨100,否则扣工资100 (将修改之后的信息添加到一个新表) +delimiter // +create procedure new_table() +begin + declare e_id int; + declare e_name varchar(10); + declare e_job varchar(10); + declare e_mgr int; + declare e_hiredate date; + declare salary int; + declare e_comm int; + declare e_deptno int; + + # 定义条件(如果 i = 1 就会死循环) + declare i int default 1; + # 1. 声明游标 + declare my_sal cursor for select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp; + # 处理条件(遇到指针越界跳出本次循环) + declare continue handler for 1329 set i = 0; + # 2.打开游标 + open my_sal; + # 创建一个新表 + drop table if exists new_emp; + create table new_emp( + empno int primary key auto_increment,-- 员工编号 + ename varchar(10), -- 员工姓名 + job varchar(9), -- 岗位 + mgr int, -- 直接领导编号 + hiredate date, -- 雇佣日期,入职日期 + sal int, -- 薪水 + comm int, -- 提成 + deptno int not null, -- 部门编号 + foreign key (deptno) references dept(deptno) + ); + # 3. 循环使用游标,筛选工资,添加到新表 + while i = 1 do + fetch my_sal into e_id,e_name,e_job,e_mgr,e_hiredate,salary,e_comm,e_deptno; + if salary < 1000 then select concat(e_name,'员工薪资低于1000已被删除') 已删除员工; + elseif salary > 1000 and salary <=3000 then + # 修改员工薪资涨100 + set salary = salary + 100; + insert into new_emp values(e_id,e_name,e_job,e_mgr,e_hiredate,salary,e_comm,e_deptno); + else + # 否则大于3000,扣工资100 + set salary = salary - 100; + insert into new_emp values(e_id,e_name,e_job,e_mgr,e_hiredate,salary,e_comm,e_deptno); + end if; + end while; + # 4. 关闭游标 +end // +delimiter ; + +call new_table(); +``` +```` + -- Gitee