From 4d112b4fb7e3db813829678a4417e57577507584 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=96=E5=BF=83=E5=A6=8D?= <2392642810@qq.com> Date: Wed, 11 Oct 2023 22:50:08 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\344\270\216\346\270\270\346\240\207.md" | 181 ++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 "03 \350\265\226\345\277\203\345\246\215/20231011 \345\255\230\345\202\250\345\207\275\346\225\260\344\270\216\346\270\270\346\240\207.md" diff --git "a/03 \350\265\226\345\277\203\345\246\215/20231011 \345\255\230\345\202\250\345\207\275\346\225\260\344\270\216\346\270\270\346\240\207.md" "b/03 \350\265\226\345\277\203\345\246\215/20231011 \345\255\230\345\202\250\345\207\275\346\225\260\344\270\216\346\270\270\346\240\207.md" new file mode 100644 index 0000000..50c0991 --- /dev/null +++ "b/03 \350\265\226\345\277\203\345\246\215/20231011 \345\255\230\345\202\250\345\207\275\346\225\260\344\270\216\346\270\270\346\240\207.md" @@ -0,0 +1,181 @@ +## 存储函数 + +```mysql +create function 函数名(参数名 参数类型,...) +returns 返回值类型 + 语句 +begin + 函数体 #函数体中肯定有 RETURN 语句 +end +``` + +```mysql +-- 创建 +delimiter // +create function f2() +returns varchar(20) -- return 处的数据类型 +deterministic +no sql -- 在不是sql语句的情况下使用,如果是 sql 则用 contains sql +begin + return 110 +end // + +-- 调用 +select f2(); -- 结果为 110 +``` + +## 游标 + +```mysql +-- 声明游标 +declare 游标名 cursor for sql语句(要查询的数据); + +-- 打开游标 +open 游标名; + +-- 使用游标(从游标中取得数据) +fetch 游标名 into 变量名1,变量名2; +-- 变量的类型和数量要由定义时的select得到的列的数列位置和类型决定 +-- 每一次fetch 游标就从结果集中下移一行 +-- 变量名要在定义好 + +-- 关闭游标 +close 游标名; +``` + +```mysql +delimiter // +create procedure 存储名(参数 参数名 参数名类型) +begin + declare 变量名1 变量名1的数据类型 default 0; -- 设置默认值,也可以不声明 + + # 定义游标 + declare 游标名 cursor for sql语句(要查询的数据); + -- 相当于把数据临时存储到一个地方后面再调用出来 + + # 打开游标 + open 游标名; + + repeat + # 使用游标(从游标中获取数据) + fetch 游标名 into 变量名1,变量名2; -- 把数据调用出来,一次一条 + SET sum_salary = sum_salary + cursor_salary; -- 把数据累加 + SET emp_count = emp_count + 1; -- 计数 + until 条件 + end repeat; + + # 关闭游标 + close emp_cursor; +END // + +call 存储名(); +``` + +## 作业 + +```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 v_1; + +delimiter // +create procedure v_1() +begin + declare i int default 1; + declare count int; + declare mysalary int; + declare sumsalary int default 0; + + declare salary cursor for select sal+ifnull(comm,0) from emp; + + open salary; + select count(*) into count from emp; + while i<=count do + fetch salary into mysalary; + set sumsalary=sumsalary+mysalary; + set i=i+1; + end while; + close salary; + select sumsalary; +end // +delimiter ; + +call v_1(); + +-- 2.利用游标修改表格,如果sal<1000,则删除工资为此值的员工,如果1000 < sal <= 3000,该员工薪资涨100,将信息赋值到一个新表,否则扣工资100 +drop procedure v_2; + +delimiter // +create procedure v_2() +begin + declare salary int default 0; + declare eid int ; + declare i int default 1; + declare count int; + + declare uemp cursor for select empno,sal from emp; + select count(*) into count from emp; + create table v_3( + eid int, + salary int + ); + + open uemp; + + while i<=count do + fetch uemp into eid,salary; + if salary<1000 then + delete from emp where sal<1000; + elseif 1000 Date: Thu, 12 Oct 2023 09:36:50 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\275\346\225\260\344\270\216\346\270\270\346\240\207.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/03 \350\265\226\345\277\203\345\246\215/20231011 \345\255\230\345\202\250\345\207\275\346\225\260\344\270\216\346\270\270\346\240\207.md" "b/03 \350\265\226\345\277\203\345\246\215/20231011 \345\255\230\345\202\250\345\207\275\346\225\260\344\270\216\346\270\270\346\240\207.md" index 50c0991..d7668ed 100644 --- "a/03 \350\265\226\345\277\203\345\246\215/20231011 \345\255\230\345\202\250\345\207\275\346\225\260\344\270\216\346\270\270\346\240\207.md" +++ "b/03 \350\265\226\345\277\203\345\246\215/20231011 \345\255\230\345\202\250\345\207\275\346\225\260\344\270\216\346\270\270\346\240\207.md" @@ -163,12 +163,12 @@ begin while i<=count do fetch uemp into eid,salary; if salary<1000 then - delete from emp where sal<1000; + delete from emp where sal<1000 where empno=eid; elseif 1000