MySQL-常用函数
更新时间 2021-10-30 15:17:05    浏览 0   

TIP

本文主要是介绍 Mysql-常用函数 。

# 概要

MySQL数据库中提供了很丰富的函数。MySQL函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数、格式化函数等。通过这些函数,可以简化用户的操作。例如,字符串连接函数可以很方便的将多个字符串连接在一起。在这一讲中将讲解的内容包括:

  • 数学函数
  • 字符串函数
  • 日期和时间函数
  • 条件判断函数
  • 系统信息函数
  • 加密函数
  • 格式化函数

MySQL提供了众多功能强大、方便易用的函数,使用这些函数,可以极大地提高用户对于数据库的管理效率,从而更加灵活地满足不同用户的需求。本文将MySQL的函数分类并汇总,以便以后用到的时候可以随时查看。

# 数学函数

# (1)ABS(x)

返回x的绝对值

# (2)PI()

返回圆周率π,默认显示6位小数

# (3)SQRT(x)

返回非负数的x的二次方根

# (4)MOD(x,y)

返回x被y除后的余数

# (5)CEIL(x)、CEILING(x)

返回不小于x的最小整数

# (6)FLOOR(x)

返回不大于x的最大整数

# (7)ROUND(x)、ROUND(x,y) 精度计算

前者返回最接近于x的整数,即对x进行四舍五入;后者返回最接近x的数,其值保留到小数点后面y位,若y为负值,则将保留到x到小数点左边y位

# (8)SIGN(x)

返回参数x的符号,-1表示负数,0表示0,1表示正数

# (9)POW(x,y)和、POWER(x,y)

返回x的y次乘方的值

# (10)EXP(x)

返回e的x乘方后的值

# (11)LOG(x)

返回x的自然对数,x相对于基数e的对数

# (12)LOG10(x)

返回x的基数为10的对数

# (13)RADIANS(x)

返回x由角度转化为弧度的值

# (14)DEGREES(x)

返回x由弧度转化为角度的值

# (15)SIN(x)、ASIN(x)

前者返回x的正弦,其中x为给定的弧度值;后者返回x的反正弦值,x为正弦

# (16)COS(x)、ACOS(x)

前者返回x的余弦,其中x为给定的弧度值;后者返回x的反余弦值,x为余弦

# (17)TAN(x)、ATAN(x)

前者返回x的正切,其中x为给定的弧度值;后者返回x的反正切值,x为正切

# (18)COT(x)

返回给定弧度值x的余切

# 字符串函数

# (1)CHAR_LENGTH(str)

计算字符串字符个数

# (2)CONCAT(s1,s2,...)

返回连接参数产生的字符串,一个或多个待拼接的内容,任意一个为NULL则返回值为NULL

# (3)CONCAT_WS(x,s1,s2,...)

返回多个字符串拼接之后的字符串,每个字符串之间有一个x

# (4)INSERT(s1,x,len,s2)

返回字符串s1,其子字符串起始于位置x,被字符串s2取代len个字符

# (5)LOWER(str)和LCASE(str)、UPPER(str)和UCASE(str)

前两者将str中的字母全部转换成小写,后两者将字符串中的字母全部转换成大写

# (6)LEFT(s,n)、RIGHT(s,n)

前者返回字符串s从最左边开始的n个字符,后者返回字符串s从最右边开始的n个字符

# (7)LPAD(s1,len,s2)、RPAD(s1,len,s2)

前者返回s1,其左边由字符串s2填补到len字符长度,假如s1的长度大于len,则返回值被缩短至len字符;前者返回s1,其右边由字符串s2填补到len字符长度,假如s1的长度大于len,则返回值被缩短至len字符

# (8)LTRIM(s)、RTRIM(s)

前者返回字符串s,其左边所有空格被删除;后者返回字符串s,其右边所有空格被删除

# (9)TRIM(s)

返回字符串s删除了两边空格之后的字符串

# (10)TRIM(s1 FROM s)

删除字符串s两端所有子字符串s1,未指定s1的情况下则默认删除空格

# (11)REPEAT(s,n)

返回一个由重复字符串s组成的字符串,字符串s的数目等于n

# (12)SPACE(n)

返回一个由n个空格组成的字符串

# (13)REPLACE(s,s1,s2)

返回一个字符串,用字符串s2替代字符串s中所有的字符串s1

# (14)STRCMP(s1,s2)

若s1和s2中所有的字符串都相同,则返回0;根据当前分类次序,第一个参数小于第二个则返回-1,其他情况返回1

# (15)SUBSTRING(s,n,len)、MID(s,n,len)

两个函数作用相同,从字符串s中返回一个第n个字符开始、长度为len的字符串

