diff --git "a/54 \345\217\266\345\255\220\350\261\252/10.11\344\275\234\344\270\232.md" "b/54 \345\217\266\345\255\220\350\261\252/10.11\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..27c55caecbcfea0125e71c8ca75079772ed5b8c5 --- /dev/null +++ "b/54 \345\217\266\345\255\220\350\261\252/10.11\344\275\234\344\270\232.md" @@ -0,0 +1,96 @@ +```mysql +create database tt charset utf8; +use tt; +-- 部门表 +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 tt_a (out cc int) + begin + declare aa int; + declare bb int; + declare i int default 0; + declare mn cursor for select sal,IFNULL(comm,0) from emp; + declare continue handler for 1329 set i = 1; + open mn; + set cc = 0; + while i = 0 do + fetch mn into aa,bb; + set aa = aa; + set bb = bb; + set cc = cc+aa+bb; + end while; + close mn; + end // +delimiter ; +call tt_a(@cc); +select @cc; +-- 2.利用游标修改表格,如果sal<1000,则删除工资为此值的员工,如果1000 < sal <= 3000,该员工薪资涨100,并将员工信息添加到一个新表,否则扣工资100 +delimiter // + create procedure tt_b () + begin + declare myno int; + declare mysal int; + declare i int default 0; + declare qq cursor for select empno,sal from emp; + declare continue handler for 1329 set i = 1; + open qq; + create table xxx ( + empno int, + sal int + ); + while i = 0 do + fetch qq into myno,mysal; + set myno = myno; + set mysal = mysal; + if mysal < 1000 then delete from emp where empno = myno; + elseif mysal <= 3000 then + update emp set sal = sal+100 where empno = myno; + insert into xxx values (myno,mysal); + else update emp set sal = sal-100 where empno = myno; + end if; + end while; + close qq; + end // +delimiter ; + +call tt_b(); +select * from xxx; +``` + diff --git "a/54 \345\217\266\345\255\220\350\261\252/10.11\347\254\224\350\256\260.md" "b/54 \345\217\266\345\255\220\350\261\252/10.11\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..03c24256eaa621feadac1c30d17f81ee49407cd8 --- /dev/null +++ "b/54 \345\217\266\345\255\220\350\261\252/10.11\347\254\224\350\256\260.md" @@ -0,0 +1,39 @@ +存储函数的作用 + +函数的返回值是能返回一个 + +function 的参数的默认为 in 不能修改 + +charucteristic 不能修改其取值信息 + +游标 + +​游标是一种临时的数据库对象,可以指向存储在数据库表中的数据行指针。这里游标充当了指针的作用,可以通过操作游标来对数据进行操作 + +​mysql中游标可以在存储数据过程和函数中使用 + +使用游标的步骤 + + 游标必须在声明处理程序之前被声明,并且变量和条件还必须在声明游标或处理程序之前被声明 + +第一步:声明游标 + +​ declare 游标名 cursor for select语句 (返回一个用于创建游标的结果集) + +第二步:打开游标 + +​ open 游标名(定义好后,要想使用游标,先要打开。打开时select语句的查询结果集就会送到游标工作区) + +第三步:使用游标 + +​ fetch 游标名 into 变量1,变量2,.... + +​ 使用游标来读取当前行,并将数据保存在变量中,游标指针指到下一行。如果游标读取的数据行有多个列名,则在into关键字后面赋值给多个变量名即可。 + +​ 注意:变量必须在声明游标之前就定义好。 + +​ 注意:游标的查询结果集中的字段数,必须跟在into后面的变量数一致 + +第四步:关闭游标 + +​ close 游标名; \ No newline at end of file