字符串函数
合并字符串函数CONCAT()和CONCAT_WS
1. CONCAT()
函数定义为:CONCAT(S1,S2,...SN)
将传入的参数连接起来返回所合并的字符串类型数据。如果其中一个参数为null,则返回值为null
SELECT CONCAT('my','null'); -- 返回结果为:mynull
SELECT CONCAT('my','s','ql',NULL); -- 返回结果为:NULL
除了可以传入字符串,还可以传入其他类型参数
SELECT CONCAT(CURDATE(),1); -- 返回结果为:当前日期1(例:当前日期为2019-08-01 则 返回结果为 2019-08-011)
-- 有表users,数据如下:
| id | name |
| 1 | haha |
| 2 | NULL |
SELECT CONCAT(u.`name`,'哈哈') FROM users u; -- 返回结果为:haha哈哈 | NULL
2. CONCAT_WS()
CONCAT_WS(SEP,S1,S2,...SN)
和CONCAT()比较:当前函数多了一个表示分割符的SEP参数
SELECT CONCAT_WS(',',1,2); -- 返回结果:1,2
SELECT CONCAT_WS(NULL,1,2); -- 返回结果:NULL
SELECT CONCAT_WS('-',1,NULL,2); -- 返回结果:1-2
注:1. 分隔符为null时,返回结果为null
2. 非分隔符的参数为null时,返回结果会忽略null,返回其他参数且以分隔符进行分隔
使用场景:如果有需要合并字段且需要使用符号来分隔每个字段值时,可以使用CONCAT_WS()函数
3. GROUP_CONCAT()函数
语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。
SELECT GROUP_CONCAT(DISTINCT(t2.`id`)),t2.`t2_name`
FROM tableA t1
LEFT JOIN tableB t2 ON t1.`t1_id` = t2.`id`
WHERE t1.`t1_id` IN (0,8) GROUP BY t2.`t2_name`;
-- 返回t1_id为0和8 且 按t2_name字段值分组的
-- 所有不重复的tableB的id
-- 如果左后查询出来的数据很大时,则需要使用下面的语句,对查询出来的数据加长度
SET group_concat_max_len = 1000;
参考文章:https://baijiahao.baidu.com/s?id=1595349117525189591&wfr=spider&for=pc
比较字符串大小函数
1. STRCMP()
STRCMP(str1,str2)
比较两个字符串的大小,如果参数str1大于str2,则返回结果1;如果str1小于str2,则返回-1;如果str1等于str2,则返回0
SELECT STRCMP('a','a'); -- 返回结果:0
SELECT STRCMP('abc','abd'); -- 返回结果:-1
SELECT STRCMP('ac','abc'); -- 返回结果:1
问题:SELECT STRCMP('A','a'); -- 返回结果:0 可能是因为mysql设置了不区分大小写的原因导致A 和 a相等
注:strcmp()函数是根据ACSII码的值来比较两个字符串的;strcmp()函数首先将s1字符串的第一个字符值减去s2第一个字符,若差值为零则继续比较下去;若差值不为零,则返回差值。
获取字符串长度
1. LENGTH()
LENGTH(str) 获取传入的参数str的长度
SELECT LENGTH('apple'); -- 返回结果:5
SELECT LENGTH('苹果'); -- 返回结果:6 当前使用utf8编码
注:1. utf8字符集编码下,一个汉字是算三个字符,一个数字或字母算一个字符。
2. 其他编码下,一个汉字算两个字符,一个数字或字母算一个字符。
2. CHAR_LENGTH()
CHAR_LENGTH(str) 获取传入的参数str的字符数
SELECT CHAR_LENGTH('apple'); -- 返回结果:5
SELECT CHAR_LENGTH('苹果'); -- 返回结果:2
注:1. 返回值为字符串string或者对应字段长度,长度的单位为字符,一个多字节字符(例如:汉字)算作一个单字符;
2. 不管汉字还是数字或者是字母都算是一个字符;
3. 任何编码下,多字节字符都算是一个字符;
实现字母大小写的转换函数
1. UPPER()
UPPER(s) 将传入的字符串对象s中所有字母全部转换为大写字母
当然除了可以使用UPPER(),还可以用UCASE()函数来转换
SELECT UPPER('hahei'); -- 返回结果:HAHEI
SELECT UCASE('xixi'); -- 返回结果:XIXI
2. LOWER()
LOWER(s) 将传入的字符串对象s中所有字母全部转换为小写字母
哈嘿,当然还可以使用LCASE()函数来转换
SELECT LOWER('Hh'); -- 返回结果:hh
SELECT LCASE('A'); -- 返回结果:a
注:UPPER()和UCASE(),LOWER()和LCASE()没啥区别
查找字符串
1. 返回字符串位置的FIND_IN_SET()函数
FIND_IN_SET(str1,str2) 返回在字符串str2中与str1相匹配的字符串的位置,参数str2中将包含若干个用逗号隔开的字符串
SELECT FIND_IN_SET('hh','hh ,haha,h h,hh,kk,hh');
-- 返回结果:4
2. 返回指定字符串位置的FIELD()函数
FIELD(str,str1,str2....) 返回第一个与字符串str匹配的字符串的位置
SELECT FIELD('hh','hh ','haha','h h','hh','kk','hh');
-- 返回结果:1
3. 返回子字符串相匹配的开始位置
LOCATE(str1,str) 返回参数str中字符串str1的开始位置
POSITION(str1 IN str)
INSTR(str,str1)
SELECT LOCATE('h','12h3'); -- 返回结果:3
SELECT POSITION('k' IN 'klk'); -- 返回结果:1
SELECT INSTR('asdsd','ds'); -- 返回结果:3
4. 返回指定位置的字符串的ELT()函数
ELT(n,str1,str2...) 返回第n个字符串
SELECT ELT(2,'hh','kk','ll'); -- 返回结果:kk
从现有字符串中截取子字符串
1. 从左边或右边截取子字符串
LEFT(str,num) 返回字符串str中的包含前num个字母(从左边数)的字符串
RIGHT(str,num) 返回字符串str中的包含前num个字母(从右边数)的字符串
SELECT LEFT('hahei',2); -- 返回结果:ha
SELECT RIGHT('abc',2); -- 返回结果:bc
2. 截取指定位置和长度子字符串
SUBSTRING(str,num,len) 返回字符串str中的第num个位置开始长度为len的子字符串
SELECT SUBSTRING('substring',4,3); -- 返回结果:str
去除字符串的首尾空格
1. 去除字符串开始处空格
LTRIM(str) 返回去掉开始处左边空格的字符串
SELECT LTRIM(' h h '); -- 返回结果:[h h ] 这里使用中括号括起来,使最后一个空格看的比较清楚
2. 去掉结尾处空格
RTRIM(str) 返回去掉开始处右边空格的字符串
SELECT RTRIM(' h h '); -- 返回结果:[ h h] 这里使用中括号括起来,使第一个空格看的比较清楚
3. 去掉字符串首尾空格
TRIM(str) 返回去掉首尾空格的字符串str
SELECT TRIM(' h h '); -- 返回结构:[h h] 这里使用中括号括起来,使结果看的更清楚
替换字符串
1. INSERT()函数
INSERT(str,pos,len,newstr) 将字符串str中的pos位置开始长度为len的字符串用字符串newstr来替换
SELECT INSERT('abc',2,3,'def'); -- 返回结果:adef
SELECT INSERT('abc',2,1,'def'); -- 返回结果:adefc
SELECT INSERT('abc',4,1,'def'); -- 返回结果:abc
SELECT INSERT('abc',4,1,NULL); -- 返回结果:NULL(不管哪个参数为null,结果都是null)
注:1. 如果参数pos的值超过字符串长度,则返回值为原始字符串str
2. 如果len的长度大于原来字符串(str)中所剩字符串的长度,则从位置pos开始进行全部替换
3. 如果任何一个参数为NULL,则返回值为NULL
2. REPLACE()函数
REPLACE(str,substr,newstr) 将字符串str中的子字符串substr用字符串newstr来替换
SELECT REPLACE('abc','b','ef'); -- 返回结果:aefc
SELECT REPLACE('abc','d','ef'); -- 返回结果:abc
使用日期和时间函数
1. 获取当前日期和时间
NOW(),CURRENT_TIMESTAMP(),LOCALTIME(),SYSDATE()
SELECT NOW(),CURRENT_TIMESTAMP(),LOCALTIME(),SYSDATE(),
SLEEP(2),
NOW(),CURRENT_TIMESTAMP(),LOCALTIME(),SYSDATE();
-- 返回结果(当前时间为2019-09-09 21:25:09):
-- 第一行结果都是 2019-09-09 21:25:09
-- sleep(2) 意为等待2秒
-- 第三行:前三个函数值为2019-09-09 21:25:09 最后一个为2019-09-09 21:25:11
注:CURRENT_TIMESTAMP是NOW的同义词,也就是说两者是相同的
SYSDATE函数返回的是执行到当前函数时的时间,而NOW返回的是执行SQL语句时的时间
2. 获取当前日期
CURRENT_DATE(),CURDATE()
SELECT CURRENT_DATE(),CURDATE();
-- 当前日期2019-09-09,返回结果为:2019-09-09
SELECT CURDATE()+0;
-- 当前日期2019-09-09,返回结果:20190909
3. 通过各种方式显示日期和时间
3.1 通过UNIX方式显示日期和时间
所谓UNIX,是Unix epoch、Unix time,POSIX time或Unix timestamp的缩写,中文为时间戳。根据ISO-8601规范,该方式将显示从1970年1月1日开始所经过的秒数。即一分钟使用UNIX时间戳表示为:60秒,一小时表示为3600秒,一天24小时则为86400秒。
UNIX_TIMESTAMP() 函数返回时间戳格式的时间
FROM_UNIXTIME() 函数将时间戳格式时间转换成普通格式的时间
-- 函数返回时间戳格式的时间
SELECT UNIX_TIMESTAMP('2019-09-09 22:09:00'); -- 返回结果:1568038140
-- 函数将时间戳格式时间转换成普通格式的时间
SELECT FROM_UNIXTIME(1568038140); -- 返回结果:2019-09-09 22:09:00
3.2 通过UTC方式显示日期和时间
UTC是Universal Coordinated Time的缩写,中文为国际协调时间。Mysql提供了两个函数UTC_DATE()和UTC_TIME()来实现日期和时间的UTC格式显示
SELECT UTC_DATE(); -- 返回结果(返回当前日期):2019-09-09
SELECT UTC_TIME(); -- 返回结果:13:15:25 与当前时间相差8小时
注:UTC_TIME()函数返回的时间与当前时间有时区相差
3.3 获取日期和时间各部分值
YEAR() 返回日期中的年份
QUARTER() 返回日期属于第几个季度
MONTH() 返回日期属于第几个月
WEEK() 返回日期属于第几个星期
DAYOFMONTH() 返回日期属于当前月的第几天
HOUR() 返回时间的小时
MINUTE() 返回时间的分钟
SECOND() 返回时间的秒
SELECT YEAR('2019-09-09 21:29:18'), -- 返回结果:2019
QUARTER('2019-09-09 21:29:18'), -- 返回结果:3
MONTH('2019-09-09 21:29:18'), -- 返回结果:9
WEEK('2019-09-09 21:29:18'), -- 返回结果:36
DAYOFMONTH('2019-09-09 21:29:18'), -- 返回结果:9
HOUR('2019-09-09 21:29:18'), -- 返回结果:21
MINUTE('2019-09-09 21:29:18'), -- 返回结果:29
SECOND('2019-09-09 21:29:18'); -- 返回结果:18
4. 计算日期和时间的函数
4.1 DATEDIFF(date1,date2) 返回日期参数date1和date2之间相隔天数
SELECT DATEDIFF('2019-08-05','2019-08-03'); -- 返回结果:2
4.2 与指定日期和时间操作
ADDDATE(date,n) 计算日期参数date加上n天后的日期
SUBDATE(date,n) 计算日期参数date减去n天后的日期
SELECT ADDDATE('2019-09-01',2); -- 返回结果:2019-09-03
SELECT SUBDATE('2019-09-01',2); -- 返回结果:2019-08-30
SELECT ADDDATE('2019-09-01',INTERVAL 2 DAY); -- 返回结果:2019-09-03
SELECT SUBDATE('2019-09-01',INTERVAL 2 DAY); -- 返回结果:2019-08-30
ADDDATE(d,INTERVAL,expr type) 返回日期参数d加上一段时间后的日期,表达式参数expr决定了时间的长度,参数type决定了所操作的对象
SUBDATE(d,INTERVAL,expr type) 返回日期参数d减去一段时间后的日期,表达式参数expr决定了时间的长度,参数type决定了所操作的对象
这里type的取值:
type 含义 expr表达式
YEAR 年 YY
MONTH 月 MM
DAY 日 DD
HOUR 小时 hh
MINUTE 分钟 mm
SECOND 秒 ss
YEAR_MONTH 年和月 YY与MM之间用任意符号隔开
DAY_HOUR 日和小时 DD与hh之间用任意符号隔开
DAY_MINUTE 日和分钟 DD与mm之间用任意符号隔开
DAY_SECOND 日和秒 DD与ss之间用任意符号隔开
HOUR_MINUTE 小时和分钟 hh与mm之间用任意符号隔开
HOUR_SECOND 小时和秒 hh与ss之间用任意符号隔开
MINUTE_SECOND 分钟和秒 mm与ss之间用任意符号隔开
DATE_FORMAT(date,format) 根据参数对date进行格式化
SELECT DATE_FORMAT('2019-09-01 22:23:00','%Y-%m-%d'); -- 返回结果:2019-09-01
SELECT DATE_FORMAT('2019-09-01 22:23:00','%H:%i:%s'); -- 返回结果:22:23:00
SEC_TO_TIME(seconds) 把秒数转化为时间
TIME_TO_SEC(time) 把时间转化为秒数
SELECT SEC_TO_TIME(32400); -- 返回结果:09:00:00
SELECT TIME_TO_SEC('09:00:00'); -- 返回结果:32400
MAKEDATE(year,dayofyear) 根据参数(年份,第多少天)获取日期
SELECT MAKEDATE(2019,2); -- 返回结果:2019年的第二天 2019-01-02
其他函数
SELECT IF(NAME = 'A1',1,0) FROM students;
-- 返回结果:如果name的值为A1,则返回1,否则返回0
SELECT IFNULL(name1,0) FROM students;
-- 返回结果:如果name1的值为null,则返回0,否则返回name1的值
比如有配置项影响了统计结果的时候,可以使用if函数,就不用再去写两个sql了
HEX()函数:返回十六进制值的字符串表示形式。注意:并不是十进制转化为十六进制数,而是转化为字符串
UNHEX() 函数:每对十六进制数字转化为一个字符