MySQL之SQL中常用的函数

前言

  MySQL函数是MySQL数据库提供的内置函数。这些内置函数可以帮助用户更加方便地处理表中的数据。内置函数主要有 数学函数,字符串函数,日期和时间函数,条件判断函数,系统信息函数,加密函数和其他函数。本篇主要介绍一些常用的函数。

目录

前言

1、数学函数

1.1 abs(x)函数

1.2 floor(x)函数 

1.3 rand()函数 

 1.4 round()函数

2、字符串函数

2.1 length(str)函数

2.2 concat(str1,str2,...)函数

2.3 upper(str)、lower(str)函数

2.4 substr(str,start,len)函数

2.5 trim(str)函数

2.6 replace( str, x , y)函数 

2.7 left(str,x)、right(str,x)

2.8 instr(str,x)函数

 3、日期函数

3.1 DATE_FORMAT函数

3.2 now()函数

3.3 curdate()函数

 3.4 curtime()函数

 3.5 获取日期和时间中的年、月、日、时、分、秒

3.6 weekofyear(当前时间)函数 

3.7 quarter(当前日期)函数 

3.8 date_add(日期,Interval 数字 时间格式 )

3.9 date_use(日期,Interval 数字 时间格式 ) 

3.10 last_day(日期)函数

3.11 datediff(end_date,start_date)函数 

3.12 timestampdiff(unit,start_date,end_date)函数

3.13 获取年月日时分秒周

3.14 常用的日期sql查询

4、流程操作函数

4.1 if(expr,v1,v2)函数

4.2  ifnull (v1,v2)

4.3 case when n1 then x1 [when n2 then x2…else xn] end 

4.4 DISTINCT 函数 

5、聚合函数

5.1 SUM()函数

 5.2 AVG()函数

 5.3 MAX() 函数 

5.4 MIN() 函数  

 5.5 COUNT()  函数  

 5.6 any_value()  函数   

6、其他函数 

6.1 JSON_EXTRACT() 函数

6.2 CAST(expression AS data_type) 函数

6.3 CONVERT函数 


1、数学函数

1.1 abs(x)函数

用于求绝对值,如:3 - 5的绝对值。

                        

1.2 floor(x)函数 

返回小于或者等于x的最大的整数,如:求小于或等于5.5 和 - 4.5的最大整数。

                          

1.3 rand()函数 

返回0 ~ 1之间的随机数。

                           

 与floor函数组合使用,例如:生成1~100之间的随机数

                          

 1.4 round()函数

round()函数可以传一个参数,如:round(3.145),里面一个参数则是数值,它会自动四舍五入;

如果是round(3.1423,3), 两个参数的话,第一个是数值,第二个是小数点保留几位,然后进行四舍五入。

                        

2、字符串函数

2.1 length(str)函数

获取参数值的字节个数

对于utf-8字符集来说,一个英文占1个字节;一个中文占3个字节;

对于gbk字符集来说,一个英文占1个字节;一个中文占2个字节;

演示如下:

                       

2.2 concat(str1,str2,...)函数

将字符串拼接,通过输入的参数str1、str2等,将他们拼接成一个字符串。

                       

2.3 upper(str)、lower(str)函数

upper(str):将字符中的所有字母变为大写;

lower(str)将字符中的所有字母变成小写。

                      

2.4 substr(str,start,len)函数

参数第一个str为输入字符串,从start位置开始截取字符串,len表示要截取的长度; 没有指定len长度:表示从start开始起,截取到字符串末尾。指定了len长度:表示从start开始起,截取len个长度。

2.5 trim(str)函数

去掉字符串前后的空格; 该函数只能去掉字符串前后的空格,不能去掉字符串中间的空格。

                     

2.6 replace( str, x , y)函数 

将字符串str中的 x 替换成y

                   

2.7 left(str,x)、right(str,x)

left(str,x):返回字符串str最左端x个字符;

right(str,x):返回字符串str最右端x个字符 。

                  

2.8 instr(str,x)函数

返回x第一次出现的索引,如果找不到,返回0; 当查找的x存在于字符串中:返回该子串在字符串中第一次出现的索引。当查找的x不在字符串中返回0。

                  

 3、日期函数

3.1 DATE_FORMAT函数

日期的含义:指的是我们常说的年、月、日。

时间的含义:指的是我们常说的时、分、秒。

