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的六种函数使用,你真的会用嘛?的主要内容,如果未能解决你的问题,请参考以下文章