你还在为不会写Mysql自定义函数而纠结吗?快来看看这篇文章

需求

有一个温度表我想获取某个用户所有数据,当然我们有许多方法可以实现这个功能,比如可以使用group_concat实现以及服务器端处理 但我们这里使用函数来实现一下

数据集

数据集

函数

这里贴一下group_concat代码

SELECT name,GROUP_CONCAT(date,"温度",temperature) from test where name="张亮"

下面用函数来实现一下

CREATE DEFINER = `root`@`localhost` FUNCTION `new_group_concat`(selname varchar(20))#入参
 RETURNS varchar(100)
BEGIN
	DECLARE e1 varchar(100);#内置返回变量
	DECLARE e2 DOUBLE;#接收每次查询的体温
	DECLARE e3 DATETIME;#接收每次查询的日期
	DECLARE e4 VARCHAR(50);#拼接体温和日期	
	DECLARE count int;#查询该用户的体温记录数
	SELECT Count(1) FROM test  where test.name=selname   INTO count ;
	WHILE count>0#while循环查询体温和日期
	DO	set count=count-1;
		select temperature,date from test where test.name=selname  LIMIT count,1 INTO e2,e3;
		SET e4=CONCAT_WS("温度",CAST(e3 AS CHAR),CAST(e2 AS CHAR));
		set e1=CONCAT_WS(",",e1,e4);	
	END WHILE;
	RETURN e1;
END;

结果

两者的结果都是一样的

这是group_concat的运行结果

group_concat结果

这是自定义函数的运行结果

结果

函数写法

函数头

首先我们需要定义入参,参数如果是varchar类型必须定义长度。
其次需要定义返回类型。然后我们的函数头就写好了

CREATE DEFINER = `root`@`localhost` FUNCTION `new_group_concat`(selname varchar(20))#入参
 RETURNS varchar(100)

这里的函数头是固定的
函数体写在begin和end之间

函数体
BEGIN
	#函数体位置
END;

函数体中每句话以 “;” 结尾,注意到这些之后排好逻辑就可以成功编写一个函数了

变量声明
DECLARE e1 varchar(100);#内置变量
变量赋值

变量赋值有两种方法可以在查询语句中使用INTO进行赋值,比如这样,

SELECT Count(1) FROM test  where test.name=selname   INTO count ;

当然这个赋值必须一对一赋值假如在下面这个语句中没有limit
那么函数在运行时就会报错

select temperature,date from test where test.name=selname  LIMIT count,1 INTO e2,e3;

也可以直接使用set直接对其赋值,如

set count=count-1;
循环语句

可以使用while循环,如

WHILE count>0
	DO
		set count=count-1;
	END WHILE;

以及loop循环,这个循环条件和激素那几园中的while(1)相似,如

loop_name:LOOP
  IF 条件 THEN
    LEAVE loop_name; --离开循环
  END IF;
  SET sum=sum+i;
  SET i=i+1;
END LOOP;  -- 循环结束

最后还有repeat循环,这个类似于do while 语句

 REPEAT  -- 循环开始
   #循环体
   UNTIL 条件 END REPEAT;  -- 循环结束
判断语句

简单的IF ELSE语句需要注意的时IF的条件后要添加THEN
再继续写条件内的语句

IF 条件 THEN
    #内容
  ELSEIF 条件 THEN
	 #内容
	 ELSE
	 #内容
END IF;
条件写法

我们在写条件时与用and来表示而或用or表示如下

IF A>B and C>D OR D<B THEN--简单演示不涉及逻辑
posted @ 2020-06-12 15:03  考研小黑  阅读(6)  评论(0编辑  收藏  举报