近期一直围绕数据治理分析项目中数据可视化部分进行工作的开展,在从ODS中间库拉取数据到数仓时通常用MySQL函数进行数据的处理,期间接触使用到的函数也是各种各样的,包含字符串处理、日期处理、计算函数等,其中很多函数在数据处理时有着很重要的占比,本文将在项目实施过程中所用到的函数进行梳理和整理,为下次数据分析项目的快速实施打好基石。
MySQL:MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。MySQL是开放源代码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。
字符函数是最常用的的一种函数,在一个具体应用中通常会综合几个甚至几类函数来实现字符串处理。本篇介绍有关字符串处理的函数,例如字符串的拼接,使用指定字符进行拼接,数字的格式化以及字符串的指定字符替换等。
含义:将多个字符串连接成一个字符串,concat(str1, str2,...) 返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
SELECT CONCAT('2019','-','12'); Result:2019-12 |
含义:代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。但是CONCAT_WS()不会忽略任何空字符串。
SELECT CONCAT_WS('-','2019','12','21'); Result:2019-12-21 |
含义:FORMAT函数在mysql中是数据内容格式化的,格式化后得到结果为:***,***,*,并且其具备四舍五入的功能。
SELECT FORMAT(12560.7,2); Result:12,560.70 SELECT FORMAT(12560.78,1); Result:12,560.8 |
含义:将英文字母转换成小写。
SELECT LOWER('AEAI'); Result:aeai |
含义:将英文字母转换成大写。
SELECT UPPER('aeai'); Result:AEAI |
含义:返回具有指定长度的字符串的左边部分。
SELECT LEFT('agileai.com',7); Result:agileai |
含义:返回具有指定长度的字符串的右边部分。
SELECT RIGHT('agileai.com',3); Result:com |
含义:获取字符串长度。
SELECT LENGTH('www.agileai.com'); Result:15 |
含义:去掉字符串中的空格/去掉字符串中指定字符。
SELECT TRIM(' AEAI '); Result:AEAI 含义:去掉字符串左右两边空格 SELECT LTRIM(' AEAI'); Result:AEAI 含义:去掉字符串左空格 SELECT RTRIM(' AEAI '); Result: AEAI 含义:去掉字符串右空格 SELECT TRIM(LEADING 'www.' FROM 'www.agileai.com'); Result:agileai.com 含义:删除指定的首字符 SELECT TRIM(BOTH 's' FROM 'swww.agileai.coms'); Result:www.agileai.com 含义:删除指定的首尾字符 SELECT TRIM(TRAILING '.com' FROM 'www.agileai.com'); Result:www.agileai 含义:删除指定的尾字符 |
含义:替换字符串。
SELECT REPLACE('www-agileai-com','-','.'); Result:www.agileai.com |
含义:截取字符串。
SELECT SUBSTRING('www.agileai.com',5); Result:agileai.com 含义:从字符串第五位开始截取 SELECT SUBSTRING('www.agileai.com',-11); Result:agileai.com 含义:从字符串尾往前截取11位 SELECT SUBSTRING('www.agileai.com',5,11); Result:agileai.com 含义:从第五位字符开始往后截取11位 |
含义:使字符串颠倒顺序。
SELECT REVERSE('moc.iaeliga.www'); Result:www.agileai.com |
数值型函数主要是对数值型数据进行处理,得到我们想要的结果,例如ABS、BIN、CEILING、EXP、FLOOR等,大家可以在实际的数据处理过程中进行尝试,举例如下。
含义:返回x的绝对值。
绝对值:数轴上一个数所对应的点与原点的距离叫做该数绝对值,绝对值只能为非负数。
SELECT ABS(-24); Result:24 |
含义:返回x的二进制。
SELECT BIN('55'); Result:110111 |
含义:返回大于x的最小整数值。
SELECT CEILING('12.3'); Result:13 |
含义:返回值e(自然对数的底)的x次方。
e≈2.71828182845905。
SELECT EXP(2); Result:7.38905609893065 |
含义:返回小于x的最大整数值。
SELECT FLOOR(4.6); Result:4 |
含义:返回集合中最大的值。
SELECT GREATEST(4.6,4,23,66); Result:66 |
含义:返回集合中最小的值。
SELECT LEAST(4.6,4,23,66); Result:4 |
含义:返回x的自然对数。
自然对数:以e为底的对数称自然对数。
SELECT LN(2); Result:0.6931471805599453 |
含义:返回x的以y为底的对数,该函数的单个参数版本将返x的自然对数,如果调用两个参数,它返回X的对数的任意基数B。
SELECT LOG(45); Result:3.8066624897703196 SELECT LOG(2,65536); Result:16 |
含义:返回x/y的余数。
SELECT MOD(10,6); Result:4 |
含义:获取圆周率。
SELECT PI(); Result:3.141593 |
含义:返回0到1内的随机值,可以通过提供一个参数使RAND()随机数生成器生成一个指定的值。
SELECT RAND(); Result:0-1之间随机数 |
含义:返回参数x的四舍五入的有y位小数的值。
SELECT ROUND(25.789,1); Result:25.8 |
含义:返回数字x截短为y位小数的结果。
SELECT TRUNCATE(25.7891233465,4); Result:25.7891 |
本章介绍三种在数据进行筛选时所使用的常用函数,分别是在两个区间之内、内容包含、以及空数据的处理和上述三种反向处理方式,举例如下。
含义:筛选字段参数为某两个区间的数据。
样例:
含义:筛选出在列出值范围内的数据。
样例:
含义:进行NULL判断。
样例为非空判断。
流程控制类函数可以进行条件操作,用来实现SQL的条件逻辑,允许开发者将一些应用程序业务逻辑转换到数据库后台,本文介绍数据的IF判断以及CASE WHEN等操作。
含义:如果结果是真,返回true;否则返回false。
SELECT IF(1>0,TRUE,FALSE); Result:1 SELECT IF(1>0,'TRUE','FALSE'); Result:TRUE |
含义:如果arg1不是空,返回arg1,否则返回arg2。
SELECT IFNULL(NULL,'OK'); Result:OK |
含义:如果arg1=arg2返回NULL,否则返回arg1。
SELECT NULLIF('YES','NO'); Result:YES SELECT NULLIF('8','8'); Result:NULL |
用法:CASE WHEN[test] THEN [result]...ELSE [default] END
SELECT CASE WHEN 1>0 THEN 'TRUE' ELSE 'FALSE' END; Result:TRUE |
解读:当1>0时结果为TRUE反之为FASLE。
用法:CASE [test] WHEN[val1] THEN [result]...ELSE [default]END
SELECT (CASE 'YES' WHEN 'YES' THEN '√' WHEN 'NO' THEN '×' ELSE 'others' END); Result:√ |
解读:对YES字符串进行判定如果等于YES结果为√,如果等于NO结果为×均不等时结果为others。
MySQL对于日期的处理方式相对来讲还是较为全面的,一般情况笔者还是习惯用DATE_FORMAT来进行日期的格式化,但是MySQL里内置了很多有关日期的处理的函数,例如DAY、MONTH、YEAR等,下面笔者对SQL中常用的日期函数进行类举。
含义:获取当前时间时分秒。
select curtime(); Result:14:05:48 |
含义:获取当前系统年月日时间。
SELECT NOW(); Result:2019-12-28 14:02:13 |
含义:获取时间字段的年。
select YEAR(NOW()); Result:2019 |
含义:获取时间字段所在季度。
select QUARTER(NOW()); Result:4 |
含义:获取时间字段所在月份。
select MONTH(NOW()); Result:12 |
含义:获取时间字段所在星期。
select WEEK(NOW()); Result:51 |
含义:获取时间字段所在天。
select DAY(NOW()); Result:28 |
含义:获取时间字段的年月日。
select DATE(NOW()); Result:2019-12-28 |
含义:获取时间字段的时分秒。
select TIME(NOW()); Result:14:18:56 |
含义:获取时间字段所在小时。
select HOUR(NOW()); Result:14 |
含义:获取时间字段所在分钟。
select MINUTE(NOW()); Result:34 |
含义:获取时间字段所在秒。
select SECOND(NOW()); Result:34 |
含义:返回月份中的最后一天。
select LAST_DAY(NOW()); Result:2019-12-31 |
含义:根据日期进行计算。
select date_add(NOW(), interval 1 day); Result:2019-12-29 15:12:22 select date_add(NOW(), interval 1 hour); Result:2019-12-28 16:12:22 select date_add(NOW(), interval 1 minute); Result:2019-12-28 15:13:22 select date_add(NOW(), interval 1 second); Result:2019-12-28 15:12:23 select date_add(NOW(), interval 1 week); Result:2020-01-04 15:12:22 select date_add(NOW(), interval 1 month); Result:2020-01-28 15:12:22 select date_add(NOW(), interval 1 quarter); Result:2020-03-28 15:12:22 select date_add(NOW(), interval 1 year); Result:2020-12-28 15:12:22 select date_add(NOW(), interval -1 day); Result:2019-12-27 15:12:22 |
含义:时间计算,两个日期相减精确到天。
select DATEDIFF('2019-12-28','2019-11-28'); Result:30 select DATEDIFF('2019-11-28','2019-12-28'); Result:-30 |
含义:时间计算,两个日期相减精确到小时。
select TIMEDIFF('2019-12-28 15:12:23','2019-11-28 15:12:22'); Result:720:00:01 |
含义:将字符串转换成时间。
select STR_TO_DATE('2019/12/28','%Y/%m/%d'); Result:2019-12-28 |
含义:将时间转换成字符串。
select DATE_FORMAT(NOW(),'%Y-%m-%d'); Result:2019-12-28 |
聚合函数又称组函数,一般情况下,我们需要的聚合数据(总和、平均数、最大值、最小值)等并不总是存储在表中,但是我们可以通过执行聚合函数来获取它。本文将总结在日常数据操作时常用的相关函数,样例如下。
注意:聚合函数不允许出现嵌套。
含义:统计数据量。
SELECT COUNT(*) FROM personnel; Result:获取personnel表内有多少条数据 |
含义:获取最大值。
SELECT MAX(PER_SORT) FROM personnel; Result:获取PER_SORT字段的最大值 |
含义:获取最小值。
SELECT MIN(PER_SORT) FROM personnel; Result:获取PER_SORT字段的最小值 |
含义:对数据进行汇总求和。
SELECT SUM(PER_SORT) FROM personnel; Result:对PER_SORT字段进行求和 |
含义:求平均值。
SELECT AVG(PER_SORT) FROM personnel; Result:对PER_SORT字段进行求平均值 |
含义:将分组的数据进行展示,该函数返回带有来自一个组的连接的非NULL 值的字符串结果。
SELECT COUNT(PER_STATE), PER_STATE, GROUP_CONCAT(PER_NAME) FROM personnel WHERE 1 = 1 GROUP BY PER_STATE; |
效果展示:
MySQL信息函数主要是对系统信息进行查看例如获取数据库版本号信息、连接ID、获取当前数据库、最后插入记录的ID及当前的用户信息进行查看。
含义:获取当前数据库版本信息。
SELECT VERSION(); Result:5.7.19-log |
含义:获取当前用户信息。
SELECT USER(); Result:root@localhost |
含义:获取当前数据库。
SELECT DATABASE(); Result:aeai_mdm |
含义:获取连接ID。
SELECT CONNECTION_ID(); Result:6 |
含义:自动返回最后一个INSERT或 UPDATE 问询为 AUTO_INCREMENT列设置的第一个 发生的值。。
SELECT LAST_INSERT_ID(); Result:0 |
含义:查看数据库进程。
SHOW PROCESSLIST; |
含义:杀死进程。
KILL PROCESS_ID; |
近期工作一直围绕数据治理分析项目来开展,由于时间原因一直未对SQL函数进行有效梳理与文档输出,导致有部分长时间未使用的函数被遗忘,通过撰写本篇文档再次认识到日常随笔、文档的重要性,文档帮助自己梳理了逻辑,将知识点进行有效积淀,自己的认知也不断的提升,慢慢的发掘文档是自身知识的输出,也渐渐的习惯让文档成为自身知识的备案。