diff --git "a/43 \351\237\251\346\226\207\346\235\260/\346\270\270\346\240\207.md" "b/43 \351\237\251\346\226\207\346\235\260/\346\270\270\346\240\207.md" new file mode 100644 index 0000000000000000000000000000000000000000..4c4342aa7ce4e2f1793ec7e1908e0bf663d7fba2 --- /dev/null +++ "b/43 \351\237\251\346\226\207\346\235\260/\346\270\270\346\240\207.md" @@ -0,0 +1,146 @@ +# 游标笔记 + +~~~mysql +1.声明语法 +declare 游标名 cursor for select语句 + +2.打开游标 + +open 游标名; + +3.使用游标 + +fetch 游标名 into 变量1【变量2,...】 ; + +4.关闭游标 + +close 游标名; + +5.关闭游标之后,我们就不能再检索查询结果中的数据行,如果需要检索只能再次打开游标。 + + + +存储函数: +注意:1.函数返回值只能返回一个。 + +​ 2.函数默认为in + +​ 3.一般用于查询结果为一个值的返回 + +​ 4.函数能做的,存储过程也能做 +语法: +create function 函数名(参数名 参数类型,...) +returns 返回值类型 +[determinnstic .....] 如果出现sql语句,一定要写contains sql +begin +函数体 +end +~~~ + +# 游标作业 + +~~~mysql + create database abc charset utf8; + use abc; + + -- 部门表 + 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) + +drop procedure c1; +delimiter // +create procedure c1(out mp int) +begin + declare i int default 1; + declare mysal int; + declare mycomm int; + declare mycou int; + declare i int default 0; + declare curs cursor for select sal,ifnull(comm,0) from emp; + select count(*) into mycou from emp; + open curs; + while i<=mycou do + fetch curs into mysal,mycomm; + set i=i+1; + set s= mysal+mycomm+s ; + end while; + close curs; + set mp=s; + end // + delimiter ; +-- 调用 + call c1(@ab); + select @ab; + +-- 2.利用游标修改表格,如果sal<1000,则删除工资为此值的员工,如果1000 < sal <= 3000,该员工薪资涨100,并且把结果放入一张新表中,否则扣工资100 +select * from emp; +drop procedure c2; +delimiter // +create procedure c2() +begin + declare i int default 1; + declare mye varchar(50); + declare mysal int; + declare cou int; + declare cur cursor for select ename,sal from emp; + drop table if exists c3; + create table c3( + id int primary key auto_increment, + mye varchar(50), + mysal int + ); + select count(*) into cou from emp; + open cur; + while i