需求
有一個溫度表我想獲取某個用戶所有數據,當然我們有許多方法可以實現這個功能,比如可以使用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--簡單演示不涉及邏輯