目录
- SUBSTRING函数
- SUBSTRING_INDEX函数
- 扩展练习
SUBSTRING函数
SUBSTRING函数是文本处理函数,可以截取字符串
格式: SUBSTRING(s, start, length)
从字符串s的start位置截取长度为length的子字符串
如果SUBSTRING()函数接收2个参数:SUBSTRING(s,start),则第一个参数为待截取的字符串,第二个参数为截取的起始位置。如果第二个参数为负整数,则为倒数的起始位置
以字符串“abc123”为例
SUBSTRING()函数接收两个参数
操作示例 | 示例结果 |
SELECT SUBSTRING('abc123',2) | bc123 |
SELECT SUBSTRING('abc123',-3) | 123 |
如果SUBSTRING()函数接收3个参数:SUBSTRING(s,start,lengtpythonh),则第一个参数为待截取的字符串,第二个参数为截取的起始位置,第三个参数为截取的长度。如果第二个参数为负整数,则为倒数的起始位置
以字符串“abc123”为例
SUBSTRING()函数接收3个参数
操作示例 | 示例结果 |
SELECT SUBSTRING('abc123',2,3) | bc1 |
SELECT SUBSTRING('abc123',-3,2) | 12 |
习题案例现有一张订单表,order_time字段是精确到秒的字符串格式的时间,需查询并获取每个订单的”年“、”月“、”日“,即衍生出3个新字段
注意:表中的时间是字符串格式的,因此可以使用SUBSTRING()函数提取年、月、日
原始表
查询得到的结果 :
代码 :
-- 建表语句 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') ,('o005','2020-06-18 18:03:43'); -- 查询语句 SELECT * , 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;
SUBSTRING_INDEX函数
格式
SUBSTRING_INDEX(str, delimiter, number)
返回从字符串str的第number个出现的分隔符delimiter之前的子串;如果number是正数,那么就是从左往右数,返回第number个分隔符的左边的全部内容;相反,如果number是负数,那么就是从右边开始数,第number个分隔符右边的所有内容
注意:如果number超过了实际分隔符的个数,则返回实际个数的字符串
参数说明
- str: 待截取的字符串,STRING类型
- delimiter: 分隔符,STRING类型
- number: 指定分隔符位置,INT类型
返回值
返回STRING类型字符串,如果任一输入参数为NULL,则返回NULL
示例
-- 案例1 SELECT SUBSTRING_INDEX('a*b','*',1) -- a -- 案例2 SELECT SUBSTRING_INDEX('a*b','*',-1) -- b -- 案例3 SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('a*b*c*d*e','*',3),'*',-1) -- c -- 案例3可拆解成以下两个步骤 SELECT SUBSTRING_INDEX('a*b*c*d*e','*',3); -- a*b*c SELECT SUBSTRING_INDEX('a*b*c','*',-1) -- c -- 案例4 -- 如果任一输入参数为NULL,则返回NULL SELECT SUBSTRING_INDEX('https://www.google.com', null, 2); SELECT SUBSTRING_INDEX('https://www.google.com', '.', null); SELECT SUBSTRING_INDEX(null, '.', 2); -- 案例5 -- 如果number超过了实际分隔符的个数,则返回实际个数的字符串 -- https://www.google.com SELECT SUBSTRING_INDEX('https://www.google.com', '.', 4);
扩展练习
1.统计每种性别的人数
导入数据
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:/uDkGCROzYrl/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(device_id)AS number FROM user_submit GROUP BY gender;
结果展示
2.提取博客URL中的用户名
导入数据
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表
问题:对于申请参与比赛的用户,blog_url字段中url字符后的字符串为用户个人博客的用户名,现在运营想要编程客栈把用户的个人博客用户字段提取出单独记录为一个新的字段,请取出所需数据
SELECT device_id, SUBSTRING_INDEX(blog_url,'/',-1)AS user_name FROM user_submit;
结果展示
3.截取出年龄
导入数据
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 VALUESphp(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(SUBSTRING_INDEX(profile,',',-2),',',1)AS age, COUNT(device_id)AS number FROM user_submit GROUP BY age;
结果展示
到此这篇关于mysql中SUBSTRING函数的具体使用的文章就介绍到这了,更多相关Mysql SUBSTRING函数内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论