mysql函数

字符串函数

合并字符串函数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() 函数:每对十六进制数字转化为一个字符

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容