# (16)LOCATE(str1,str)、POSITION(str1 IN str)、INSTR(str,str1)

三个函数作用相同,返回子字符串str1在字符串str中的开始位置(从第几个字符开始)

# (17)REVERSE(s)

将字符串s反转

# (18)ELT(N,str1,str2,str3,str4,...)

返回第N个字符串

# 日期和时间函数

# (1)CURDATE()、CURRENT_DATE()

将当前日期按照"YYYY-MM-DD"或者"YYYYMMDD"格式的值返回,具体格式根据函数用在字符串或是数字语境中而定

# (2)CURRENT_TIMESTAMP()、LOCALTIME()、NOW()、SYSDATE()

这四个函数作用相同,返回当前日期和时间值,格式为"YYYY_MM-DD HH:MM:SS"或"YYYYMMDDHHMMSS",具体格式根据函数用在字符串或数字语境中而定

# (3)UNIX_TIMESTAMP()、UNIX_TIMESTAMP(date)

前者返回一个格林尼治标准时间1970-01-01 00:00:00到现在的秒数,后者返回一个格林尼治标准时间1970-01-01 00:00:00到指定时间的秒数

# (4)FROM_UNIXTIME(date)

和UNIX_TIMESTAMP互为反函数,把UNIX时间戳转换为普通格式的时间

# (5)UTC_DATE()和UTC_TIME()

前者返回当前UTC(世界标准时间)日期值,其格式为"YYYY-MM-DD"或"YYYYMMDD",后者返回当前UTC时间值,其格式为"YYYY-MM-DD"或"YYYYMMDD"。具体使用哪种取决于函数用在字符串还是数字语境中

# (6)MONTH(date)和MONTHNAME(date)

前者返回指定日期中的月份,后者返回指定日期中的月份的名称

# (7)DAYNAME(d)、DAYOFWEEK(d)、WEEKDAY(d)

DAYNAME(d)返回d对应的工作日的英文名称,如Sunday、Monday等;DAYOFWEEK(d)返回的对应一周中的索引,1表示周日、2表示周一;WEEKDAY(d)表示d对应的工作日索引,0表示周一,1表示周二

# (8)WEEK(d)、WEEKOFYEAD(d)

前者计算日期d是一年中的第几周,后者计算某一天位于一年中的第几周

# (9)DAYOFYEAR(d)、DAYOFMONTH(d)

前者返回d是一年中的第几天,后者返回d是一月中的第几天

# (10)YEAR(date)、QUARTER(date)、MINUTE(time)、SECOND(time)

YEAR(date)返回指定日期对应的年份,范围是1970~2069;QUARTER(date)返回date对应一年中的季度,范围是1~4;MINUTE(time)返回time对应的分钟数,范围是0~59;SECOND(time)返回制定时间的秒值

# (11)EXTRACE(type FROM date)

从日期中提取一部分,type可以是YEAR、YEAR_MONTH、DAY_HOUR、DAY_MICROSECOND、DAY_MINUTE、DAY_SECOND

# (12)TIME_TO_SEC(time)

返回以转换为秒的time参数,转换公式为"3600小时 + 60分钟 + 秒"

# (13)SEC_TO_TIME()

和TIME_TO_SEC(time)互为反函数,将秒值转换为时间格式

# (14)DATE_ADD(date,INTERVAL expr type)、ADD_DATE(date,INTERVAL expr type)

返回将起始时间加上expr type之后的时间,比如DATE_ADD('2010-12-31 23:59:59', INTERVAL 1 SECOND)表示的就是把第一个时间加1秒

# (15)DATE_SUB(date,INTERVAL expr type)、SUBDATE(date,INTERVAL expr type)

返回将起始时间减去expr type之后的时间

# (16)ADDTIME(date,expr)、SUBTIME(date,expr)

前者进行date的时间加操作,后者进行date的时间减操作

# 条件判断函数

# (1)IF(expr,v1,v2)

如果expr是TRUE则返回v1,否则返回v2

# (2)IFNULL(v1,v2)

如果v1不为NULL,则返回v1,否则返回v2

# (3)CASE expr WHEN v1 THEN r1 [WHEN v2 THEN v2] [ELSE rn] END

如果expr等于某个vn,则返回对应位置THEN后面的结果,如果与所有值都不想等,则返回ELSE后面的rn

# 系统信息函数

# (1)VERSION()

查看MySQL版本号

# (2)CONNECTION_ID()

查看当前用户的连接数

# (3)USER()、CURRENT_USER()、SYSTEM_USER()、SESSION_USER()

