啥是函数
函数,??既然能定义存储过程为啥还要搞个函数出来呢?其实呢,函数是用在sql语句中的,而存储过程是执行sql语句的。两者要区分的
内置函数
- 数学函数
函数 | 说明 |
---|---|
ROUND(x,y) | 返回参数x的四舍五入的有y位小数的值 |
RAND() | 返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。 |
- 聚合函数
函数 | 说明 |
---|---|
AVG(col) | 返回指定列平均值 |
COUNT(col) | 返回指定列中非Null值的个数 |
MIN(col) | 返回指定列最小值 |
MAX(col) | 返回指定列最大值 |
SUM(col) | 返回指定列的所有值之和 |
GROUP_CONCAT(col) | 返回由属于一组的列值组合而成的结果 |
- 字符串函数
函数 | 说明 |
---|---|
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 使用一个负值。 |
- 日期时间函数
函数 | 说明 |
---|---|
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'
- 加密函数
函数 | 说明 |
---|---|
MD5() | 计算字符串str的MD5校验和 |
PASSWORD(str) | 返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。 |
- 控制流函数
函数 | 说明 |
---|---|
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)
循环语句
- 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)
- 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)
- 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)