自定義函數(shù)
自定義函數(shù)包含兩個條件:參數(shù)、返回值(必須包含返回值)
1、創(chuàng)建函數(shù)
語法:
CREATE [OR REPLACE] FUNCTION 函數(shù)名([參數(shù)類型 參數(shù)名])
RETURNS
返回值類型
函數(shù)體
函數(shù)體:函數(shù)體由合法的sql語句組成;函數(shù)體可以是簡單的select或insert語句;函數(shù)體如果為復(fù)合結(jié)構(gòu)則使用begin.....end語句;復(fù)合結(jié)構(gòu)可以包含聲明,循環(huán),控制語句。
舉例:
(1)無參函數(shù)
create function f1()
returns varchar(30)
return date_format(now(),'%Y年%m月%d日%H時%i分%s秒');
(2)帶參函數(shù)
create function f2(num1 smallint UNSIGNED, num2 smallint UNSIGNED)
returns float(10,2)
return (num1+num2)/2;
!注:UNSIGNED是將數(shù)字類型無符號化(非負(fù)數(shù))
(3)復(fù)合函數(shù)
delimiter $$
create function f3(num1 smallint UNSIGNED, num2 smallint UNSIGNED)
returns float(10,2)
begin
declare sum float default 0;
set sum = num1+num2;
return sum;
end
$$
!注:DELIMITER用來定義mysql分界符,默認(rèn)為分號;
(4)帶sql語句的復(fù)合函數(shù)
delimiter $$
create function f6(cateint(2))
returns decimal(10,2)
begin
declare total decimal default 0;
select sum(price) into total from product where category=cate;
return total;
end
$$
2、調(diào)用函數(shù)
語法:SELECT 函數(shù)名(參數(shù)名)
3、刪除函數(shù)
DROP FUNCTION 函數(shù)名
聲明變量
1、局部變量:局部變量一般用DECLARE來聲明,可以使用DEFAULT來說明默認(rèn)值(初始值)。
語法:DECLARE 變量名 變量類型 DEFAULT 初始值
2、變量賦值
(1)直接賦值
語法:SET 變量名= 值
(2)將查詢結(jié)果賦值給變量
語法:SELECT ··· INTO 變量名 FROM 表名 WHERE ···
舉例: SELECT sum(price) INTO num FROM product WHERE category=1
循環(huán)語句
1、WHILE循環(huán)語句,語法:
[標(biāo)簽:] WHILE 循環(huán)條件 DO
循環(huán)體;
END WHILE [標(biāo)簽];
2、REPEAT循環(huán)語句,語法:
[repeat_name:] REPEAT
循環(huán)體;
UNTIL 循環(huán)條件#若成立則跳出循環(huán)
END REPEAT [repeat_name];
3、LOOP循環(huán)語句,語法:
[loop_name:] LOOP
循環(huán)體;#利用控制流語句,如if語句控制結(jié)束條件(結(jié)束語句leave loop_name;)
END LOOP;
控制語句
1、IF控制流語句,語法:
IF 條件1 THEN 動作1;
ELSEIF 條件2 THEN 動作2;
···
ELSE 動作n;
END IF;
2、CASE控制流語句,語法:
CASE 變量
WHEN 值1 THEN 動作1;
WHEN 值2 THEN 動作2;
···
ELSE 動作n;
END CASE;
循環(huán)控制的函數(shù)案例
delimiter $$
create function f5()
returns int(5)
begin
declare total int default 0;
declare num int default 1;
num : loop
If num<=50 then
set total = total + num;
set num = num+1;
else leave num;
end if;
end loop;
return total;
end
$$