查看当前被MySQL服务器验证的用户名和主机的组合,一般这几个函数的返回值是相同的

# (4)CHARSET(str)

查看字符串str使用的字符集

# (5)COLLATION()

查看字符串排列方式

加密函数

# (1)PASSWORD(str)

从原明文密码str计算并返回加密后的字符串密码,注意这个函数的加密是单向的(不可逆),因此不应将它应用在个人的应用程序中而应该只在MySQL服务器的鉴定系统中使用

# (2)MD5(str)

为字符串算出一个MD5 128比特校验和,改值以32位十六进制数字的二进制字符串形式返回

# (3)ENCODE(str, pswd_str)

使用pswd_str作为密码,加密str

# (4)DECODE(crypt_str,pswd_str)

使用pswd_str作为密码,解密加密字符串crypt_str,crypt_str是由ENCODE函数返回的字符串

其他函数

# (1)FORMAT(x,n) 精度计算四舍五入

将数字x格式化,并以四舍五入的方式保留小数点后n位,结果以字符串形式返回

# (2)CONV(N,from_base,to_base)

不同进制数之间的转换,返回值为数值N的字符串表示,由from_base进制转换为to_base进制

# (3)INET_ATON(expr)

给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数,地址可以使4或8比特

# (4)INET_NTOA(expr)

给定一个数字网络地址(4或8比特),返回作为字符串的该地址的点地址表示

# (5)BENCHMARK(count,expr)

重复执行count次表达式expr,它可以用于计算MySQL处理表达式的速度,结果值通常是0(0只是表示很快,并不是没有速度)。另一个作用是用它在MySQL客户端内部报告语句执行的时间

# (6)CONVERT(str USING charset)

使用字符集charset表示字符串str

# 【----------------------------】

# MySQL:if语句、if...else语句、case语句,使用方法解析!

if语句做为表达式使用,语法格式如下:

IF(expr1,expr2,expr3)

说明

如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。

例子

select *,if(age=1,"男","女") as ages from user;

当然如果作为表达式的话,if也可以用CASE when来实现的:

/* 下面这个将输出:男 */
SELECT 
    CASE 1 
        WHEN 1 THEN '男'
        WHEN 2 THEN '女' 
        ELSE '未知' 
    END
as ages
 
 
 
 
/* 下面这个将输出:女 */
SELECT 
    CASE 2 
        WHEN 1 THEN '男'
        WHEN 2 THEN '女' 
        ELSE '未知' 
    END
as ages
 
 
 
 
/* 下面这个将输出:未知 */
SELECT 
    CASE 3 
        WHEN 1 THEN '男'
        WHEN 2 THEN '女' 
        ELSE '未知' 
    END
as ages
 
 
 
 
/*   当然还有一种写法  输出:未知 */
SELECT 
    CASE  
        WHEN 3=1 THEN '男'
        WHEN 3=2 THEN '女' 
        ELSE '未知' 
    END
as ages
 
 
SELECT 
    CASE 
        WHEN 3=1 THEN '男'
        WHEN 3=2 THEN '女' 
    WHEN (3=4 || 3!=null) THEN '测试'
        ELSE '未知' 
    END
as ages

从上面的例子我们可以看出得很明白了,case后面的值=when后台的值,然后就会输出when后面跟的then后的值。如果都不等行的话,就输出else后的值。

IF...ELSE...做为流程控制语句使用,语法格式如下:

IF search_condition THEN 
    statement_list  
[ELSEIF search_condition THEN]  
    statement_list ...  
[ELSE 
    statement_list]  
END IF

说明

与PHP中的IF语句类似

当IF中条件search_condition成立时,执行THEN后的statement_list语句、

否则判断ELSEIF中的条件成立时,执行其后的statement_list语句、

否则继续判断其他分支。

当所有分支的条件均不成立时,执行ELSE分支。

search_condition是一个条件表达式,可以由“=、<、<=、>、>=、!=”等条件运算符组成,并且可以使用AND、OR、NOT对多个表达式进行组合。

例子

建立一个存储过程,该存储过程通过学生学号(student_no)和课程编号(course_no)查询其成绩(grade),

返回成绩和成绩的等级,成绩大于90分的为A级,小于90分大于等于80分的为B级,小于80分大于等于70分的为C级,依次到E级

create procedure dbname.proc_getGrade  
(stu_no varchar(20),cour_no varchar(10))  
BEGIN 
declare stu_grade float;  
select grade into stu_grade from grade where student_no=stu_no and course_no=cour_no;  
if stu_grade>=90 then 
    select stu_grade,'A';  
elseif stu_grade<90 and stu_grade>=80 then 
    select stu_grade,'B';  
