需求
有一个温度表我想获取某个用户所有数据,当然我们有许多方法可以实现这个功能,比如可以使用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的运行结果
这是自定义函数的运行结果
函数写法
函数头
首先我们需要定义入参,参数如果是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--简单演示不涉及逻辑