函数
含义:
一组预先编译好的SQL语句的集合,理解成批处理语句。
函数的好处:
一:提高代码的重用性
二:简化操作
三:减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率。
存储过程和函数的区别:
存储过程:可以有0个返回,也可以有多个返回,适合做批量插入,批量更新。
函数:有且仅有一个返回,适合做处理数据后返回一个结果。
创建函数语法
create function 函数名(参数列表) returns 返回类型
begin
函数体
end
注意:
一:参数列表包含两部分
参数名 参数类型
二:函数体:肯定会有return语句,如果没有会报错
如果return语句没有放在函数体的最后也不报错,但不建议
return 值;
三:函数体中仅有一句话,则可以省略begin end
四:使用delimiter 语句设置结束标记
二:调用语法:
select 函数名(参数列表)
案例演示:
一:无参有返回
案例:返回公司的员工个数
#先开启
show variables like 'log_bin_trust%';
set global
log_bin_trust_function_creators=True;
delimiter $
create function myf1() returns int
begin
declare c int default 0; #定义常量
select
count(*) into c #赋值
from employees;
return c;
end $
select myf1() $
二:有参有返回
案例:根据员工名,返回它的工资’
show variables like 'log_bin_trust%';
set global log_bin_trust_function_creators=TRUE;
delimiter $
create function myf2(
empname varchar(20) ) returns double
begin
sal int default 0;#定义局部变量
select
salary into sal #赋值
from employees
where last_name = empname;
return sal;
end $
select myf2('Lochhar') $
根据部门名,返回该部门的平均工资
show variables like 'log_bin_trust%';
set global log_bin_trust_function_creators=TRUE;
delimiter $
create function myf3(deptName varchar(20))
returns double
begin
declare sal double;
select avg(salary) into sal
from employees e
join departments d
on e.department_id = d.department_id
where d.department_name = deptName;
return sal;
end $
select myf3('int') $
三:查看函数
show create function myf3;
四:删除函数
drop function myf3;
## ```案例:
**一:创建函数,实现传入两个float,返回两者之和**
```sql
show variables like 'log_bin_trust%';
set global log_bin_trust_function_creators=TRUE;
delimiter $
CREATE FUNCTION myf4 ( num1 FLOAT, num2 FLOAT ) RETURNS FLOAT BEGIN
DECLARE
sum FLOAT DEFAULT 0;
SET sum = num1 + num2;
RETURN sum;
END $
SELECT myf4 ( 1, 2 ) $
流程控制结构
顺序结构:程序从上往下执行
分支结构:程序从两条或多条路径中选择一条去执行
循环结构:程序在满足一定条件的基础上,重复执行一段代码。
一:分支结构
if 函数
功能:实现简单的双分支
语法:if(表达式1,表达式2,表达式3)
执行顺序:
如果表达式1成立,则if函数返回表达式2的值,否则返回表达式3的值
应用在任何地方。
二:case结构
**情况1:类似于java中的switch语句,一般用于实现等值判断**
语法:
case 变量 | 表达式 | 字段
when 要判断的值 then 返回的值1或语句1;
when 要判断的值 then 返回的值2或语句2;
..................
else 要返回的值n或语句n;
end case;
情况2:类似于java中的多重if语句,一般用于实现区间判断
语法:
case
when 要判断的条件1 then 返回的值1或语句1;
when 要判断的条件2 then 返回的值1或语句2;
..................
else 要返回的值n或语句n;
end case;
特点:
一:可以作为表达式,嵌套在其它语句中使用,可以放在任何地方,begin end中或begin end的外面
可以作为独立的语句去使用,只能放在begin end中。
二:如果when中的值满足或条件成立,则执行对应的then后面的语句,并且结束case,如果都不满足,则执行else中的语句或值。
三:else可以省略,如果else省略了,并且所有when条件都不满足,则返回null。
案例:
创建存储过程,根据传入的成绩,来显示等级,比如传入的成绩90-100 显示A,80-90 显示B 60-80 显示C
delimiter $
create procedure test_case(in score int)
begin
case
when score >=90 and score<=100 then select 'A';
when score >=80 then select 'B';
when score >=60 then select 'C';
else select 'D';
end case;
end $
call test_case(90);
if 结构
功能:实现多重分支
语法:
if 条件1 then 语句1;
elseif 条件2 then 语句2;
.............
else 语句n;
end if;
应用场合:应用在begin end中。
案例 if :创建函数,根据传入的成绩,来显示等级,比如传入的成绩90-100 显示A,80-90显示B 60-80显示C
delimiter $
create function test_if(
score int) returns char
begin
if score >=90 and score <=100 then return 'A';
elseif score>=80 then return 'B';
elseif score>=60 then return 'C';
else return 'D';
end if;
end $
select test_if(80) $
二:循环结构
分类:
while loop repeat
循环控制
iterate类似于continue,继续,结束本次循环,继续下一次循环
leave类似于 break,跳出,结束当前所在的循环
一:while
**语法:**
【标签:】 while 循环条件 do
循环体;
end while 【标签】;
联想:
while(循环条件){
循环体;
}
二:loop
语法:
【标签:】loop
循环体;
end loop 【标签】;
可以用来模拟简单的死循环
三:repeat
语法:
【标签:】repeat
循环体;
until 结束循环的条件
end repeat 【标签】;
没有添加循环控制的语句。
案例:批量插入,根据次数插入到admin表中多条记录
drop procedure pro_while;
delimiter $
create procedure pro_while(in insertCount int)
begin
declare i int default 1;
while i<=insertCount do
insert into admin(username,password) values(CONCAT('Rose',i),'555');
set i=i+1;
end while ;
end $
delimiter $
call pro_while(100)$
select * from admin;
添加leave语句
案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
delimiter $
drop procedure my_while;
TRUNCATE TABLE admin$
CREATE PROCEDURE my_while ( IN insertCount INT )
BEGIN
DECLARE i INT DEFAULT 1;
a :WHILE i <= insertCount DO
INSERT INTO admin ( username, PASSWORD ) VALUES (concat('xiaoxu',i),'222');
IF i >= 20 THEN LEAVE a;
END IF;
SET i = i + 1;
END WHILE a;
END $
CALL my_while ( 100 ) $
select * from admin;
添加iterate语句
案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数次
delimiter $
drop procedure my_while;
TRUNCATE TABLE admin$ CREATE PROCEDURE my_while ( IN insertCount INT )
BEGIN
DECLARE i INT DEFAULT 0;
a :WHILE i <= insertCount DO
set i=i+1;
if MOD(i,2)!=0 then iterate a;
end if;
INSERT INTO admin ( username, PASSWORD ) VALUES (concat('xiaoxu',i),'222');
END WHILE a;
END $
CALL my_while ( 100 ) $
select * from admin;
案例:向该表中插入指定个数的随机的字符串