diff --git "a/56 \350\265\265\346\225\217/20231011\344\275\234\344\270\232.md" "b/56 \350\265\265\346\225\217/20231011\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..9dbb8839673d1ec6404ac0fcd82be084f4e1a5c4 --- /dev/null +++ "b/56 \350\265\265\346\225\217/20231011\344\275\234\344\270\232.md" @@ -0,0 +1,158 @@ +## 储存函数 + +function (返回值有且只能有一个) + +create function 名称(参数名称,数据类型) 参数类型只有一个 in 是默认的 ; + +returns 数据类型 (定义返回值类型 要和下面返回里的值数据类型一致) + +deterministis + +如果有sql语句打 contains sql + +如果没有sql语句打 no sql + +begin + +return(sql语句)返回 + +end + +调用 + +select 名称() + +修改也是先删在改; + +## 游标 + +1.声明游标 在begin下面使用 + +declare 名称 cursor for sql语句 + +2.打开游标 + +open 名称 + +3.使用游标(从游标中取数据) + +fetch 名称 into 变量 (每次只执行一次,可以配合循环使用)(变量数要和上面sql语句查的数据数量和数据类型一样) + +4.退出游标 + +close 名称 + + + + + +~~~MYSQL + -- 部门表 + 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 if exists aa; +delimiter // +CREATE procedure aa(out nub int) +BEGIN +declare msal int; +declare mcomm int; +declare i int default 1; +declare num int default 0; +declare y int; +declare myta cursor for select sal,ifnull(comm,0) from emp; + select count(*) into y from emp; +open myta; + while i<=y do + fetch myta into msal,mcomm; + set num = num+msal+mcomm; + set nub=num; + set i=i+1; + end while; + close myta; +end // +delimiter ; +call aa(@a); +SELECT @a; +##2.利用游标修改表格,如果sal<1000,则删除工资为此值的员工,如果1000 < sal <= 3000,该员工薪资涨100添加到一个新表中,否则扣工资100 +drop procedure if exists bb; +delimiter // +CREATE procedure bb() +BEGIN +declare mempno int; +declare mename varchar(10); +declare mjob varchar(9); +declare mmgr int; +declare mhiredate date; +declare msalary int; +declare mcomm int; +declare mdeptno int; +declare i int default 1; +declare y int; +declare upda cursor for select * from emp; +select count(*) into y from emp; +SELECT * from emp; + create table memp( + 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) + ); +open upda; +while i<=y do + fetch upda into mempno,mename,mjob,mmgr,mhiredate,msalary,mcomm,mdeptno; + if msalary < 1000 then delete from emp where sal=msalary; + elseif msalary > 1000 and msalary <=3000 then + insert into memp VALUES (mempno,mename,mjob,mmgr,mhiredate,msalary,mcomm,mdeptno); + else update emp SET sal = sal-100 where sal=msalary; + end if; + set i =i+1; + end while; + close upda; + SELECT * from emp; + select * from memp; +end // + +call bb(); +~~~ +