数字化运营基础技能 – SQL 数据分析常用语句
01 基础查询
02 字符串\数字\日期时间
03 聚合数据查询
04 子查询
05 联接\组合查询
06 高级查询
07 更新数据
SQL函数大全,分类清晰,绝对值得收藏,想不起来用什么函数看它就没错了!
不多废话,直接上干货。
1、聚合函数
2、数字函数
3、字符串函数
4、日期函数
5、转换函数
6、系统函数
7、条件函数
8、加密函数
根据我的理解,SQL函数可以划分成上述的8个类别,接下来将一一为大家介绍。
一、聚合函数
AVG(col) 返回指定列中所有的平均值。仅用于数字列并自动忽略NULL值。
COUNT(col) 返回指定列中非NULL值的数量。可用于数字和字符列。
COUNT(*) 返回表中的行数(包括有NULL值的列)。
MAX(col) 返回指定列中的最大值,忽略NULL值。可用于数字、字符和日期时间列。
MIN(col) 返回指定列中的最小值,忽略NULL值。可用于数字、字符和日期时间列。
SUM(col) 返回指定列中所有的总和,忽略NULL值。仅用于数字列。
二、数字函数
ACOS(float_expr) 返回角(以弧度表示),它的余弦值近似于指定的浮点表达式。
ASIN(float_expr) 返回角(以弧度表示),它的正弦值近似于指定的浮点表达式。
ATAN(float_expr) 返回角(以弧度表示),它的正切值近似于指定的浮点表达式。
ATN2(float_expr1, float_expr2) 返回角(以弧度表示),它的正切值在两个近似的浮点表达式之间。
COS(float_expr) 返回以浮点表达式表示的近似于指定角度(以弧度表示)的余弦三角函数的值。
COT(float_expr) 返回以浮点表达式表示的近似于指定角度(以弧度表示)的余切三角函数的值。
SIN(float_expr) 返回以浮点表达式表示的近似于指定角度(以弧度表示)的正弦三角函数的值。
TAN(float_expr) 返回以浮点表达式表示的近似于指定角度(以弧度表示)的正切三角函数的值。
ABS(num_expr) 返回数值表达式的绝对值。
CEILING(num_expr) 返回大于或等于数值表达式的最小整数。
FLOOR(num_expr) 返回小于或等于数值表达式的最大整数。
DEGREES(num_expr)返回数值表达式表示的弧度值对应的度值。
RADIANS(num_expr) 返回数值表达式表示的度值对应的弧度值。
EXP(float_expr) 根据指定的近似浮点表达式,返回指数值。
LOG(float_expr) 根据指定的近似浮点表达式,返回自然对数值。
LOG10(float_expr) 根据指定的近似浮点表达式,返回以10为底的对数。
POWER(num_expr,y) 返回幂为y的数值表达式的值。
SQRT(float_expr) 返回指定的近似浮点表达式的平方根。
SQUARE(float_expr) 返回浮点表达式的平方值。
PI() 返回常量值3.141592653589793。
RAND([seed]) 随机返回的0到1之间的近似浮点值,可以对seed指定为整数表达式(可选)。
ROUND(num_expr,length) 对数值表达式截取指定的长度,返回四舍五入后的值。
SIGN(num_expr) 对正数执行+1操作,对负数和零执行-1操作。
三、字符串函数
主要用于char和varchar数据类型。
Expr1+expr2 返回两个表达式的组合形式的字符串。
CONCAT(char_expr1, char_expr2, char_exprn) 返回连接的字符串。
ASCII(char_expr) char_expr可以是文字字符,字符串表达式或列。如果char_expr有多个字符,则该函数返回其最左侧字符的ASCII代码值。
CHAR(int_expr) 返回到之间的整数表达式的ASCⅡ字符值。如果输入的值不在有效范围内,则返回NULL。
CHARINDEX(‘pattern’,char_expr) 返回字符表达式中指定模式的起始位置。
PATINDEX(‘%pattern%’,expr) 返回表达式中模式第一次出现的起始位置。返回表示不存在模式形式。
FIELD(char_expr, char_expr1, char_expr2, char_expr3,…) 在char_expr之后的字符串中寻找char_expr,并返回出现的索引位置。
DIFFERENCE(char_expr1,char_expr2) 根据比较两个字符表达式的相似度,返回到之间的值。表示匹配度最佳。
SOUNDEX(char_expr) 评估两个字符串的相似度后得到的位代码。
LEN(char_expr) 返回字符表达式的长度。
LOWER(char_expr) 将字符表达式全部转换为小写。
UPPER(char_expr) 将字符表达式全部转换为大写。
LTRIM(char_expr) 返回删除掉前面空格的字符表达式。
RTRIM(char_expr) 返回删除掉其后空格的字符表达式。
TRIM(char_expr ) 返回删除掉开头和结尾空格的字符表达式。
SPACE(int_expr) 返回包含指定空格数的字符串。
REPLICATE(input_string,count) 返回重复指定次数的字符表达式产生的字符串。
RIGHT(char_expr,int_expr) 返回从字符表达式最右端起根据指定的字符个数得到的字符。
STUFF(char_expr1,start,length,char_expr2) 使用字符表达式替换字符表达式的一部分字符,从指定的位置开始替换指定的长度。
SUBSTRING(char_expr,start,length) 返回从字符表达式的指定位置开始,截取指定长度得到的字符集。
STR(float_expr[,length[,decimal]]) 返回浮点表达式的字符串表示法。
OCT(char_expr) 返回八进制参数的字符串表示。
REVERSE(char_expr) 反转字符表达式。
四、日期函数
1、获取时间
GETDATE() 当前的系统日期。
select GETDATE() — 2019-05-07 18:34:27.343
#获取当前日期还可使用CURRENT_TIMESTAMP()、LOCALTIME()、LOCALTIMESTAMP()。
DATENAME(日期部分,date) 返回日期中日期部分的字符串形式。
select DATENAME(dw,GETDATE()) — 星期二
注:DATENAME 和 DATEPART 的区别,返回的值类型不同,一个是VARCHAR一个是INT,另外就是星期会用本地语言来表示
DATEPART(日期部分,date) 返回日期中指定的日期部分的整数形式。
select DATEPART(dw,GETDATE()) — (返回今天是一周中的第几天):3
YEAR(date) 返回指定日期的年份数值
select YEAR(GETDATE()) — 2019
MONTH(date)返回指定日期的月份数值
DAY(date)返回指定日期的天数值
还可使用EXTRACT()抽取日期。
# 对于时间2021-04-02 09:25:29,分别获取其年、月、日、时、分、秒
SELECT EXTRACT(YEAR FROM NOW()); # 2021
SELECT EXTRACT(MONTH FROM NOW()); # 4
SELECT EXTRACT(DAY FROM NOW()); # 2
SELECT EXTRACT(HOUR FROM NOW()); # 9
SELECT EXTRACT(MINUTE FROM NOW()); # 25
SELECT EXTRACT(SECOND FROM NOW()); # 29
# 或者从日期格式字符串中获取
SELECT EXTRACT(SECOND FROM ‘2021-04-02 10:37:14.123456’); # 14
2、增加、减少日期
# 时间减少1小时(前一小时)
select date_sub(now(), INTERVAL 1 hour);
# 日期增加1天
select date_add(now(), INTERVAL 1 day);
# 其他间隔
YEAR、MONTH、DAY、HOUR、MINUTE、SECOND
以下较全的MySQL日期函数加示例可做参考(原文链接:https://blog.csdn.net/qinshijangshan/article/details/72874667
— MySQL日期时间处理函数
— 当前日期:2017-05-12(突然发现今天512,是不是会拉防空警报)
SELECT NOW() FROM DUAL;– 当前日期时间:2017-05-12 11:41:47
— 在MySQL里也存在和Oracle里类似的dual虚拟表:官方声明纯粹是为了满足select … from…这一习惯问题,mysql会忽略对该表的引用。
— 那么MySQL中就不用DUAL了吧。
SELECT NOW();– 当前日期时间:2017-05-12 11:41:55
— 除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数:
SELECT CURRENT_TIMESTAMP();– 2017-05-15 10:19:31
SELECT CURRENT_TIMESTAMP;– 2017-05-15 10:19:51
SELECT LOCALTIME();– 2017-05-15 10:20:00
SELECT LOCALTIME;– 2017-05-15 10:20:10
SELECT LOCALTIMESTAMP();– 2017-05-15 10:20:21(v4.0.6)
SELECT LOCALTIMESTAMP;– 2017-05-15 10:20:30(v4.0.6)
— 这些日期时间函数,都等同于 now()。鉴于 now() 函数简短易记,建议总是使用 now()来替代上面列出的函数。
SELECT SYSDATE();– 当前日期时间:2017-05-12 11:42:03
— sysdate() 日期时间函数跟 now() 类似,
— 不同之处在于:now() 在执行开始时值就得到了;sysdate() 在函数执行时动态得到值。
— 看下面的例子就明白了:
SELECT NOW(), SLEEP(3), NOW();
SELECT SYSDATE(), SLEEP(3), SYSDATE();
SELECT CURDATE();– 当前日期:2017-05-12
SELECT CURRENT_DATE();– 当前日期:等同于 CURDATE()
SELECT CURRENT_DATE;– 当前日期:等同于 CURDATE()
SELECT CURTIME();– 当前时间:11:42:47
SELECT CURRENT_TIME();– 当前时间:等同于 CURTIME()
SELECT CURRENT_TIME;– 当前时间:等同于 CURTIME()
— 获得当前 UTC 日期时间函数
SELECT UTC_TIMESTAMP(), UTC_DATE(), UTC_TIME()
— MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()
SELECT CURRENT_TIMESTAMP, CURRENT_TIMESTAMP();– 2017-05-15 10:32:21 | 2017-05-15 10:32:21
— MySQL 日期时间 Extract(选取) 函数
SET @dt = ‘2017-05-15 10:37:14.123456’;
SELECT DATE(@dt);– 获取日期:2017-05-15
SELECT TIME(‘2017-05-15 10:37:14.123456’);– 获取时间:10:37:14.123456
SELECT YEAR(‘2017-05-15 10:37:14.123456’);– 获取年份
SELECT MONTH(‘2017-05-15 10:37:14.123456’);– 获取月份
SELECT DAY(‘2017-05-15 10:37:14.123456’);– 获取日
SELECT HOUR(‘2017-05-15 10:37:14.123456’);– 获取时
SELECT MINUTE(‘2017-05-15 10:37:14.123456’);– 获取分
SELECT SECOND(‘2017-05-15 10:37:14.123456’);– 获取秒
SELECT MICROSECOND(‘2017-05-15 10:37:14.123456’);– 获取毫秒
SELECT QUARTER(‘2017-05-15 10:37:14.123456’);– 获取季度
SELECT WEEK(‘2017-05-15 10:37:14.123456’);– 20 (获取周)
SELECT WEEK(‘2017-05-15 10:37:14.123456’, 7);– ****** 测试此函数在MySQL5.6下无效
SELECT WEEKOFYEAR(‘2017-05-15 10:37:14.123456’);– 同week()
SELECT DAYOFYEAR(‘2017-05-15 10:37:14.123456’);– 135 (日期在年度中第几天)
SELECT DAYOFMONTH(‘2017-05-15 10:37:14.123456’);– 5 (日期在月度中第几天)
SELECT DAYOFWEEK(‘2017-05-15 10:37:14.123456’);– 2 (日期在周中第几天;周日为第一天)
SELECT WEEKDAY(‘2017-05-15 10:37:14.123456’);– 0
SELECT WEEKDAY(‘2017-05-21 10:37:14.123456’);– 6(与dayofweek()都表示日期在周的第几天,只是参考标准不同,weekday()周一为第0天,周日为第6天)
SELECT YEARWEEK(‘2017-05-15 10:37:14.123456’);– 201720(年和周)
SELECT EXTRACT(YEAR FROM ‘2017-05-15 10:37:14.123456’);
SELECT EXTRACT(MONTH FROM ‘2017-05-15 10:37:14.123456’);
SELECT EXTRACT(DAY FROM ‘2017-05-15 10:37:14.123456’);
SELECT EXTRACT(HOUR FROM ‘2017-05-15 10:37:14.123456’);
SELECT EXTRACT(MINUTE FROM ‘2017-05-15 10:37:14.123456’);
SELECT EXTRACT(SECOND FROM ‘2017-05-15 10:37:14.123456’);
SELECT EXTRACT(MICROSECOND FROM ‘2017-05-15 10:37:14.123456’);
SELECT EXTRACT(QUARTER FROM ‘2017-05-15 10:37:14.123456’);
SELECT EXTRACT(WEEK FROM ‘2017-05-15 10:37:14.123456’);
SELECT EXTRACT(YEAR_MONTH FROM ‘2017-05-15 10:37:14.123456’);
SELECT EXTRACT(DAY_HOUR FROM ‘2017-05-15 10:37:14.123456’);
SELECT EXTRACT(DAY_MINUTE FROM ‘2017-05-15 10:37:14.123456’);– 151037(日时分)
SELECT EXTRACT(DAY_SECOND FROM ‘2017-05-15 10:37:14.123456’);– 15103714(日时分秒)
SELECT EXTRACT(DAY_MICROSECOND FROM ‘2017-05-15 10:37:14.123456’);– 15103714123456(日时分秒毫秒)
SELECT EXTRACT(HOUR_MINUTE FROM ‘2017-05-15 10:37:14.123456’);– 1037(时分)
SELECT EXTRACT(HOUR_SECOND FROM ‘2017-05-15 10:37:14.123456’);– 103714(时分秒)
SELECT EXTRACT(HOUR_MICROSECOND FROM ‘2017-05-15 10:37:14.123456’);– 103714123456(日时分秒毫秒)
SELECT EXTRACT(MINUTE_SECOND FROM ‘2017-05-15 10:37:14.123456’);– 3714(分秒)
SELECT EXTRACT(MINUTE_MICROSECOND FROM ‘2017-05-15 10:37:14.123456’);– 3714123456(分秒毫秒)
SELECT EXTRACT(SECOND_MICROSECOND FROM ‘2017-05-15 10:37:14.123456’);– 14123456(秒毫秒)
— MySQL Extract() 函数除了没有date(),time() 的功能外,其他功能一应具全。
— 并且还具有选取‘day_microsecond’ 等功能。
— 注意这里不是只选取 day 和 microsecond,而是从日期的 day 部分一直选取到 microsecond 部分。
SELECT DAYNAME(‘2017-05-15 10:37:14.123456’);– Monday(返回英文星期)
SELECT MONTHNAME(‘2017-05-15 10:37:14.123456’);– May(返回英文月份)
SELECT LAST_DAY(‘2016-02-01’);– 2016-02-29 (返回月份中最后一天)
SELECT LAST_DAY(‘2016-05-01’);– 2016-05-31
— DATE_ADD(date,INTERVAL expr type) 从日期加上指定的时间间隔
— type参数可参考:http://www.w3school.com.cn/sql/func_date_sub.asp
SELECT DATE_ADD(‘2017-05-15 10:37:14.123456’,INTERVAL 1 YEAR);– 表示:2018-05-15 10:37:14.123456
SELECT DATE_ADD(‘2017-05-15 10:37:14.123456’,INTERVAL 1 QUARTER);– 表示:2017-08-15 10:37:14.123456
SELECT DATE_ADD(‘2017-05-15 10:37:14.123456’,INTERVAL 1 MONTH);– 表示:2017-06-15 10:37:14.123456
SELECT DATE_ADD(‘2017-05-15 10:37:14.123456’,INTERVAL 1 WEEK);– 表示:2017-05-22 10:37:14.123456
SELECT DATE_ADD(‘2017-05-15 10:37:14.123456’,INTERVAL 1 DAY);– 表示:2017-05-16 10:37:14.123456
SELECT DATE_ADD(‘2017-05-15 10:37:14.123456’,INTERVAL 1 HOUR);– 表示:2017-05-15 11:37:14.123456
SELECT DATE_ADD(‘2017-05-15 10:37:14.123456’,INTERVAL 1 MINUTE);– 表示:2017-05-15 10:38:14.123456
SELECT DATE_ADD(‘2017-05-15 10:37:14.123456’,INTERVAL 1 SECOND);– 表示:2017-05-15 10:37:15.123456
SELECT DATE_ADD(‘2017-05-15 10:37:14.123456’,INTERVAL 1 MICROSECOND);– 表示:2017-05-15 10:37:14.123457
— DATE_SUB(date,INTERVAL expr type) 从日期减去指定的时间间隔
SELECT DATE_SUB(‘2017-05-15 10:37:14.123456’,INTERVAL 1 YEAR);– 表示:2016-05-15 10:37:14.123456
SELECT DATE_SUB(‘2017-05-15 10:37:14.123456’,INTERVAL 1 QUARTER);– 表示:2017-02-15 10:37:14.123456
SELECT DATE_SUB(‘2017-05-15 10:37:14.123456’,INTERVAL 1 MONTH);– 表示:2017-04-15 10:37:14.123456
SELECT DATE_SUB(‘2017-05-15 10:37:14.123456’,INTERVAL 1 WEEK);– 表示:2017-05-08 10:37:14.123456
SELECT DATE_SUB(‘2017-05-15 10:37:14.123456’,INTERVAL 1 DAY);– 表示:2017-05-14 10:37:14.123456
SELECT DATE_SUB(‘2017-05-15 10:37:14.123456’,INTERVAL 1 HOUR);– 表示:2017-05-15 09:37:14.123456
SELECT DATE_SUB(‘2017-05-15 10:37:14.123456’,INTERVAL 1 MINUTE);– 表示:2017-05-15 10:36:14.123456
SELECT DATE_SUB(‘2017-05-15 10:37:14.123456’,INTERVAL 1 SECOND);– 表示:2017-05-15 10:37:13.123456
SELECT DATE_SUB(‘2017-05-15 10:37:14.123456’,INTERVAL 1 MICROSECOND);– 表示:2017-05-15 10:37:14.123455
— 经特殊日期测试,DATE_SUB(date,INTERVAL expr type)可放心使用
SELECT DATE_SUB(CURDATE(),INTERVAL 1 DAY);– 前一天:2017-05-11
SELECT DATE_SUB(CURDATE(),INTERVAL -1 DAY);– 后一天:2017-05-13
SELECT DATE_SUB(CURDATE(),INTERVAL 1 MONTH);– 一个月前日期:2017-04-12
SELECT DATE_SUB(CURDATE(),INTERVAL -1 MONTH);– 一个月后日期:2017-06-12
SELECT DATE_SUB(CURDATE(),INTERVAL 1 YEAR);– 一年前日期:2016-05-12
SELECT DATE_SUB(CURDATE(),INTERVAL -1 YEAR);– 一年后日期:20178-06-12
— MySQL date_sub() 日期时间函数 和 date_add() 用法一致,并且可以用INTERNAL -1 xxx的形式互换使用;
— 另外,MySQL 中还有两个函数 subdate(), subtime(),建议,用 date_sub() 来替代。
— MySQL 另类日期函数:period_add(P,N), period_diff(P1,P2)
— 函数参数“P” 的格式为“YYYYMM” 或者 “YYMM”,第二个参数“N” 表示增加或减去 N month(月)。
— MySQL period_add(P,N):日期加/减去N月。
SELECT PERIOD_ADD(201705,2), PERIOD_ADD(201705,-2);– 201707 20170503
— period_diff(P1,P2):日期 P1-P2,返回 N 个月。
SELECT PERIOD_DIFF(201706, 201703);–
— datediff(date1,date2):两个日期相减 date1 – date2,返回天数
SELECT DATEDIFF(‘2017-06-05′,’2017-05-29’);– 7
— TIMEDIFF(time1,time2):两个日期相减 time1 – time2,返回 TIME 差值
SELECT TIMEDIFF(‘2017-06-05 19:28:37’, ‘2017-06-05 17:00:00’);– 02:28:37
— MySQL日期转换函数
SELECT TIME_TO_SEC(’01:00:05′); — 3605
SELECT SEC_TO_TIME(3605);– 01:00:05
— MySQL (日期、天数)转换函数:to_days(date), from_days(days)
SELECT TO_DAYS(‘0000-00-00’); — NULL
SELECT TO_DAYS(‘2017-06-05’); — 736850
SELECT FROM_DAYS(0); — ‘0000-00-00’
SELECT FROM_DAYS(736850); — ‘2017-06-05’
— MySQL Str to Date (字符串转换为日期)函数:str_to_date(str, format)
SELECT STR_TO_DATE(‘06.05.2017 19:40:30’, ‘%m.%d.%Y %H:%i:%s’);– 2017-06-05 19:40:30
SELECT STR_TO_DATE(’06/05/2017′, ‘%m/%d/%Y’); — 2017-06-05
SELECT STR_TO_DATE(‘2017/12/3′,’%Y/%m/%d’) — 2017-12-03
SELECT STR_TO_DATE(’20:09:30′, ‘%h:%i:%s’) — NULL(超过12时的小时用小写h,得到的结果为NULL)
— 日期时间格式化
SELECT DATE_FORMAT(‘2017-05-12 17:03:51’, ‘%Y年%m月%d日 %H时%i分%s秒’);– 2017年05月12日 17时03分51秒(具体需要什么格式的数据根据实际情况来;小写h为12小时制;)
SELECT TIME_FORMAT(‘2017-05-12 17:03:51’, ‘%Y年%m月%d日 %H时%i分%s秒’);– 0000年00月00日 17时03分51秒(time_format()只能用于时间的格式化)
— STR_TO_DATE()和DATE_FORMATE()为互逆操作
— MySQL 获得国家地区时间格式函数:get_format()
— MySQL get_format() 语法:get_format(date|time|datetime, ‘eur’|’usa’|’jis’|’iso’|’internal’
— MySQL get_format() 用法的全部示例:
SELECT GET_FORMAT(DATE,’usa’); — ‘%m.%d.%Y’
SELECT GET_FORMAT(DATE,’jis’); — ‘%Y-%m-%d’
SELECT GET_FORMAT(DATE,’iso’); — ‘%Y-%m-%d’
SELECT GET_FORMAT(DATE,’eur’); — ‘%d.%m.%Y’
SELECT GET_FORMAT(DATE,’internal’); — ‘%Y%m%d’
SELECT GET_FORMAT(DATETIME,’usa’); — ‘%Y-%m-%d %H.%i.%s’
SELECT GET_FORMAT(DATETIME,’jis’); — ‘%Y-%m-%d %H:%i:%s’
SELECT GET_FORMAT(DATETIME,’iso’); — ‘%Y-%m-%d %H:%i:%s’
SELECT GET_FORMAT(DATETIME,’eur’); — ‘%Y-%m-%d %H.%i.%s’
SELECT GET_FORMAT(DATETIME,’internal’); — ‘%Y%m%d%H%i%s’
SELECT GET_FORMAT(TIME,’usa’); — ‘%h:%i:%s %p’
SELECT GET_FORMAT(TIME,’jis’); — ‘%H:%i:%s’
SELECT GET_FORMAT(TIME,’iso’); — ‘%H:%i:%s’
SELECT GET_FORMAT(TIME,’eur’); — ‘%H.%i.%s’
SELECT GET_FORMAT(TIME,’internal’); — ‘%H%i%s’
— MySQL 拼凑日期、时间函数:makdedate(year,dayofyear), maketime(hour,minute,second)
SELECT MAKEDATE(2017,31); — ‘2017-01-31’
SELECT MAKEDATE(2017,32); — ‘2017-02-01’
SELECT MAKETIME(19,52,35); — ’19:52:35′
— MySQL 时区(timezone)转换函数:convert_tz(dt,from_tz,to_tz)
SELECT CONVERT_TZ(‘2017-06-05 19:54:12’, ‘+08:00’, ‘+00:00’); — 2017-06-05 11:54:12
— MySQL (Unix 时间戳、日期)转换函数
— unix_timestamp(), unix_timestamp(date), from_unixtime(unix_timestamp), from_unixtime(unix_timestamp,format)
— 将具体时间时间转为timestamp
SELECT UNIX_TIMESTAMP();– 当前时间的时间戳:1494815779
SELECT UNIX_TIMESTAMP(‘2017-05-15’);– 指定日期的时间戳:1494777600
SELECT UNIX_TIMESTAMP(‘2017-05-15 10:37:14’);– 指定日期时间的时间戳:1494815834
— 将时间戳转为具体时间
SELECT FROM_UNIXTIME(1494815834);– 2017-05-15 10:37:14
SELECT FROM_UNIXTIME(1494815834, ‘%Y年%m月%d日 %h时%分:%s秒’);– 获取时间戳对应的格式化日期时间
— MySQL 时间戳(timestamp)转换、增、减函数
SELECT TIMESTAMP(‘2017-05-15’);– 2017-05-15 00:00:00
SELECT TIMESTAMP(‘2017-05-15 08:12:25′, ’01:01:01’);– 2017-05-15 09:13:26
SELECT DATE_ADD(‘2017-05-15 08:12:25’, INTERVAL 1 DAY);– 2017-05-16 08:12:25
SELECT TIMESTAMPADD(DAY, 1, ‘2017-05-15 08:12:25’);– 2017-05-16 08:12:25; MySQL timestampadd() 函数类似于 date_add()。
SELECT TIMESTAMPDIFF(YEAR, ‘2017-06-01’, ‘2016-05-15’);– -1
SELECT TIMESTAMPDIFF(MONTH, ‘2017-06-01’, ‘2016-06-15’);– -11
SELECT TIMESTAMPDIFF(DAY, ‘2017-06-01’, ‘2016-06-15’);– -351
SELECT TIMESTAMPDIFF(HOUR, ‘2017-06-01 08:12:25’, ‘2016-06-15 00:00:00’);– -8432
SELECT TIMESTAMPDIFF(MINUTE, ‘2017-06-01 08:12:25’, ‘2016-06-15 00:00:00’);– -505932
SELECT TIMESTAMPDIFF(SECOND, ‘2017-06-01 08:12:25’, ‘2016-06-15 00:00:00’);– -30355945
SQL中日期的表示方法及有效范围,如下:
日期部分 | 缩写 | 值 | 日期部分 | 缩写 | 值 |
年 | yy | 1753-9999 | 周 | wk | 1-53 |
季度 | 1-4 | 小时 | hh | 0-23 | |
月 | mm | 1-12 | 分钟 | mi | 0-59 |
一年中的天 | dy | 1-366 | 秒 | ss | 0-59 |
一月中的天 | dd | 1-31 | 毫秒 | ms | 0-999 |
一周中的天 | dw | 1-7 |
五、转换函数
1、下列两个函数用于将(任何类型的)值转换为指定的数据类型。
CONVERT(data_type[(length)], expression [, style])
expression – 要转换的表达式。
datatype – 要将表达式转换为的数据类型。
format – 可选-指定日期和时间格式的整数代码,用于在日期/时间/时间戳数据类型和字符数据类型之间进行转换。
CAST(expression AS datatype(length))
expression – 要转换的表达式。
datatype – 要将表达式转换为的数据类型。
length – 可选。结果数据类型的长度(对于 char、varchar、nchar、nvarchar、binary 和 varbinary)
CAST 和 CONVERT 提供相似的功能,但语法不同。在时间转化中一般用convert,因为它比cast多了一个style,可以根据需要转化成不同的时间格式。
2、日期相关的转换函数
# 转换日期格式:
DATE_FORMAT(date, format)
select DATE_FORMAT(now(),’%Y-%m-%d %H:%i:%s’);
select DATE_FORMAT(now(),’%Y-%m-%d %H:00:00′);
#字符串转日期格式
str_to_date(date, format)
select str_to_date(‘2021-04-02 10:37:14’, ‘%Y-%m-%d %H:%i:%s’); # 2021-04-02 10:37:14
3、其他
FORMAT(column_name,format) 用于对字段的显示进行格式化。
INET_ATON(ip) 返回IP地址的数字表示。
INET_NTOA(num) 返回数字所代表的IP地址。
六、系统函数
用于返回元数据或相关配置设置。
COALESCE(expr1,expr2, xprN) 返回第一个非NULL表达式。
COL_LENGTH(‘table_name’,’column_name’) 返回列的长度。
COL_NAME(table_id,column_id) 返回指定的表中的列名。
DATALENGTH(‘expr’) 返回任何数据类型的实际长度。
DB_ID([‘database_name’]) 返回数据库的标识号。
DB_NAME([database_id]) 返回数据库的名称。
GETANSINULL([‘database_name’]) 返回数据库的默认空性(Nullability)。
HOST_ID() 返回工作站的标识号。
HOST_NAME() 返回工作站的名称。
IDENT_INCR(‘table_or_view’) 有新的记录添加入到表中时计数加。
IDENT_SEED(‘table_or_view’) 返回标识列的起始编号。
INDEX_COL(‘table_name’,index_id,key_id) 返回索引的列名。
ISNULL(expr,value) 使用指定的值替换的NULL表达式。
NULLIF(expr1,expr2) Expr1与Expr2相等时,返回Null。
OBJECT_ID(‘obj_name’) 返回数据库对象标识号。
OBJECT_NAME(‘object_id’) 返回数据库对象名。
STATS_DATE(table_id,index_id) 返回上次更新指定索引的统计的日期。
SUSER_SID([‘login_name’]) 返回用户的登录标识号。
SUSER_ID([‘login_name’]) 返回用户的登录标识号。这个函数类似于SUSER_SID()函数,并且保留了向后的兼容性。
SUSER_SNAME([server_user_id]) 返回用户的登录标识号。
SUSER_NAME([server_user_id]) 返回用户的登录标识号。这个函数类似于SUSER_SNAME()函数,并且保留了向后的兼容性。
USER_ID(‘user_name’) 返回用户的数据库标识号。
USER_NAME([‘user_id’]) 返回用户的数据库名称。
七、条件函数
条件函数有两类,一类是CASE(),另一类是IF()。
1、CASE()
case()函数有两种形式,分为简单型和搜索型
简单搜索:
CASE V0
WHEN V1 THEN E1
WHEN V2 THEN E2
WHEN VN THEN EN
ELSE ED
END;
复杂搜索:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
WHEN conditionN THEN resultN
ELSE result
END;
简单的case表达式没有搜索型case表达式灵活,因为无法指定自己的条件,而搜索型case表达式可以包含范围条件、不等条件、使用and/or/not组合多个条件,所以,除最简单的逻辑之外,一般推荐使用搜索型case表达式。
2、IF()
IF(condition, value_if_true, value_if_false)
condition — 要进行判断的值
value_if_true — condition为真时返回的值
value_if_false — condition为假时返回的值
IF()函数还衍生出了IFNULL()、NULLIF()函数。
八、加密函数
AES_ENCRYPT(str,key) 返回用密钥key对字符串str利用高级加密标准算法加密后的结果,调用AES_ENCRYPT的结果是一个二进制字符串,以BLOB类型存储
AES_DECRYPT(str,key) 返回用密钥key对字符串str利用高级加密标准算法解密后的结果
DECODE(str,key) 使用key作为密钥解密加密字符串str
ENCRYPT(str,salt) 使用UNIXcrypt()函数,用关键词salt(一个可以惟一确定口令的字符串,就像钥匙一样)加密字符串str
ENCODE(str,key) 使用key作为密钥加密字符串str,调用ENCODE()的结果是一个二进制字符串,它以BLOB类型存储
MD5() 计算字符串str的MD5校验和
PASSWORD(str) 返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。
SHA() 计算字符串str的安全散列算法(SHA)校验和