From 26c31caaaa6b541c940f083b5435da3f8deb6d6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E4=BA=9A=E8=BE=89?= <3192667214@qq.com> Date: Thu, 12 Oct 2023 04:28:44 +0000 Subject: [PATCH] =?UTF-8?q?41=20=E5=91=A8=E4=BA=9A=E8=BE=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 周亚辉 <3192667214@qq.com> --- ...52\347\216\257\345\244\215\344\271\240.md" | 107 ++++++++++++ ...30\345\202\250\345\207\275\346\225\260.md" | 163 ++++++++++++++++++ 2 files changed, 270 insertions(+) create mode 100644 "41 \345\221\250\344\272\232\350\276\211/20231010 \345\276\252\347\216\257\345\244\215\344\271\240.md" create mode 100644 "41 \345\221\250\344\272\232\350\276\211/20231011 \346\270\270\346\240\207\357\274\214\345\255\230\345\202\250\345\207\275\346\225\260.md" diff --git "a/41 \345\221\250\344\272\232\350\276\211/20231010 \345\276\252\347\216\257\345\244\215\344\271\240.md" "b/41 \345\221\250\344\272\232\350\276\211/20231010 \345\276\252\347\216\257\345\244\215\344\271\240.md" new file mode 100644 index 0000000..58f7e73 --- /dev/null +++ "b/41 \345\221\250\344\272\232\350\276\211/20231010 \345\276\252\347\216\257\345\244\215\344\271\240.md" @@ -0,0 +1,107 @@ +### 笔记 + +set 变量1 = 值1, 变量名2=值2...; -- 一条赋值语句可以同时给过多个变量赋值,每个变量用";"隔开 + +@变量名=值 -- 会话变量可以不定义,直接赋值 + +select into形式给多个变量赋值,要求字段的数量要和变量数量一致 + +if和case + +if 不能用到select字段后面的位置,但case可以 + +if...then 后面只能接sql语句 + +case when ... then ...接结果或者sql语句[范围 ] + +case 表达式 when ... then ... [值] + +如果循环要用到leave(相当于break)iterate(相当于continue)这两种关键字,就一定给循环加上标签符 + +while(满足条件才循环,一开始就要设置条件)实现以下效果。 + +循环结构之repeat(类似于do while ,不管语句如何,都至少执行一次的结构) + +语法 repeat + + select...; + + until 条件... + +**declare 前面不能有其他语句** + +### 作业 + +-- 写一个存储过程,可以输入一个整数,输入小于或等于0时,提示非法输入,并中止这个存储过程, -- 否则先判断这个数和是不是大于20,如果大于20就从1循环到这个数,并找出所有的偶数(但遇到逢10的数要跳过)。小于等于20就提示数太小了,并退出。 + +-- 要求,循环部分,要用三种语法分别做一遍 + +loop循环方法: + +``` +delimiter // +create procedure v_5(in num int) +a:begin +declare i int default 0; +if num<=0 then select '非法输入'; leave a; +else if num>20 then +b:loop +set i=i+1; +if i%10=0 then iterate b; +elseif i%2=0 then select i; +end if; +if i=num then leave b; +end if; +end loop b; +else select '数太小了';leave a; +end if; +end if; +end // +delimiter ; +call v_5(30); +``` + +while循环方法: + +``` +delimiter // +create procedure pro_while(in num int) +a:begin + declare i int default 0; + if num<=0 then select '非法输入'; leave a; +else if num>20 then +b:while i5 then +b:repeat +set i=i+1; +if i%10=0 then iterate b; +elseif i%2=0 then select i; +end if; +until i=num +end repeat b; +else select '数太小了';leave a; +end if; +end // +delimiter ; +call pro_repeat(30); +``` \ No newline at end of file diff --git "a/41 \345\221\250\344\272\232\350\276\211/20231011 \346\270\270\346\240\207\357\274\214\345\255\230\345\202\250\345\207\275\346\225\260.md" "b/41 \345\221\250\344\272\232\350\276\211/20231011 \346\270\270\346\240\207\357\274\214\345\255\230\345\202\250\345\207\275\346\225\260.md" new file mode 100644 index 0000000..cd438cc --- /dev/null +++ "b/41 \345\221\250\344\272\232\350\276\211/20231011 \346\270\270\346\240\207\357\274\214\345\255\230\345\202\250\345\207\275\346\225\260.md" @@ -0,0 +1,163 @@ +## 笔记: + +**存储函数:** + +``` +delimiter // + +create function fun_name(参数名 参数类型,......) + +retures 返回值类型(结果的数据类型) -- 此处的数据类型要根据下面的reture语句得到,所以可以后面再写,注:此句后面不跟";" +[characteristics...] -- 写deterministic + -- contains sql / no sql +begin +reture (select '语句,只有一列且为一行结果,也可以是其他明确的值'); -- 函数返回值只能返回一个(函数能做的事,存储过程也能做) +end // +delimiter ; +select fun_name(); -- 调用存储过程 +``` + +**游标:** + +``` +delimiter // +create procedure pro_cursor() +begin +-- [可以声明或者定义其他的变量以便使用游标时fecth] ps:要放在定义游标之前 +-- 声明/定义游标 +declare cursor_name cursor for select * from 多行数据的表格; +-- 打开游标 +open cursor_name; +-- 使用游标(每fetch一次游标就从结果集向下移动一行) ps: 一般要用循环嵌套 +fetch cursor_name into 变量1,变量2...; -- 变量的类型和数量由定义游标时的select得到的列的位置和类型决定 +-- 关闭游标,释放内存 +close cursor_name; +end // +delimiter ; +``` + +***作业:*** + +#### 作业 + +```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); + +-- 1.利用游标,查询并计算出emp表中全公司的总薪资(salary和comm) +delimiter // +create procedure pro_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 cursor_name 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 cursor_name; + -- 3.使用游标 + while i<= emp_count do + fetch cursor_name into salary,com; + set sum = sum + salary + com ; + set i = i+1; + end while; + set sum_salary = sum; + -- 4. 关闭游标,释放内存 + close cursor_name; +end // +delimiter ; +call pro_sum(@sum); +select @sum; +-- select sum(sal+ifnull(comm,0)) from emp; + + + +-- 2.利用游标修改表格,如果sal<1000,则删除工资为此值的员工,如果1000 < sal <= 3000,该员工薪资涨100,否则扣工资100 (将修改之后的信息添加到一个新表) +delimiter // +create procedure pro_add() +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; + declare i int default 1; + -- 定义游标 + declare cursor_name cursor for select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp; + declare continue handler for 1329 set i = 0; + -- 打开游标 + open cursor_name; + drop table if exists table_01; + create table table_01( + 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) + ); + -- 使用游标 + while i = 1 do + fetch cursor_name 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 + + set salary = salary + 100; + insert into table_01 values(e_id,e_name,e_job,e_mgr,e_hiredate,salary,e_comm,e_deptno); + else + set salary = salary - 100; + insert into table_01 values(e_id,e_name,e_job,e_mgr,e_hiredate,salary,e_comm,e_deptno); + end if; + end while; + -- 关闭游标 + close cursor_name; +end // +delimiter ; +call pro_add(); +``` \ No newline at end of file -- Gitee