一:sql也是一门编程语言,可以用其编程

二:基本常规的编程要素

        变量,运算符,表达式,流程控制,函数


变量:

    典型的,字段名就是变量名,字段就是变量!

    特殊的变量,例如系统内置变量(character_set_xxx , autocommit)


变量的典型操作:赋值,取得值!


用户自定义变量:

    用户自定义变量需要使用 @ 作为变量名的前缀,用于区分是否是系统内置变量

    set 语句;可以完成对变量的设置

    set 变量名=变量值

wKiom1ZsJsHBNzqnAAAwV-67ZyA910.jpg


怎么取得?

    采用select语句即可!

wKiom1ZsJymjzQzpAAAZlKcft4w953.jpg


编程的实现:

    一共有三种编程方式:触发器,存储函数(自定义函数),存储过程


函数:

    对于mysql来讲,有内置函数

wKioL1ZsKGfynZFKAAAYo_JmoQU487.jpg


rand(),生成随机数的函数,得到0-1之间的随机数

        需要配合取整使用

floor() ,向下取整


substring(字符串,位置,长度) , 截取字符串函数

wKioL1ZsKcThBAZ2AAAkOfLkMNA274.jpg

注意:从1开始的下标,而且以字符数为单位:

wKiom1ZsKi_SSFwxAAAlyCWMBzk373.jpg


char_length() 字符数量

length() 字节长度

wKioL1ZsKtfiLZZoAABO9tCBLck586.jpg


convert(字符串 using 字符集) 字符转换到相应的目标字符集上

select id,convert(stu_name using gbk),height,money into outfile 'e:/VIP/student.csv'
fields terminated by ','
lines terminated by '\r\n'
from select_student;


自定义函数:

    函数的要素:函数名,函数体(返回值),函数参数

    函数的基本使用:声明,调用

    

    声明:

            create function functoin_name () returns int

            begin

                函数体

            end


创建自定义函数:

delimiter $$
create function hello_world() returns varchar(20)
begin
	return 'hello world';
end
$$
delimiter ;

wKioL1Zs09Cx7pgEAAAyBwkemz8494.jpg


调用自定义函数:

    类似于系统函数即可!

wKioL1Zs1Bnx0QxhAAAcFsrlr5Q500.jpg


注意:函数是存储在某个数据库内的,因此与库是相关的


自定义函数参数:

    

delimiter $$
create function sayHello(name varchar(10)) returns varchar(20)
begin
	return concat('hello ',name);
end
$$
delimiter ;

wKiom1Zs1Zmwg6GBAABJ4r0IuJo531.jpg


注意:参数也是需要有类型,而且不用使用 @ ,原因是函数内的变量不用区分!参数是一个局部变量!


函数局部变量与函数外全局变量的作用域问题:

    作用域是重叠的!在函数内,可以访问到函数外所定义的全局变量!

wKiom1Zs16qTr-vXAABXqK9tlv4011.jpg

wKioL1Zs19DRjj0QAABdPCTqpn8903.jpg


局部变量:

    此时在函数内,使用关键字 declare 来声明局部变量 (相当于JS中声明变量时用的var)!

delimiter $$
create function f2() returns varchar(20)
begin
	declare v1 char(3) default 'php';
	return v1;
end
$$
delimiter ;



流程控制:

    分支:

        if 条件 then 语句

        else if 条件 then 语句

        else 语句

        end if;

    循环:

        while 条件 do

        循环体

        end while;


示例1:求1-N之和

delimiter $$
 create function sumN(n int) returns int
 begin
  declare i int default 1;
  declare sum int default 0;
  while i<=n do
	set sum=sum+i;
	set i=i+1;
  end while;
  return sum;
 end
 $$
 delimiter ;



示例2:拼凑随机的名字!

    getName(2|3|4)

    参数为名字的长度,而返回值为名字!


    业务逻辑:

        取得姓,在某个集合内取得

        再取得名字(根据字数,取得的数量不同)。

delimiter $$
 create function getName(n int) returns varchar(5)
 begin
	declare allow_xing char(8) default '赵钱孙李周吴郑王';
	declare allow_ming char(12) default '淘宝百度天猫微信飞秋极限';
	declare xing char(1);
	declare ming varchar(4) default '';
	declare i int default 1;

	if !(n between 2 and 4) then
		return 0;
	end if;

	set xing = substring(allow_xing,floor(rand()*8)+1,1);

	while i <= n-1 do
		set ming = concat(ming,substring(allow_ming,floor(rand()*12)+1,1));
		set i = i + 1;
	end while;
	return concat(xing,ming);
 end
 $$
 delimiter ;


wKioL1Zs5ouBsw-rAABdpK6ooAI047.jpg