MySQL的六种函数使用,你真的会用嘛?

Posted KJ.JK

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL的六种函数使用,你真的会用嘛?相关的知识,希望对你有一定的参考价值。

文章目录

💨往期精彩知识👇

💖Spring中的创建对象的三种方式、第三方资源配置管理详细描述及使用(XML版完结篇)

💖Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)

💖Spring中的依赖注入、setter与构造器注入、自动装配与集合注入详细描述及使用(XML版中篇)


🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
 
🍂个人博客首页: KJ.JK
 
💖系列专栏:JavaEE进阶教程系列


一、mysql的函数

在MySQL中,为了提高代码重用性和隐藏实现细节,MySQL提供了很多函数。函数可以理解为别人封装好的模板代码


二、mysql函数的分类

在MySQL中,函数非常多,主要可以分为以下几类:

  • 聚合函数
  • 数学函数
  • 字符串函数
  • 日期函数
  • 控制流函数
  • 窗口函数

🔶聚合函数

MySQL中,聚合函数主要由:count,sum,min,max,avg,这些聚合函数我们之前都学过,不再重复

这里我们学习另外一个函数: group_concat()"该函数用户实现行的合并"

"作用" :首先根据group by指定的列进行分组,并且用分隔符分隔,将同一个分组中的值连接起来,返回一个字符串结果

--------------------------------------------------------------------------------------------------------

"语法:"
group_concat([distinct] 字段名 [order by 排序字段 asc/desc] [separator '分隔符'])

--------------------------------------------------------------------------------------------------------


"说明:"
1.使用distinct可以排除重复值

     2.如果需要对结果中的值进行排序,可以使用order by子句

     3.separator是一个字符串值,默认为逗号。


  • 代码演示:
//数据准备
create database mydb4;

use mydb4;

create table emp(
emp_id int primary key auto_increment comment '编号',
emp_name char(20) not null default '' comment '姓名',
salary decimal(10,2) not null default 0 comment '工资',       -- decimal(7,4)  // 685.1234 总共7位,保留4位小数
department char(20) not null default '' comment '部门'
);



insert into emp(emp_name,salary,department)
values('张晶晶',5000,'财务部'),('王飞飞',5800,'财务部'),
('赵刚',6200,'财务部'),('刘小贝',5700,'人事部'),
('王大鹏',6700,'人事部'),('张小斐',5200,'人事部'),
('刘云云',7500,'销售部'),('刘云鹏',7200,'销售部'),('刘云鹏',7800,'销售部');

-- 将所有员工的名字合并成一行
select group_concat(emp_name) from emp;


-- separator ';' 表示指定分隔符为;合并, 要写在后面
-- 指定分隔符合并
select group_concat(emp_name separator ';') from emp;


-- 指定排序方式和分隔符

select department,group_concat(emp_name separator ';') from emp group by department;    -- 先分组再合并

select department,group_concat(emp_name order by  salary desc separator ';') from emp group by department;    -- 先分组再合并按照工资降序排序


🔶数学函数

函数名描述
abs(x) 或 ABS(x)返回 x 的绝对值
ceil(x) 或 CEIL(x)返回大于或等于 x 的最小整数
floor(x) 或 FLOOR(x)返回小于或等于 x 的最大整数
greatest(expr1, expr2, expr3, …) 或 GREATEST(expr1, expr2, expr3, …)返回列表中的最大值
least(expr1, expr2, expr3, …) 或 LEAST(expr1, expr2, expr3, …)返回列表中的最小值
max(expression) 或 MAX(expression)返回字段 expression 中的最大值
min(expression) 或 MIN(expression)返回字段 expression 中的最小值
mod(x,y) 或 MOD(x,y)返回 x 除以 y 以后的余数
pi() 或 PI()返回圆周率(3.141593)
pow(x,y) 或 POW(x,y)返回 x 的 y 次方
rand() 或 RAND()返回 0 到 1 的随机数
rand(x) 或 ROUND(x)返回离 x 最近的整数(遵循四舍五入)
round(x,y) 或 ROUND(x,y)返回指定位数的小数(遵循四舍五入)
truncate(x,y) 或 TRUNCATE(x,y)返回数值 x 保留到小数点后 y 位的值(与 ROUND 最大的区别是不会进行四舍五入)

