1、时间日期函数转换
/**获取日期时间**/
# 返回当前时间 年月日 yyyy-MM-dd
select curdate(), current_date();
# 返回当前时间 时分秒 HH:mm:ss
select curtime(), current_time();
# 返回当前系统日期和时间 yyyy-MM-dd HH:mm:ss
select now(), sysdate(), current_timestamp(), localtime(), localtimestamp();
# 返回UTC 世界标准时间 日期
select UTC_DATE();
# 返回UTC 世界标准时间 时间
select UTC_TIME();
/**日期与时间戳的转换**/
# 以unix时间戳的形式返回当前时间
select unix_timestamp();
# 将时间date 以 unix时间戳的形式返回
select unix_timestamp(now());
# 将unix时间戳的时间转换为普通格式的时间
select from_unixtime(1711552123);
/***获取月份、星期、星期数、天数等函数*/
# 返回具体日期值
select year(now()),MONTH(curdate()),DAY(curtime());
#返回具体时间值
select HOUR(now()),MINUTE(current_time),SECOND(curtime());
# 返回月份
select MONTHNAME(now());
# 返回星期几
select weekday(now()) +1;
# 返回日期对应嫉妒
select quarter(curdate());
# 返回一年中的第几周
select week(now()),weekofyear(now());
# 返回一年中的第几天
select dayofyear(now());
# 返回一月中的第几天
select dayofmonth(curdate());
# 返回一周中的第几天
select dayofweek(curdate()) -1;
/**日期操作函数**/
# extract(type from date) 返回指定日期的特定部分,type值返回的值
select cast(extract(year_month from now()) as char);
/**时间和秒钟转换的函数**/
# 将time 转换为 秒 并返回结果
select TIME_TO_SEC(current_time);
# 将 秒转换为 包含 小时 分钟 秒的时间
select sec_to_time(3600);
/***计算日期与时间*/
# type: hour minute second year month day year_month day_hour day_minute day_second hour_minute hour_second
#返回给定日期时间相差interval时间段的日期时间 data_add(datatime,interval expr type)
select date_add(now(),interval 1 day),adddate(now(),interval '1_1' year_month );
#返回与date相差interval时间段的日期时间 data_sub(datatime,interval expr type)
select date_sub(now(),interval 1 day),subdate(now(),interval 1 month );
# 返回time1 + time2 的时间,当time2为一个数字时,代表秒,可以为负数
select addtime(4,5);
# 返回time1 - time2 的时间,当time2为一个数字时,代表秒,可以为负数
select subtime(4,5);
#返回data1 -data2 的日期的间隔天数
select datediff(now(),adddate(now(),interval -1 day ));
#返回time1 - time2 的时间间隔
select timediff(current_time(),subtime(current_time(),-1 ));
# 距离从0000年1月1日起,N天后的日期
select from_days(1000);
# 返回日期date距离0000年1月1日 的天数
select to_days(now());
# 返回data所在月份的最后一天日期
select last_day(concat_ws('-','2024-03','01'));
# 针对给定年份与所在年份中的天数返回一个日期
select makedate(year(now()),1);
# 针对给定的小时、分钟、秒 组合时间并返回
select maketime(hour(now()),minute(subdate(now(),interval 1 minute )),4);
# 返回time加上 n 后的时间
select period_add(current_time,5);
/**日期格式化和解析**/
# 格式化: 日期 ---》 字符串
# 按照字符串格式 fmt格式化日期 date 的值 date_format(date,fmt)
select date_format(now(),'%Y-%m');
# 按照字符串格式 fmt格式化日期 time 的值 time_format(time,fmt)
select time_format(current_time(),'%H');
# 解析: 字符串 ---》 日期
# 按照字符串格式 fmt 对 str 进行解析,解析为一个 日期 str_to_date(str,fmt)
select str_to_date('2023-12-01','%Y-%m-%d');
# %Y 4位数字表示年份
# %y 表示两位数字表示年份
# %M 月名表示月份(January,....)
# %m 两位数字表示月份(01,02,03。。。)
# %b 缩写的月名(Jan.,Feb.,....)
# %c 数字表示月份(1,2,3,...)
# %D 英文后缀表示月中的天数(1st,2nd,3rd,...)
# %d 两位数字表示月中的天数(01,02...)
# %e 数字形式表示月中的天数(1,2,3,4,5.....)
# %H 两位数字表示小数,24小时制(01,02..)
# %h和%I 两位数字表示小时,12小时制(01,02..)
# %k 数字形式的小时,24小时制(1,2,3)
# %l 数字形式表示小时,12小时制(1,2,3,4....)
# %i 两位数字表示分钟(00,01,02)
# %S和%s 两位数字表示秒(00,01,02...)
# %W 一周中的星期名称(Sunday...)
# %a 一周中的星期缩写(Sun.,Mon.,Tues.,..)
# %w 以数字表示周中的天数(0=Sunday,1=Monday....)
# %j 以3位数字表示年中的天数(001,002...)
# %U 以数字表示年中的第几周,(1,2,3。。)其中Sunday为周中第一天
# %u 以数字表示年中的第几周,(1,2,3。。)其中Monday为周中第一天
# %T 24小时制
# %r 12小时制
# %p AM或PM
# %% 表示%
2、流程控制函数
/**流程控制函数**/
# if(value,value1,value2) value 为 true 则value1 否则 value2
select if(1<0,true,false) from dual;
# ifnull(value1,value2) value1 为null1 ,则value2
select ifnull(null,true),ifnull(true,false) from dual;
# case expr when expr1 then value1 when expr2 then value2 else value3 end 理解为swich···case··· 语句
select case '2' when '3' then true when '4' then false else current_time() end from dual;
#case when expr then value when expr1 then value1 else value3 end 理解为 if···else if···else···
select case when 1<0 then true else '2' end from dual;
3、加密·解密函数
/**加密·解密 用于对数据库中的数据进行相关处理**/
# PASSWORD(str) 返回 str 加密字符 长度41 加密结果不可逆,若为 null 则 返回 空串 mysql8 中弃用
select password('123456'),password(null);
#MD5(str) 若参数为空,这返回 null 加密不可逆
select MD5('1234'),MD5(null);
#SHA(str) 当参数为null 则 返回null 比 MD5 更安全
select SHA('234');
# ENCODE(value ,password_seed) 返回使用 password_seed 作为加密密码 加密 value
select ENCODE('123456' ,'mysql');
#DECODE(value,password_seed) 返回使用password_seed 作为加密密码 解密 value 与DECODE函数互为反函数
select DECODE(ENCODE('123456' ,'mysql'),'mysql');
4、内置信息函数
/**内置查询MYSQL信息的函数**/
# 查看数据库版本号
SELECT VERSION();
# 返回MYSQL服务器连接数
SELECT CONNECTION_ID();
# 返回SQL命令当前所在数据库
SELECT DATABASE(),SCHEMA();
# 返回当前连接用户名,返回格式为 ‘主机名@用户名’
SELECT USER(),SYSTEM_USER(),SESSION_USER(),CURRENT_USER();
# 返回字符串VALUE自变量字符集 CHARSET(VALUE)
SELECT CHARSET('AS');
# 返回字符串VALUE的比较规则 COLLATION(VALUE)
SELECT COLLATION('ASS')
5、聚合函数
# SUM():计算数值列的总和。
select sum(salary) from employees;
# AVG():计算数值列的平均值。
select avg(salary) from employees;
# MAX():返回 任意数据类型 列的最大值。
select max(salary),max(first_name) from employees;
# MIN():返回 任意数据类型 列的最小值。
select min(salary),max(first_name) from employees;
# COUNT():返回指定列的行数或满足条件的行数。 Innodb引擎的表用count(*),count(1)直接读行数,复杂度是O(n),效率大于具体的count(列名)。
# COUNT(*)返回表中记录总数,适用于任意数据类型。 COUNT(expr) 返回expr不为空的记录总数。
select count(*) ,count(manager_id) ,count(1) from employees;
# GROUP_CONCAT():将查询结果中的多个行合并成一个字符串,并用指定的分隔符分隔。
select group_concat(first_name separator '-') from employees;
# STD():计算样本标准差。
SELECT STD(salary) FROM employees;
# STDDEV_POP():计算总体标准差。
SELECT STDDEV_POP(salary) FROM employees;
# STDDEV_SAMP():计算样本标准差。
SELECT STDDEV_SAMP(salary) FROM employees;
# VARIANCE():计算总体方差。
SELECT VARIANCE(salary) FROM employees;
# VAR_POP():计算总体方差。
SELECT VAR_POP(salary) FROM employees;
# VAR_SAMP():计算样本方差。
SELECT VAR_SAMP(salary) FROM employees;
# BIT_AND():对指定列的所有值进行按位与运算。 MySQL8支持
SELECT BIT_AND(2,3) FROM dual;
# BIT_OR():对指定列的所有值进行按位或运算。 MySQL8支持
SELECT BIT_OR(2,3) FROM dual;
# BIT_XOR():对指定列的所有值进行按位异或运算。 MySQL8支持
SELECT BIT_XOR(2,3) FROM dual;
6、其他相关函数
# FORMAT(VALUE,N) 返回对数字 VALUE 进行格式化后的结果数据,N表示 四舍五入 后保留到小数 N 位 , 若N <= 0 ,则只保留整数位
SELECT FORMAT(PI(),4),FORMAT(PI(),0); # 3.14.6 3
#CONV(VALUE ,FROM , TO) 将VALUE 的值进行不同进制之间的转换, FROM 当前进制 TO 目标进制
SELECT CONV(10,10,2); # 1010
# INET_ATON(IPVALUE) 将以点分隔的IP地址转换为一个数字 计算方式: 192 * 256的3次方 + 168 * 256的2次方 + 4 * 256 + 8
SELECT INET_ATON('192.168.4.8');
# INET_NTOA(VALUE) 将数字形式的IP地址转换为一点分隔的IP地址
SELECT INET_NTOA(3232236552); #192.168.4.8
# BENCHMARK(N,EXPR) 将表达式EXPR重复执行 N 次,用于测试MYSQL处理EXPR表达式所耗费时间
SELECT BENCHMARK(1000,CURRENT_DATE());
# CONVERT(VALUE USING CHAR_CODE) 将VALUE所使用的字符编码修改为 CHAR_CODE
SELECT CONVERT('RQTANC' USING 'UTF8MB4'),CHARSET('RQTANC');