DATE_FORMAT("20000101", '%Y-%m-%d') -- 2020-01-01
DATE_FORMAT("2000-01-01", '%Y-%m-%d') -- 2020-01-01
DATE_FORMAT('2000-05-07 05:06:07', '%H:%i:%s') -- 05:06:07 (24小时制)
DATE_FORMAT('2000-05-07 05:06:07', '%h:%i:%s') -- 05:06:07 (12小时制)
DATE_FORMAT('2000-05-07 05:06:07', '%Y-%m-%d %H:%i:%s') -- 2000-05-07 05:06:07

3.2 now()函数

返回当前系统的日期和时间

                        

3.3 curdate()函数

只返回系统当前的日期 (年月日)

                         

 3.4 curtime()函数

只返回当前的时间(时分秒),不包含日期

                          

 3.5 获取日期和时间中的年、月、日、时、分、秒

获取年份:year()

获取月份: month()

获取日: day()

获取小时: hour()

获取分钟: minute()

获取秒数: second()

3.6 weekofyear(当前时间)函数 

获取当前时刻所属周数

                 

3.7 quarter(当前日期)函数 

获取当前时刻所属的季度

                 

3.8 date_add(日期,Interval 数字 时间格式 )

向前偏移日期和时间,除此之外还有hour(小时),minute(分钟),second(秒),year(年)

             

3.9 date_use(日期,Interval 数字 时间格式 ) 

 向后偏移日期和时间,除此之外还有hour(小时),minute(分钟),second(秒),year(年)

              

3.10 last_day(日期)函数

提取某个月最后一天的日期

             

3.11 datediff(end_date,start_date)函数 

计算两个时间相差的天数

             

3.12 timestampdiff(unit,start_date,end_date)函数

计算两个时间返回的年/月/天数;
unit参数是确定(start_date,end_date)结果的单位,表示为整数,以下是有效单位:

year:年份、month:月份、day:天、hour:小时、minute 分钟、second:秒、microsecond:微秒、week:周数、quarter:季度

            

3.13 获取年月日时分秒周
SELECT now(),dayofweek(now()),YEAR(now()),MONTH(now()),DAY(now()),HOUR(now()),MINUTE(now()),SECOND(now()),WEEK(now());
3.14 常用的日期sql查询
-- 今天
select * from sys_log_login where to_days(createTime) = to_days(now());
-- 查询最近一周的数据
select * from sys_log_login where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(createTime);
-- 查询上一周数据
SELECT * FROM sys_log_login WHERE YEARWEEK(date_format(now() ,'%Y-%m-%d'))= YEARWEEK(now()) -1
-- 近30天
SELECT *FROM sys_log_login  where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date( createTime)
-- 查询最近一月的数据
select * from sys_log_login where DATE_SUB(CURDATE(), INTERVAL 1 MONTH) <= date(createTime);
-- 查询本月数据
SELECT * FROM sys_log_login WHERE DATE_FORMAT(createTime, '%Y%m')=DATE_FORMAT(CURDATE() , '%Y%m')
-- 查询上一月数据
SELECT * FROM sys_log_login WHERE PERIOD_DIFF(date_format(now() ,'%Y%m'), date_format(createTime ,'%Y%m'))=1
-- 查询本年数据
select * from `sys_log_login` where YEAR(createTime)=YEAR(NOW());
-- 查询上一年数据
select * from `sys_log_login` where year(createTime)=year(date_sub(now(),interval 1 year));
-- 按日查询
SELECT DATE_FORMAT(createTime, '%Y-%m-%d') AS time,COUNT(*) FROM sys_log_login GROUP BY time
-- 按周查
SELECT DATE_FORMAT(createTime, '%Y-%u') AS time,COUNT(*) FROM sys_log_login GROUP BY time
-- 按月查
SELECT DATE_FORMAT(createTime,'%Y-%m') AS time,COUNT(*) FROM sys_log_login GROUP BY time
-- 按年查
SELECT DATE_FORMAT(createTime,'%Y') AS time,COUNT(*) FROM sys_log_login GROUP BY time
-- 按月分组查询
SELECT
	SUM(case MONTH(createTime) WHEN 1 THEN 1 ELSE 0 END) AS 一月份,
	SUM(case MONTH(createTime) WHEN 2 THEN 1 ELSE 0 END) AS 二月份,
	SUM(case MONTH(createTime) WHEN 3 THEN 1 ELSE 0 END) AS 三月份,
	SUM(case MONTH(createTime) WHEN 4 THEN 1 ELSE 0 END) AS 四月份,
	SUM(case MONTH(createTime) WHEN 5 THEN 1 ELSE 0 END) AS 五月份,
	SUM(case MONTH(createTime) WHEN 6 THEN 1 ELSE 0 END) AS 六月份,
	SUM(case MONTH(createTime) WHEN 7 THEN 1 ELSE 0 END) AS 七月份,
	SUM(case MONTH(createTime) WHEN 8 THEN 1 ELSE 0 END) AS 八月份,
	SUM(case MONTH(createTime) WHEN 9 THEN 1 ELSE 0 END) AS 九月份,
	SUM(case MONTH(createTime) WHEN 10 THEN 1 ELSE 0 END) AS 十月份,
	SUM(case MONTH(createTime) WHEN 11 THEN 1 ELSE 0 END) AS 十一月份,
	SUM(case MONTH(createTime) WHEN 12 THEN 1 ELSE 0 END) AS 十二月份