⭐代码演示

-- 数学函数

select abs(-100);    -- 绝对值为100

select ceil(2.5);    -- 向上取整为3 

select floor(1.5);   -- 向下取整为1

select greatest(1,2);  -- 返回列表中的最大值  -- 2
select greatest('gbk','gb'); -- gbk


select least(1,2);    -- 返回列表中的最小值  -- 1

select mod(5,2);  -- 取模 1

select power(2,3)  -- a的b次方 -- 8


select rand();        -- 返回0到1的随机数
select rand()*100;     -- 返回0到100的随机数

select round(1.23456);    -- 四舍五入为1



select round(1.23456,3);  -- 返回指定位的数的小数(也四舍五入)  1.235     -- 返回3位小数

select truncate(1.23456,3);     -- 返回指定位的数的小数(不会四舍五入)    1.234

🔶字符串函数

函数描述
char_length(s) 或 CHAR_LENGTH(s)返回字符串 s 的字符数
character_length(s) 或 CHARACTER_LENGTH(s)返回字符串 s 的字符数
concat(s1,s2…sn) 或
CONCAT(s1,s2…sn)
字符串 s1,s2 等多个字符串合并为一个字符串
concat_ws(x,s1,s2…sn) 或
CONCAT_WS(x, s1,s2…sn)
同 CONCAT(s1,s2,…) 函数,但是每个字符串之间要加上 x,x 可以是分隔符
fieled(s,s1,s2) 或 FIELD(s,s1,s2…)返回第一个字符串 s 在字符串列表(s1,s2…)中的位置
ltrim(s) 或 LTRIM(s)去掉字符串 s 开始处的空格
mid(s,len) 或 MID(s,n,len)从字符串 s 的 n 位置截取长度为 len 的子字符串,同 SUBSTRING(s,n,len)
position(s1 in s) 或 POSITION(s1 IN s)从字符串 s 中获取 s1 的开始位置
replace(s,s1,s2) 或 REPLACE(s,s1,s2)将字符串 s2 替代字符串 s 中的字符串 s1
reverse(s) 或 REVERSE(s)将字符串s的顺序反过来
right(s,n) 或 RIGHT(s,n)返回字符串 s 的后 n 个字符
rtrim(s) 或 RTRIM(s)去掉字符串 s 结尾处的空格
strcmp(s1,s2) 或 STRCMP(s1,s2)比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1
substr(s,start,length) 或
SUBSTR(s, start, length)
从字符串 s 的 start 位置截取长度为 length 的子字符串
substring(s,start,length) 或
SUBSTRING(s, start, length)
从字符串 s 的 start 位置截取长度为 length 的子字符串
trim(s) 或 TRIM(s)去掉字符串 s 开始和结尾处的空格
ucase(s) 或 UCASE(s)将字符串转换为大写
upper(s) 或 UPPER(s)将字符串转换为大写
lcase(s) 或 LCASE(s)将字符串 s 的所有字母变成小写字母
lower(s) 或 LOWER(s)将字符串 s 的所有字母变成小写字母

⭐代码演示

-- 字符串函数

-- 1.获取字符串字符个数
select char_length('hello');  -- 5
select char_length('你好');   -- 2




-- length 取长度,返回的单位是字节
select length('hello');   -- 5
select length('你好');   -- 6   2*3  一个汉字三个字节


-- chararcter_length

select character_length('hello'); -- 5 等价于char_length


-- 2.字符串合并
select concat('hello','world');   -- helloworld


-- 3.指定分隔符进行字符串合并
select concat_ws('-','hello','world');  -- hello-world



-- 4.返回字符串在列表中第一次出现的位置
select field('aaa','aaa','bbb','ccc');   -- aaa 在第一个出现 1

select field('bbb','aaa','bbb','ccc');   -- 2
select field('bbb','aaa','bbb','ccc','bbb');   -- 2