elseif stu_grade<80 and stu_grade>=70 then 
    select stu_grade,'C';  
elseif stu_grade70 and stu_grade>=60 then 
    select stu_grade,'D';  
else 
    select stu_grade,'E';  
end if;  
END

注意:IF作为一条语句,在END IF后需要加上分号“;”以表示语句结束,其他语句如CASE、LOOP等也是相同的。

# 【----------------------------】

# MySQL:日期函数、时间函数总结

# MySQL 获得当前日期时间 函数

# 获得当前日期+时间(date + time)函数:now()

mysql> select now();

+---------------------+
| now() |
+---------------------+
| 2008-08-08 22:20:46 |
+---------------------+

# 获得当前日期+时间(date + time)函数:sysdate()

sysdate() 日期时间函数跟 now() 类似,不同之处在于:now() 在执行开始时值就得到了, sysdate() 在函数执行时动态得到值。看下面的例子就明白了:

mysql> select now(), sleep(3), now();

+---------------------+----------+---------------------+
| now() | sleep(3) | now() |
+---------------------+----------+---------------------+
| 2008-08-08 22:28:21 | 0 | 2008-08-08 22:28:21 |
+---------------------+----------+---------------------+

sysdate() 日期时间函数,一般情况下很少用到。

# MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()

mysql> select current_timestamp, current_timestamp();

+---------------------+---------------------+
| current_timestamp | current_timestamp() |
+---------------------+---------------------+
| 2008-08-09 23:22:24 | 2008-08-09 23:22:24 |
+---------------------+---------------------+

# MySQL 日期转换函数、时间转换函数 date_format

# MySQL Date/Time to Str(日期/时间转换为字符串)

函数:date_format(date,format), time_format(time,format)


mysql> select date_format('2008-08-08 22:23:01', '%Y-%m-%d %H:%i:%S');

mysql> select date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s');

+----------------------------------------------------+
| date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s') |
+----------------------------------------------------+
| 20080808222301 |
+----------------------------------------------------+

# MySQL 日期、时间转换函数:date_format(date,format), time_format(time,format)

能够把一个日期/时间转换成各种各样的字符串格式。它是 str_to_date(str,format) 函数的 一个逆转换。

MySQL Str to Date (字符串转换为日期)函数:str_to_date(str, format)

select str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09
select str_to_date('08/09/08' , '%m/%d/%y'); -- 2008-08-09
select str_to_date('08.09.2008', '%m.%d.%Y'); -- 2008-08-09
select str_to_date('08:09:30', '%h:%i:%s'); -- 08:09:30
select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30

可以看到,str_to_date(str,format) 转换函数,可以把一些杂乱无章的字符串转换为日期格式。另外,它也可以转换为时间。“format” 可以参看 MySQL 手册。

# MySQL (日期、天数)转换函数:to_days(date), from_days(days)

select to_days('0000-00-00'); -- 0
select to_days('2008-08-08'); -- 733627

# MySQL (时间、秒)转换函数:time_to_sec(time), sec_to_time(seconds)

select time_to_sec('01:00:05'); -- 3605
select sec_to_time(3605); -- '01:00:05'

# MySQL 拼凑日期、时间函数:makdedate(year,dayofyear), maketime(hour,minute,second)

select makedate(2001,31); -- '2001-01-31'
select makedate(2001,32); -- '2001-02-01'
select maketime(12,15,30); -- '12:15:30'

# MySQL (Unix 时间戳、日期)转换函数

unix_timestamp(),
unix_timestamp(date),
from_unixtime(unix_timestamp),
from_unixtime(unix_timestamp,format)

下面是示例:

select unix_timestamp(); -- 1218290027
select unix_timestamp('2008-08-08'); -- 1218124800
select unix_timestamp('2008-08-08 12:30:00'); -- 1218169800

select from_unixtime(1218290027); -- '2008-08-09 21:53:47'
select from_unixtime(1218124800); -- '2008-08-08 00:00:00'
select from_unixtime(1218169800); -- '2008-08-08 12:30:00'

select from_unixtime(1218169800, '%Y %D %M %h:%i:%s %x'); -- '2008 8th August 12:30:00 2008'

# MySQL 日期时间计算函数

# MySQL 为日期增加一个时间间隔:date_add()

set @dt = now();

select date_add(@dt, interval 1 day); -- add 1 day
select date_add(@dt, interval 1 hour); -- add 1 hour
select date_add(@dt, interval 1 minute); -- ...
select date_add(@dt, interval 1 second);
select date_add(@dt, interval 1 microsecond);
select date_add(@dt, interval 1 week);
select date_add(@dt, interval 1 month);
select date_add(@dt, interval 1 quarter);
select date_add(@dt, interval 1 year);

