加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL学习笔记—自定义函数

发布时间:2022-09-13 16:10:34 所属栏目:MySql教程 来源:
导读:  MySQL学习笔记—自定义函数 注释语法:

  MySQL服务器支持3种注释风格:

  下面的例子显示了3种风格的注释:

  mysql> SELECT 1+1; # This comment continues to the end of line
 
  MySQL学习笔记—自定义函数 注释语法:
 
  MySQL服务器支持3种注释风格:
 
  下面的例子显示了3种风格的注释:
 
  mysql> SELECT 1+1;     # This comment continues to the end of line
  mysql> SELECT 1+1;     -- This comment continues to the end of line
  mysql> SELECT 1 /* this is an in-line comment */ + 1;
  mysql> SELECT 1+
  /*
  this is a
  multiple-line comment
  */
  1;
  自定义用户变量:
 
  SET @var_name = expr [, @var_name = expr] ...
  对于SET,可以使用=或:=作为分配符。分配给每个变量的expr可以为整数、实数、字符串或者NULL值。
 
  也可以用语句select代替SET来为用户变量分配一个值。在这种情况下,分配符必须为:=而不能用=,因为在非SET语句中=被视为一个比较 操作符:
 
  mysql> SET @t1=0, @t2=0, @t3=0;
  mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
  自定义函数基本方式
 
  函数可以返回任意类型的值,同样可以接受这些类型的参数;
 
  函数的参数与返回值之间,没有必然的联系。
 
  2.创建自定义函数
 
  CREATE FUNCTION function_name ([func_parameter[,…]])
 
  RETURNS {STRING|INTEGER|REAL|DECIMAL|…}
 
  routine_body - 函数体
 
  默认地,子程序与当前数据库关联。要明确地把子程序与一个给定数据库关联起来,可以在创建子程序的时候指定其名字为db_name.function_name。
 
  如果子程序名和内建的SQL函数名一样,定义子程序时,你需要在这个名字和随后括号中间插入一个空格,否则发生语法错误。当你随后调用子程序的时候也要插入。
 
  RETURNS字句只能对FUNCTION做指定,对函数而言这是强制的。它用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句
 
  3.关于函数体
 
  例子
 
  CREATE FUNCTION myTime()
  RETURNS VARCHAR(30)
  RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点%i分%s秒');
  CREATE FUNCTION avg(num1 SMALLINT UNSIGNED ,num2 SMALLINT UNSIGNED)
  RETURNS FLOAT(3,2)
  RETURN (num1+num2)/2;
  BEGIN … END复合语句
 
  BEGIN … END复合语句格式:
 
  [begin_label:] BEGIN
      [statement_list]
  END [end_label]
  存储子程序可以使用BEGIN … END复合语句来包含多个语句。statement_list 代表一个或多个语句的列表。statement_list之内每个语句都必须用分号(;)来结尾。
 
  复合语句可以被标记。除非begin_label存在,否则end_label不能被给出,并且如果二者都存在,他们必须是同样的。
 
  使用多重语句需要客户端能发送包含语句定界符;的查询字符串。这个符号在命令行客户端被用delimiter命令来处理。改变查询结尾定界符 “ ;” (比如改变为“//”)使得; 可被用在子程序体中。
 
  例如在mysql中执行以下命令:
 
  delimiter //
  则以后命令结尾的符号就变成 “ // ”而不是“ ;”
 
  以下例子创建了一个函数,用于向tb1表中插入数据(数据包括username,age),并返回age最大的那一条数据:
 
  delimiter //
  create function addUser(username varchar(20),age tinyint(3) unsigned)
  returns tinyint(3) unsigned
  begin
  insert tb1(username,age) values(username,age);
  return (select max(age) from tb1);
  end //
  delimiter ;
  select addUser('chenjs',20);
 
  drop function function_name;
  此处只需写上函数名即可,函数的参数可以不用写出来。
 
  例如删除上面创建的函数 addUser(username varchar(20),age tinyint(3) unsigned),可以直接用以下语句删除:
 
  drop function addUser;
  流控制构造 IF语句
 
  IF search_condition THEN statement_list
      [ELSEIF search_condition THEN statement_list] ...
      [ELSE statement_list]
  END IF
  IF实现了一个基本的条件构造。如果search_condition求值为真,相应的SQL语句列表被执行。如果没有search_condition匹配,在ELSE子句里的语句列表被执行。statement_list可以包括一个或多个语句。
 
  请注意,也有一个IF() 函数,它不同于这里描述的IF语句:
 
  IF(expr1,expr2,expr3)
 
  如果 expr1 是TRUE (expr1 不等于 0 且 expr1 不等于 NULL)mysql自定义函数教程,则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。
 
  例如:
 
  返回2,并将2赋给变量@m。
 
  CASE语句
 
  CASE语句
 
  CASE case_value
      WHEN when_value THEN statement_list
      [WHEN when_value THEN statement_list] ...
      [ELSE statement_list]
  END CASE
  或:
 
  CASE
      WHEN search_condition THEN statement_list
      [WHEN search_condition THEN statement_list] ...
      [ELSE statement_list]
  END CASE
  存储程序的CASE语句实现一个复杂的条件构造。如果search_condition 求值为真,相应的SQL被执行。如果没有搜索条件匹配,在ELSE子句里的语句被执行。
 
  create function caseTest(str varchar(5),num int)
  returns int
  begin
  case str
  when 'power' then set @result=power(num,2);
  when 'ceil' then set @result=ceil(num);
  when 'floor' then set @result=floor(num);
  when 'round' then set @result=round(num);
  else set @result=0;
  end case;
  return (select @result);
  end //
 
  LOOP语句
 
  LOOP语句格式
 
  [begin_label:] LOOP
      statement_list
  END LOOP [end_label]
  LOOP允许某特定语句或语句群的重复执行,实现一个简单的循环构造。在循环内的语句一直重复直到循环被退出,退出通常伴随着一个LEAVE 语句。
 
  LOOP语句可以被标注。除非begin_label存在,否则end_label不能被给出,并且如果两者都出现,它们必须是同样的。
 
  LEAVE label
  这个语句被用来退出任何被标注的流程控制构造。它和BEGIN … END或循环一起被使用。
 
  ITERATE label
  mysql floor函数作用_mysql自定义函数教程_mysql拼接字符串函数
 
  ITERATE只可以出现在LOOP, REPEAT, 和WHILE语句内。ITERATE意思为:“再次循环。”
 
  例如,其创建方式使用的是create procedure而不是create function,这是因为procedure不需要returns 与return字段,而function必须有returns与return字段:
 
  CREATE PROCEDURE doiterate(p1 INT)
  BEGIN
    label1: LOOP
      SET p1 = p1 + 1;
      IF p1 < 10 THEN ITERATE label1;
      END IF;
      LEAVE label1;
    END LOOP label1;
    SET @x = p1;
  END
  REPEAT语句
 
  REPEAT语句格式
 
  [begin_label:] REPEAT
      statement_list
  UNTIL search_condition
  END REPEAT [end_label]
  REPEAT语句内的语句或语句群被重复,直至search_condition 为真。
 
  REPEAT 语句可以被标注。 除非begin_label也存在mysql自定义函数教程,end_label才能被用,如果两者都存在,它们必须是一样的。
 
  使用repeat来实现上面的程序,程序如下:
 
  create function doRepeat(p1 int)
  returns int
  begin
   repeat set p1 = p1 + 1;
   until p1>10
   end repeat;
  return p1;
  end
  测试截图:
 
  这里写图片描述
 
  WHILE语句
 
  WHILE语句格式
 
  [begin_label:] WHILE search_condition DO
      statement_list
  END WHILE [end_label]
  WHILE语句内的语句或语句群被重复,直至search_condition 为真。
 
  WHILE语句可以被标注。 除非begin_label也存在,end_label才能被用,如果两者都存在,它们必须是一样的。
 
  例子:
 
  CREATE PROCEDURE dowhile()
  BEGIN
    DECLARE v1 INT DEFAULT 5;
    WHILE v1 > 0 DO
      SET v1 = v1 - 1;
    END WHILE;
  END
  CREATE function dowhile()
  RETURNS int
  BEGIN
    DECLARE v1 INT DEFAULT 5;
    WHILE v1 > 0 DO
      SET v1 = v1 - 1;
    END WHILE;
  RETURN v1;
  END
 
 

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!