-- 5.去除字符串左边,右边,两边空格
select ltrim('       aaa');     
select rtrim('    aaa       ');  
select trim('    aaa       ');  -- aaa


-- 6.字符串截取
select mid('helloworld',2,3); -- 从第二个字符开始截取,截取长度为3
 
select substr('helloworld',2,3); -- ell

select substring('helloworld',2,3); -- ell  和上面的用法都一样



-- 7.获取字符串A在字符串中第一次出现的位置
select position('abc' in 'helloabc');  -- 6


-- 8.字符串替换
select replace('abc','a','x');  -- xbc  把a替换成x



-- 9.字符串反转
select reverse('abc');    -- cba


-- 10.返回字符串的后几个字符

select right('hello',3);   -- 返回最后三个字符


-- 11.字符串比较
-- 按照字母表来,越后越大
select strcmp('a','b');  -- -1 比较的ASCII码顺序 a<b 
select strcmp('a','a');   -- 0
select strcmp('b','a');   -- 1
select strcmp('hello','world');   -- -1 先比较第一个再比较下面的



-- 12.字符串转换大写
select ucase('abc');

select upper('abc');


-- 13.字符串转换小写
select lcase('ABC');

select lower('ABC');

🔶日期函数

函数描述
unix_timestamp() 或 UNIX_TIMESTAMP()返回从1970-01-01 00:00:00到当前毫秒值
unix_timestamp(date_string) 或UNIX_TIMESTAMP(DATE_STRING)将制定日期转为毫秒值时间戳
from_unixtime(bigint unixtime[,string format])
FROM_UNIXTIME(BIGINT UNIXTIME[, STRING FORMAT])
将毫秒值时间戳转为指定格式日期
curdate() 或 CURDATE()返回当前日期
current_date() 或 CURRENT_DATE()返回当前日期
current_time 或 CURRENT_TIME返回当前时间
curtime() 或 CURTIME()返回当前时间
current_timestamp() 或 CURRENT_TIMESTAMP()返回当前日期和时间
date() 或 DATE()从日期或日期时间表达式中提取日期值
datediff(d1,d2) 或 DATEDIFF(d1,d2)计算日期 d1->d2 之间相隔的天数
timediff(time1,time2) 或 TIMEDIFF(time1, time2)计算时间差值
date_format(d,f) 或 DATE_FORMAT(d,f)按表达式 f的要求显示日期 d
str_to_date(string,format_mask)
STR_TO_DATE(string, format_mask)
将字符串转变为日期
date_sub(date,interval expr type)
DATE_SUB(date,INTERVAL expr type)
函数从日期减去指定的时间间隔
adddate/date_add(d,interval expr type)
ADDDATE/DATE_ADD(d,INTERVAL expr type)
计算起始日期 d 加上一个时间段后的日期,type 值可以是:
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
DAY_MINUTE
DAY_HOUR
YEAR_MONTH
date_add(d,interval expr type)
DATE_ADD(d,INTERVAL expr type)
计算起始日期 d 加上一个时间段后的日期,type 值可以是:
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH
EXTRACT(type FROM d)从日期 d 中获取指定的值,type 指定返回的值。type可取值为:
MICROSECOND
SECOND
MINUTE
HOUR
last_day(d)
LAST_DAY(d)
返回给给定日期的那一月份的最后一天
makedate(year,day-of-year)
MAKEDATE(year, day-of-year)
基于给定参数年份 year 和所在年中的天数序号 day-of-year 返回一个日期
year(d) 或 YEAR(d)返回年份
month(d)或 MONTH(d)返回日期d中的月份值,1 到 12
day(d) 或 DAY(d)返回日期d中的天数值值,1 到 31
hour(t) 或 HOUR(t)返回 t 中的小时值
minute(t) 或 MINUTE(t)返回 t 中的分钟值
second(t) 或 SECOND(t)返回 t 中的秒钟值
quarter(d) 或 QUARTER(d)返回日期d是第几季节,返回 1 到 4
monthname(d) 或 MONTHNAME(d)返回日期当中的月份名称,如 November
month(d)或 MONTH(d)返回日期d中的月份值,1 到 12
dayname(d) 或 DAYNAME(d)返回日期 d 是星期几,如 Monday,Tuesday
dayofmonth(d) 或 DAYOFMONTH(d)计算日期 d 是本月的第几天
dayofweek(d) 或 DAYOFWEEK(d)日期 d 今天是星期几,1 星期日,2 星期一,以此类推
dayofyear(d) 或 DAYOFYEAR(d)计算日期 d 是本年的第几天
week(d) 或 WEEK(d)计算日期 d 是本年的第几个星期,范围是 0 到 53
weekday(d) 或 WEEKDAY(d)日期 d 是星期几,0 表示星期一,1 表示星期二
weekofyear(d) 或 WEEKOFYEAR(d)计算日期 d 是本年的第几个星期,范围是 0 到 53
yearweek(date,mode)或 YEARWEEK(date, mode)返回年份及第几周(0到53),mode 中 0 表示周天,1表示周一,以此类推
now() 或NOW()返回当前日期和时间

