【MySQL】字符串截取之SUBSTRING_INDEX和【MySQL】字符串四则运算
时间: 2019-05-29来源:OSCHINA
前景提要
「深度学习福利」大神带你进阶工程师,立即查看>>>
substring_index(str,delim,count)
str:要处理的字符串
delim:分隔符
count:计数
例子:str=www.google.com
1.count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容 SELECT SUBSTRING_INDEX('www.google.com','.',1);
结果是:www
SELECT SUBSTRING_INDEX('www.google.com','.',2);
结果是:www.google

2.count是负数,那么就是从右边开始数,第N个分隔符右边的所有内容,如: SELECT SUBSTRING_INDEX('www.google.com','.',-2);
结果为:google.com

如果我呀中间的的google怎么办?
很简单的,两个方向:
从右数第二个分隔符的右边全部,再从左数的第一个分隔符的左边: SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('www.google.com','.',-2),'.',1);
结果为:google

总结:SUBSTRING_INDEX可以理解为java里面按照分隔符使用split进行分组,从所得数组的下标+1处一直到开始算起的位置的所有内容即为最终结果,如果count 不等于0,那么即使 str中没有找到delim分隔,那么返回的结果就是str本身,即只要count!=0,那么返回的最差结果也是str本身(没有找到一个delim分隔符...的情况)
例如:
(1) SELECT SUBSTRING_INDEX('www.google.com','AAA',-1);
和 SELECT SUBSTRING_INDEX('www.google.com','AAA',-99);
两者的结果都为:www.google.com

(2)在项目中利用CONCAT来做字符串合并,发现一个一个有意思的事情, SELECT CONCAT(SUBSTRING_INDEX('www.google.com','.',1),'-','AAAABB')
结果为:www-AAAABB

(3) SELECT CONCAT(SUBSTRING_INDEX('www.google.com','AAA',1),'-','AAAABB')
结果为:www.google.com-AAAABB

(4) SELECT CONCAT(SUBSTRING_INDEX('www.google.com','AAA',1)-1,'-','AAAABB')
结果为:-1-AAAABB

结果咋这样呢?发现Mysql的字符串在参与运算的时候很有意思:
以下内容摘自: https://www.jianshu.com/p/2ab2c0dc3cb5
MYSQL截取函数:
1、从左开始截取字符串
left(str, length)
说明:left(被截取字段,截取长度)
例:select left(content,200) as abstract from my_content_t

2、从右开始截取字符串
right(str, length)
说明:right(被截取字段,截取长度)
例:select right(content,200) as abstract from my_content_t

3、截取字符串
substring(str, pos)
substring(str, pos, length)
说明:substring(被截取字段,从第几位开始截取)
substring(被截取字段,从第几位开始截取,截取长度)
例:select substring(content,5) as abstract from my_content_t
select substring(content,5,200) as abstract from my_content_t
(注:如果位数是负数 如-5 则是从后倒数位数,到字符串结束或截取的长度)