FROM sys_log_login
WHERE
	YEAR(createTime) = YEAR(CURDATE())

4、流程操作函数

4.1 if(expr,v1,v2)函数

 实现if-else的效果,如果expr是true,返回v1。如果expr是false,返回v2

           

4.2  ifnull (v1,v2)

如果v1不为空,则显示v1的值;否则显示v2的值。 

          

4.3 case when n1 then x1 [when n2 then x2…else xn] end 

case表示函数开始,end表示函数结束。如果表达式n1成立,则返回x1的值;如果表达式n2成立,则返回x2的值。以此类推,最后遇到else时,返回xn的值。

          

4.4 DISTINCT 函数 

distinct是用于去重,但是只能放在查询字段的开头 

            

5、聚合函数

5.1 SUM()函数

 求所有行中单列结果的总和

           

 5.2 AVG()函数

求平均值 

        

 5.3 MAX() 函数 

求最大值 

      

5.4 MIN() 函数  

求最小值 

        

 5.5 COUNT()  函数  

求总行数 

     

 5.6 any_value()  函数   

MySQL5.7之后,sql_mode中ONLY_FULL_GROUP_BY模式默认设置为打开状态。

ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,简单的说来,在此模式下,target list中的值要么是来自于聚合函数(sum、avg、max等)的结果,要么是来自于group by list中的表达式的值。

网上有很多通过修改sql_mode的方式来解决此问题。

但除此方法,MySQL也提供了any_value()函数来抑制ONLY_FULL_GROUP_BY值被拒绝。

 

6、其他函数 

6.1 JSON_EXTRACT() 函数

JSON_EXTRACT函数的作用是根据指定的路径,从JSON数据中提取相应的字段值。路径可以是简单的键名,也可以是多层次的嵌套键名,前提您在使用MySQL 5.7及以上版本 。

例如:我们有以下数据

{
    "name": "John",
    "age": 30,
    "address": {
        "city": "New York",
        "country": "USA"
    }

如果我们想要获取address.country的值,可以使用以下查询:

SELECT JSON_EXTRACT(person, '$.address.country');
 

得到值:"USA"

6.2 CAST(expression AS data_type) 函数

expression 是被转换的表达式,type是目标数据类型。MySQL支持的数据类型如下:

  1. 整数类型:TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
  2. 浮点数类型:FLOAT, DOUBLE, DECIMAL
  3. 字符串类型:CHAR, VARCHAR
  4. 日期时间类型:DATE, TIME, DATETIME, TIMESTAMP

-- 将整数转换成字符串
SELECT CAST(123 AS CHAR);

-- 将日期转换成字符串
SELECT CAST(NOW() AS CHAR);

-- 将字符串转换成日期
SELECT CAST('2022-10-01' AS DATE);

6.3 CONVERT函数 

CONVERT函数也用于将一个数据类型转换成另一个数据类型,其语法与CAST函数类似:

CONVERT(expr, type)

其中,expr是被转换的表达式,type是目标数据类型。需要注意的是:

CONVERT函数可以指定字符集和排序规则,这在处理多语言数据时非常有用。例如:

-- 将字符串转换成UTF8编码的字符串
SELECT CONVERT('中国', CHAR CHARACTER SET utf8);

-- 将字符串转换成GBK编码的字符串
SELECT CONVERT('中国', CHAR CHARACTER SET gbk);

-- 将字符串转换成二进制形式,并指定排序规则
SELECT CONVERT('中国', BINARY) COLLATE utf8_bin;

 

 

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2024暴富

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值