⭐代码演示

-- 日期函数

-- 1.获取时间戳(毫秒值) --返回从1970-01-01 00:00:00到当前毫秒值

select unix_timestamp();


-- 2.将一个日期字符串转为毫秒值

select unix_timestamp('2022-02-03 12:01:01');   -- 1643860861


--  3.将时间戳毫秒值转为指定格式的日期

select from_unixtime(1643860861,'%Y-%m-%d %H:%i:%s');  -- 2022-02-03 12:01:01


-- 4.获取当前的年月日

select curdate();  -- 返回当前日期

select current_date();

-- 5.获取当前的时分秒

select curtime();

select current_time();

-- 6. 返回当前日期和时间

select current_timestamp();   -- '2022-02-03 12:18:10'
select now();      -- 2022-02-03 13:34:24

-- 7.从日期字符串中获取年月日

select date('2022-02-03 12:18:10');  -- 2022-02-03



-- 8.计算日期d1->d2之间相隔的天数(获取日期之间的差值)

select datediff('2022-02-13','2022-02-03');  -- 10


-- 9.计算时间差值

select timediff('12:39:24','12:29:23');    -- 00:10:01

-- 10.日期格式化

select date_format('2022-2-3 12:32:30','%Y-%m-%d %H:%i:%s');  -- 2022-02-03 12:32:30

-- 11.将字符串转为日期

select str_to_date('2022-2-3 12:32:30','%Y-%m-%d %H:%i:%s'); 
select str_to_date('August 10 2017','%M %d %Y');  
-- 2017-08-10


-- 12.将日期进行减法(interval 这个是一定有的) --日期向前跳转

-- 表示将2022-02-03 减去两天
select date_sub('2022-02-03',interval 2 day);  -- 2022-02-01

-- 表示减去2个月
select date_sub('2022-02-03',interval 2 month);  -- 2021-12-03


-- 13.将日期进行加法(interval 这个是一定有的)  --日期向后跳转

-- 表示加两天
select date_add('2022-02-03',interval 2 day);  -- 2022-02-05

-- 表示加2个月
select date_add('2022-02-03',interval 2 month);  -- 2022-04-03


-- 14.从日期中获取小时(获取月,年,天,分等)

select extract( hour from '2022-02-03 12:47:30');   -- 12
select extract( month from '2022-02-03 12:47:30');   -- 2
select extract( year from '2022-02-03 12:47:30');    -- 2022
select extract( day from '2022-02-03 12:47:30');   -- 3
select extract( minute from '2022-02-03 12:47:30');   -- 47
select extract( second from '2022-02-03 12:47:30');   -- 30


-- 15.获取给定日期所在月的最后一天

select last_day('2022-02-03'); -- 2022-02-28

-- 16. 获取指定年份和天数的日期

-- 表示的意思是2022年的第53天是什么时候
select makedate(2022,53);  -- 2022-02-22

-- 17.根据日期获取年月日,时分秒

select year('2022-02-03 12:47:30'); -- 比extract 方便
select month('2022-02-03 12:47:30'); 