4、按关键字截取字符串
substring_index(str,delim,count)
说明:substring_index(被截取字段,关键字,关键字出现的次数)
例:select substring_index("blog.jb51.net","。",2) as abstract from my_content_t
结果:blog.jb51
(注:如果关键字出现的次数是负数 如-2 则是从后倒数,到字符串结束)
函数简介:
SUBSTRING( str , pos ) , SUBSTRING( str FROM pos ) SUBSTRING( str , pos , len ) , SUBSTRING( str FROM pos FOR len )
不带有 len 参数的格式从字符串 str 返回一个子字符串,起始于位置 pos 。带有 len 参数的格式从字符串 str 返回一个长度同 len 字符相同的子字符串,起始于位置 pos 。 使用 FROM的格式为标准 SQL 语法。也可能对 pos 使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的 pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对 pos 使用一个负值。
mysql之字符串进行运算或大小比较
在mysql当中,字符串类型间进行加减乘除运算的时候,如果字符串以数字开头,则会截取字符串以数字开头的那一部分数字进行运算,如果字符串没将诶有以数字开头数字,那么就只能截取的数值为0,那么进行加减的时候结果都是0,进行乘除的时候结果都是NULL(即如果以字符串开头,则会从数字一直截取到非数字为止;如果不以数字开头,那么取0)
如下几个结果说明问题: mysql> select '1a'+'1b';//字符串分别以1开头,所以运算的时候,分别为1,结果为1+1=2 +-----------+ | '1a'+'1b' | +-----------+ | 2 | +-----------+ 1 row in set, 2 warnings (0.00 sec) mysql> select '2a'-'1b';//字符串分别以2和1开头,所以结果为2-1=1 +-----------+ | '2a'-'1b' | +-----------+ | 1 | +-----------+ 1 row in set, 2 warnings (0.00 sec) mysql> select '1a'/'2b';//字符串分别以1和2开头,所以结果为:1/2=0.5 +-----------+ | '1a'/'2b' | +-----------+ | 0.5 | +-----------+ 1 row in set, 2 warnings (0.00 sec) mysql> select 'a'/'b';//字符串分别以'a'和'b'开头,所以结果为0/0=NULL +---------+ | 'a'/'b' | +---------+ | NULL | +---------+ 1 row in set, 3 warnings (0.00 sec) mysql> select 'a' - 'b';//字符串分别以'a'和'b'开头,结果为0-0=0 +-----------+ | 'a' - 'b' | +-----------+ | 0 | +-----------+ 1 row in set, 2 warnings (0.00 sec) mysql> select 'a' + 'b';//字符串分别以'a'和'b'开头,结果为0+0=0 +-----------+ | 'a' + 'b' | +-----------+ | 0 | +-----------+ 1 row in set, 2 warnings (0.00 sec)
如果一个字符串以数字开头,后面有非数字和数字组合的话,在进行运算的时候,会省略掉非数字和数字组合那一段,也就是只会截取开头的数字 mysql> select '2015-2-1' - '2015-1-1';////字符串分别以'2015'和'2015'开头,结果为2015-2015=2015 +-------------------------+ | '2015-2-1' - '2015-1-1' | +-------------------------+ | 0 | +-------------------------+ 1 row in set, 2 warnings (0.00 sec)
以上相当于2015-2015=0
mysql当字符串进行大小比较的时候 mysql> select '2015-2-1' > '2015-1-1'; +-------------------------+ | '2015-2-1' > '2015-1-1' | +-------------------------+ | 1 | +-------------------------+ 1 row in set (0.00 sec) mysql> select '2015-2-1' < '2015-1-1'; +-------------------------+ | '2015-2-1' < '2015-1-1' | +-------------------------+ | 0 | +-------------------------+ 1 row in set (0.00 sec)
在这里非常奇怪, '2015-2-1' - '2015-1-1' = 0 ,为什么大小比较的时候会有大小之分呢?
原来对于数字与非数字混合的字符串,在进行大小比较的时候,如果两字符串长度相等,那么两字符串就会比较相同位置的字符,比较时若字符是数字,则直接比较,若字符是非数字那么会转换为ascii码进行比较,若在某位置上已经有大小之分,那么就不会再进行比较。 mysql> select '2017-03-20 15:27:49' > '2017-03-20 15:27:48'; +-----------------------------------------------+ | '2017-03-20 15:27:49' > '2017-03-20 15:27:48' | +-----------------------------------------------+ | 1 | +-----------------------------------------------+ 1 row in set (0.00 sec)
看起来像日期的字符串可以用date_format函数提取当中的年月日,看如下: mysql> select date_format('2017/03/20 15:27:49','%Y') 年,date_format('2017/03/20 15:27:49','%c') 月,date_format('2017/03/20 15:27:49','%d') 日; +------+------+------+ | 年 | 月 | 日 | +------+------+------+ | 2017 | 3 | 20 | +------+------+------+ 1 row in set (0.00 sec)
非数字字符在比较大小的时候,就例如: mysql> select 'a' < 'b'; +-----------+ | 'a' < 'b' | +-----------+ | 1 | +-----------+ 1 row in set (0.00 sec)
当中的字母会转成ascii码,再进行比较,以上是单字母字符串比较,如果是多字母数字混合字符串比较呢? mysql> select '1c' > 'bc'; +-------------+ | '1c' > 'bc' | +-------------+ | 0 | +-------------+ 1 row in set (0.00 sec) mysql> select '1yz' > 'abc999'; +------------------+ | '1yz' > 'abc999' | +------------------+ | 0 | +------------------+ 1 row in set (0.00 sec)
其实从上面的结果大概可以猜测得到,为让解释更清晰更有说服力,再看下图: mysql> select ascii('1c'),ascii('bc'); +-------------+-------------+ | ascii('1c') | ascii('bc') | +-------------+-------------+ | 49 | 98 | +-------------+-------------+ 1 row in set (0.00 sec) mysql> select ascii('1yz'),ascii('abc999'); +--------------+-----------------+ | ascii('1yz') | ascii('abc999') | +--------------+-----------------+ | 49 | 97 | +--------------+-----------------+ 1 row in set (0.00 sec)
字符串大小比较的时候,会从左向右将两个字符串第一个不相等的两个字符的ascii码的比较结果作为最终结果
有时候我们需要直接用MySQL的字符串函数截取字符,毕竟用程序截取(如PHP)还得先写个脚本连接数据库之类的,所以在这里做一个记录,希望对大家有用。
MySQL截取字符串函数
1、从左开始截取字符串
left(str, length)
说明:left(被截取字段,截取长度)
例: select left(content,200) as abstract from my_content_t
2、从右开始截取字符串
right(str, length)
说明:right(被截取字段,截取长度)
例: select right(content,200) as abstract from my_content_t
3、截取字符串
substring(str, pos)
substring(str, pos, length)
说明:substring(被截取字段,从第几位开始截取)
substring(被截取字段,从第几位开始截取,截取长度)
例: select substring(content,5) as abstract from my_content_t select substring(content,5,200) as abstract from my_content_t
(注:如果位数是负数 如-5 则是从后倒数位数,到字符串结束或截取的长度)
4、按关键字截取字符串
substring_index(str,delim,count)
说明:substring_index(被截取字段,关键字,关键字出现的次数)
例: select substring_index("blog.jb51.net",".",2) as abstract from my_content_t
结果:blog.jb51

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行