mysql 函数和流程控制详解

啥是函数

函数,??既然能定义存储过程为啥还要搞个函数出来呢?其实呢,函数是用在sql语句中的,而存储过程是执行sql语句的。两者要区分的

内置函数
  1. 数学函数
函数说明
ROUND(x,y)返回参数x的四舍五入的有y位小数的值
RAND()返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。
  1. 聚合函数
函数说明
AVG(col)返回指定列平均值
COUNT(col)返回指定列中非Null值的个数
MIN(col)返回指定列最小值
MAX(col)返回指定列最大值
SUM(col)返回指定列的所有值之和
GROUP_CONCAT(col)返回由属于一组的列值组合而成的结果
  1. 字符串函数
函数说明
CHAR_LENGTH(str)返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
CONCAT(str1,str2,…)字符串拼接 如有任何一个参数为NULL ,则返回值为 NULL。
CONCAT_WS(separator,str1,str2,…)字符串拼接(自定义连接符) CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
CONV(N,from_base,to_base)进制转换例如:SELECT CONV(‘a’,16,2); 表示将 a 由16进制转换为2进制字符串表示
FORMAT(X,D)将数字X 的格式写为’#,###,###.##’,以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若 D 为 0, 则返回结果不带有小数点,或不含小数部分。例如:SELECT FORMAT(12332.1,4); 结果为: ‘12,332.1000’
INSERT(str,pos,len,newstr)在str的指定位置插入字符串pos:要替换位置其实位置len:替换的长度newstr:新字符串,特别的:如果pos超过原字符串长度,则返回原字符串。如果len超过原字符串长度,则由新字符串完全替换
INSTR(str,substr)返回字符串 str 中子字符串的第一个出现位置。
LEFT(str,len)返回字符串str 从开始的len位置的子序列字符。
LOWER(str)变小写
UPPER(str)变大写
REVERSE(str)返回字符串 str ,顺序和字符顺序相反。
SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。
  1. 日期时间函数
函数说明
CURDATE()或CURRENT_DATE() 返回当前的日期
CURTIME()或CURRENT_TIME() 返回当前的时间
DAYOFWEEK(date)返回date所代表的一星期中的第几天(1~7)
DAYOFMONTH(date)返回date是一个月的第几天(1~31)
DAYOFYEAR(date)返回date是一年的第几天(1~366)
DAYNAME(date)返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
FROM_UNIXTIME(ts,fmt)根据指定的fmt格式,格式化UNIX时间戳ts
HOUR(time)返回time的小时值(0~23)
MINUTE(time)返回time的分钟值(0~59)
MONTH(date)返回date的月份值(1~12)
MONTHNAME(date)返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);
NOW()返回当前的日期和时间
QUARTER(date)返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
WEEK(date)返回日期date为一年中第几周(0~53)
YEAR(date)返回日期date的年份(1000~9999)
DATE_FORMAT(date,format)根据format字符串格式化date值

重点学习:DATE_FORMAT

mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y');
-> 'Sunday October 2009'
mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00',
->                 '%D %y %a %d %m %b %j');
-> '4th 00 Thu 04 10 Oct 277'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
->                 '%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
-> '1998 52'
mysql> SELECT DATE_FORMAT('2006-06-00', '%d');
-> '00'
  1. 加密函数
函数说明
MD5()计算字符串str的MD5校验和
PASSWORD(str)返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。
  1. 控制流函数
函数说明
CASE WHEN[test1] THEN [result1]…ELSE [default] END如果testN是真,则返回resultN,否则返回default
CASE [test] WHEN[val1] THEN [result]…ELSE [default]END如果test和valN相等,则返回resultN,否则返回default
IF(test,t,f)如果test是真,返回t;否则返回f
IFNULL(arg1,arg2)如果arg1不是空,返回arg1,否则返回arg2
NULLIF(arg1,arg2)如果arg1=arg2返回NULL;否则返回arg1
自定义函数
创建函数
delimiter //
create function sum2(
    a int,
    b int)
returns int
begin
    declare num int;
    set num = a + b;
    return(num)
end //
delimiter ;
delimiter //
create function fun(i int)
returns int
begin
    declare res int default 0;
    if i = 10 then
        set res = 10;
    elseif i = 20 then
        set res = 200;
    elseif i = 30 then
        set res = 300;
    else
        set res = 400;
    end if;
    return res;
end //
delimiter ;
删除函数
drop function fun_name;
执行函数
# 获取返回值
select UPPER('egon') into @res;
select @res;
# 在查询中使用
select fun(11),name from tb2;
注意

函数数不能写sql语句,否则报错,函数仅仅是一个功能,要在sql中用到的功能
如果想要写sql,请使用存储过程

流程控制
条件语句
-- if 语句
delimiter //
create procedure pro_if()
begin
  declare i int default 0;
  if i = 1 then
    select 1;
  elseif i = 2 then
    select 2;
  else
    select 7;
  end if;
end //
delimiter ;

执行结果

mysql> call pro_if();
+---+
| 7 |
+---+
| 7 |
+---+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
循环语句
  1. while 循环
delimiter //
create procedure pro_while()
begin
  declare num int;
  set num = 0;
  while num < 3 do
    select
      num;
    set num = num + 1;
  end while ;
end //
delimiter ;

执行结果

mysql> call pro_while();
+------+
| num  |
+------+
|    0 |
+------+
1 row in set (0.00 sec)
+------+
| num  |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
+------+
| num  |
+------+
|    2 |
+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
  1. repeat 循环
delimiter //
create procedure pro_repeat()
begin
  declare i int;
  set i = 0;
  repeat
    select i;
    set i = i + 1;
    until i >= 5
  end repeat;
end //
delimiter ;

执行结果

mysql> call pro_repeat();
+------+
| i    |
+------+
|    0 |
+------+
1 row in set (0.00 sec)
+------+
| i    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
+------+
| i    |
+------+
|    2 |
+------+
1 row in set (0.00 sec)
+------+
| i    |
+------+
|    3 |
+------+
1 row in set (0.00 sec)
+------+
| i    |
+------+
|    4 |
+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
  1. loop 循环
-- 100 内数字的和
delimiter //
create procedure sum2(a int)
begin
  declare sum int default 0;
  declare i int default 1;
  loop_name: loop # 循环开始
    if i > a then
      leave loop_name; # 条件成立则结束  leave 类型break
    end if;
    set sum = sum + i;
    set i = i + 1;
  end loop; # 循环结束
  select sum; # 返回结果
end //
delimiter ;

执行结果

mysql> call sum2(100);
+------+
| sum  |
+------+
| 5050 |
+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值