select date_add(@dt, interval -1 day); -- sub 1 day

# MySQL adddate(), addtime()函数,

可以用 date_add() 来替代。下面是 date_add() 实现 addtime() 功能示例:

mysql> set @dt = '2008-08-09 12:12:33';

mysql>
mysql> select date_add(@dt, interval '01:15:30' hour_second);

+------------------------------------------------+
| date_add(@dt, interval '01:15:30' hour_second) |
+------------------------------------------------+
| 2008-08-09 13:28:03 |
+------------------------------------------------+

mysql> select date_add(@dt, interval '1 01:15:30' day_second);

+-------------------------------------------------+
| date_add(@dt, interval '1 01:15:30' day_second) |
+-------------------------------------------------+
| 2008-08-10 13:28:03 |
+-------------------------------------------------+

# MySQL 为日期减去一个时间间隔:date_sub()

mysql> select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);

+----------------------------------------------------------------+
| date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) |
+----------------------------------------------------------------+
| 1997-12-30 22:58:59 |
+----------------------------------------------------------------+

MySQL date_sub() 日期时间函数 和 date_add() 用法一致,不再赘述。

# MySQL 日期、时间相减函数:datediff(date1,date2), timediff(time1,time2)

MySQL datediff(date1,date2):两个日期相减 date1 - date2,返回天数。
select datediff('2008-08-08', '2008-08-01'); -- 7
select datediff('2008-08-01', '2008-08-08'); -- -7

MySQL timediff(time1,time2):两个日期相减 time1 - time2,返回 time 差值。

select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08
select timediff('08:08:08', '00:00:00'); -- 08:08:08

注意:timediff(time1,time2) 函数的两个参数类型必须相同。

# MySQL 时间戳(timestamp)转换、增、减函数:

timestamp(date) -- date to timestamp
timestamp(dt,time) -- dt + time
timestampadd(unit,interval,datetime_expr) --
timestampdiff(unit,datetime_expr1,datetime_expr2) --

请看示例部分:

select timestamp('2008-08-08'); -- 2008-08-08 00:00:00
select timestamp('2008-08-08 08:00:00', '01:01:01'); -- 2008-08-08 09:01:01
select timestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01

select timestampadd(day, 1, '2008-08-08 08:00:00'); -- 2008-08-09 08:00:00
select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00

MySQL timestampadd() 函数类似于 date_add()select timestampdiff(year,'2002-05-01','2001-01-01'); -- -1
select timestampdiff(day ,'2002-05-01','2001-01-01'); -- -485
select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00'); -- -12

select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00'); -- 7

MySQL timestampdiff() 函数就比 datediff() 功能强多了,datediff() 只能计算两个日期(date)之间相差的天数。

# MySQL 时区(timezone)转换函数

convert_tz(dt,from_tz,to_tz)

select convert_tz('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00

时区转换也可以通过 date_add, date_sub, timestampadd 来实现。

select date_add('2008-08-08 12:00:00', interval -8 hour); -- 2008-08-08 04:00:00
select date_sub('2008-08-08 12:00:00', interval 8 hour); -- 2008-08-08 04:00:00
select timestampadd(hour, -8, '2008-08-08 12:00:00'); -- 2008-08-08 04:00:00 

# 【----------------------------】

# MySQL 数据类型转换

Mysql中提供了两个内置函数提供我们使用分别为:CAST和CONVERT,Mysql 的CAST()和CONVERT() 函数可用来转换或者获取一个我们需要的类型。两者具体的语法如下:

# (1) cast(value as type);

# (2) convert(value,type);

# 语法

说明 value 为要转换原数据类型的值,type目的类型.但可以转换的类型是有限制的。类型可以是以下任何一个:

  • 二进制,同带binary前缀的效果 : BINARY
  • 字符型,可带参数 : CHAR()
  • 日期 : DATE
  • 时间: TIME
  • 日期时间型 : DATETIME
  • 浮点数 : DECIMAL
  • 整数 : SIGNED
  • 无符号整数 : UNSIGNED

样例: select cast(1.00 as SIGNED) from dual; select convert(1.00,SIGNED) from dual;

# 参考文章

  • https://www.cnblogs.com/panchanggui/p/10652322.html
  • https://www.cnblogs.com/ggjucheng/p/3352280.html
  • https://www.cnblogs.com/northeastTycoon/p/5505523.html
更新时间: 2021-10-30 15:17:05
  0
MySQL-常用函数
手机看
公众号
讨论
左栏
全屏
上一篇
下一篇
扫一扫 手机阅读
可分享给好友和朋友圈