select day('2023-01-29 12:47:30'); 

select minute('2022-02-03 12:47:30'); 
select quarter('2022-02-03 12:47:30'); -- 获取季度  --1


-- 18.根据日期获取信息

-- 获取月份的英文

select monthname('2022-12-03 12:47:30');   -- December



-- 返回日期中的月份值(1-12)
select month('2022-12-03 12:47:30');   -- 12



-- 返回日期中的星期几
select dayname('2022-02-03 12:47:30');    -- Thursday



-- 返回日期是本月的第几天
select dayofmonth('2022-02-03 12:47:30');   -- 3



-- 计算日期今天是星期几,1是星期日,2是星期一
select dayofweek('2022-02-03 12:47:30');   -- 5是星期四

-- 计算日期是本年的第几天
select dayofyear('2022-02-03 12:47:30');   -- 34



-- 19. 

-- 计算日期是本年的第几个星期,范围是0-53
select week('2022-02-03 12:47:30');  -- 5
select weekofyear('2022-02-03 12:47:30'); -- 5


-- 获取是星期几,0表示星期一,1表示星期二
select weekday('2022-02-03 12:47:30');   -- 3


-- 返回年份及第几周(0到53),mode中0表示周天,1表示周一
-- YEARWEEK(date,mode)

select yearweek('2022-02-03');   -- 2022 05


🔶控制流函数


🔹if逻辑判断语句

格式描述
IF(expr,v1,v2)如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2。
IFNULL(v1,v2)如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。
ISNULL(expression)判断表达式是否为 NULL
NULLIF(expr1, expr2)比较两个字符串,如果字符串 expr1 与 expr2 相等 返回 NULL,否则返回 expr1

⭐代码演示
-- if
select if(5>3,'大于','小于');  -- 大于



-- ifnull

select ifnull(null,1);    -- 1


-- isnull
select isnull(5);   -- 0
select isnull(null);  -- 1


-- nullif (比较两个字符串,相等就返回null,不然返回字符串1)

select nullif(12,12);   -- null
select nullif(12,13);   -- 12

🔹case when语句

格式描述
CASE expression
WHEN condition1 THEN result1
WHEN condition2 THEN result2

WHEN conditionN THEN resultN
ELSE result
END
CASE 表示函数开始,END 表示函数结束。如果 condition1 成立,则返回 result1
如果 condition2 成立,则返回 result2,当全部不成立则返回 result
而当有一个成立之后,后面的就不执行了。

⭐代码演示
select  
  case 5                       -- 判断5,输出正确
	   when 1 then  '你好'
		 when 2  then 'hello'
		 when 5 then '正确'
	   else
		     '其他'
	end as info;			 
	
	
------------------------------------------------------------------------------------------------------------
	
select                       -- 判断5,输出你好,只会执行一次
  case 
	   when 2>1 then  '你好'
		 when 2<1  then 'hello'
		 when 3>2 then '正确'
	   else
		     '其他'
	end as info;		

🔶窗口函数

  • 介绍:

MySQL 8.0 新增窗口函数,窗口函数又被称为开窗函数,与Oracle 窗口函数类似,属于MySQL的一大特点。
非聚合窗口函数是相对于聚函数来说的。聚合函数是对一组数据计算后返回单个值(即分组),非聚合函数一次只会处理一行数据。窗口聚合函数在行记录上计算某个字段的结果时,可将窗口范围内的数据输入到聚合函数中,并不改变行数。


  • 分类:

另外还有开窗聚合函数: SUM,AVG,MIN,MAX


⭕窗口函数的语法

window_function ( expr ) OVER ( 
  PARTITION BY ..以上是关于MySQL的六种函数使用,你真的会用嘛?的主要内容,如果未能解决你的问题,请参考以下文章

简单聊聊MySQL中的六种日志

简单聊聊MySQL中的六种日志

数据库实现批量快速插入大量数据的六种方案

你真的会用mysql行级锁吗?mysql 行级锁全解析

Mysql的explain,你真的会用吗?

Mysql的explain,你真的会用吗?