目次
13.2.1 substring函数
1. 概述
2. 使用格式
3. 参数列表
4. 实例练习
13.2.2 substring_index函数
1. 概述
2. 格式
3. 参数阐明
4. 返回值
5. 实例练习1
6. 实例练习2
13.3 牛客练习题
13.2.1 substring函数
1. 概述
substring函数是文本处理函数,可以用来截取字符串
2. 使用格式
格式: SUBSTRING(s, index, len)
从字符串s的index位置截取长度为len的子字符串
3. 参数列表
- 假如SUBSTRING()函数吸收2个参数:SUBSTRING(s,index),则第一个参数为待截取的字符串,第二个参数为截取的起始位置。假如第二个参数为负整数,则为倒数的起始位置
以字符串“abc123”为例(SUBSTRING()函数吸收两个参数)
操纵示例
| 示例结果
| SELECT SUBSTRING('abc123',2)
| bc123
| SELECT SUBSTRING('abc123',-3)
| 123
| 假如SUBSTRING()函数吸收3个参数:SUBSTRING(s,start,length),则第一个参数为待截取的字符串,第二个参数为截取的起始位置,第三个参数为截取的长度。假如第二个参数为负整数,则为倒数的起始位置
以字符串“abc123”为例(SUBSTRING()函数吸收3个参数)
操纵示例
| 示例结果
| SELECT SUBSTRING('abc123',2,3)
| bc1
| SELECT SUBSTRING('abc123',-3,2)
| 12
| 4. 实例练习
建表语句
- -- 建表语句
- DROP TABLE IF EXISTS order_detail;
- CREATE TABLE order_detail(
- order_id VARCHAR(8),
- order_time VARCHAR(32)
- )
- ENGINE = InnoDB
- DEFAULT CHARSET = utf8;
- INSERT INTO
- order_detail (order_id,order_time)
- VALUE ('o001','2020-06-15 09:12:33')
- ,('o002','2020-06-15 13:24:09')
- ,('o003','2020-06-16 10:44:24')
- ,('o004','2020-06-17 08:05:52')
复制代码 order_detail表
问题:现有一张订单表,order_time字段是精确到秒的字符串格式的时间,需查询并获取每个订单的”年“、”月“、”日“,即衍生出3个新字段
注意:表中的时间是字符串格式的,因此可以使用SUBSTRING()函数提取年、月、日
根据示例,你的查询应返回以下结果:
代码:
- select order_id,order_time,
- substring(order_time,1,4) as 'order_year',
- substring(order_time,6,2) as 'order_month',
- substring(order_time,9,2) as 'order_day'
- from order_detail;
复制代码 13.2.2 substring_index函数
1. 概述
substring_index函数用于按照指定分隔符截取字符串
2. 格式
substring_index(str, delimiter, number)
返回从字符串str的第number个出现的分隔符delimiter之前的子串;
假如number是正数,那么就是从左往右数,返回第number个分隔符的左边的全部内容;
相反,假如number是负数,那么就是从右边开始数,第number个分隔符右边的所有内容
注意:假如number超过了实际分隔符的个数,则返回实际个数的字符串
3. 参数阐明
str: 待截取的字符串,string类型
delimiter: 分隔符,string类型
number: 指定分隔符位置,int类型
4. 返回值
返回STRING类型字符串,假如任一输入参数为NULL,则返回NULL
5. 实例练习1
1) 返回从左往右数的第一个出现的*之前的字串
- select substring_index('a*b','*',1);
复制代码 结果:
2)返回从右往左数的第一个*之前的字串
- select substring_index("a*b",'*',-1);
复制代码 结果
3)返回a*b*c*d*e中的c
可分成两步去获取
①返回第三个*出现之前的字串
- select substring_index('a*b*c*d*e','*',3);
复制代码 结果:
②将上面的字串作为参数,获取该字符串从右往左数的第一个*出现前的字串
- select substring_index(substring_index('a*b*c*d*e','*',3),'*',-1);
复制代码 4)假如任一输入参数为null,则返回null
- select substring_index("http:///www.baidu.com",null,2) as str1,
- substring_index("http:///www.baidu.com",'.',null) as str2,
- substring_index("http:///www.baidu.com",'.',2) as str3;
复制代码 结果:
5)假如number超过了实际分隔符的个数,则返回实际个数的字符串
- # http:///www.baidu.com有两个'.'
- select substring_index("http:///www.baidu.com",'.',3);
复制代码 结果:
6. 实例练习2
建表语句
- drop table if exists user_submit;
- CREATE TABLE `user_submit` (
- `id` int NOT NULL,
- `device_id` int NOT NULL,
- `profile` varchar(100) NOT NULL,
- `blog_url` varchar(100) NOT NULL
- );
- INSERT INTO user_submit VALUES(1,2138,'180cm,75kg,27,male','http:/url/bisdgboy777');
- INSERT INTO user_submit VALUES(2,3214,'165cm,45kg,26,female','http:/url/dkittycc');
- INSERT INTO user_submit VALUES(3,6543,'178cm,65kg,25,male','http:/url/tigaer');
- INSERT INTO user_submit VALUES(4,4321,'171cm,55kg,23,female','http:/url/uhsksd');
- INSERT INTO user_submit VALUES(5,2131,'168cm,45kg,22,female','http:/url/sysdney');
复制代码 user_submit表
问题:现在运营举办了一场比赛,收到了一些参赛申请,表数据记载情势如上所示,现在运营想要统计每个性别的用户分别有多少参赛者,请取出相应结果
根据示例,你的查询应返回以下结果:
代码:
- select substring_index(profile,',',-1) as gender,count(*) as num
- from user_submit
- group by gender;
复制代码 13.3 牛客练习题
SQL30 - 统计每种性别的人数
SQL31- 截取出博客URL中的用户名
SQL32 截取出年事
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |