Mysql中SUBSTRING函数的具体使用

 更新时间:2024年07月23日 11:02:59   作者:山茶花开时。  
本文主要介绍了Mysql中SUBSTRING函数的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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,length),则第一个参数为待截取的字符串,第二个参数为截取的起始位置,第三个参数为截取的长度。如果第二个参数为负整数,则为倒数的起始位置

以字符串“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:/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(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 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(SUBSTRING_INDEX(profile,',',-2),',',1)AS age, 
       COUNT(device_id)AS number
FROM user_submit
GROUP BY age;

结果展示

到此这篇关于Mysql中SUBSTRING函数的具体使用的文章就介绍到这了,更多相关Mysql SUBSTRING函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • MySQL字段长度与索引限制问题的原因分析及解决方案

    MySQL字段长度与索引限制问题的原因分析及解决方案

    在数据库开发与维护过程中,字段长度和索引限制是常见的性能与稳定性问题,本文将通过一个实际案例,详细分析 “Data too long for column” 和 “Specified key was too long” 错误的原因,并提供多种解决方案,帮助开发者优化数据库设计,需要的朋友可以参考下
    2025-07-07
  • 使用Canal实现MySQL数据同步的完整指南

    使用Canal实现MySQL数据同步的完整指南

    Canal 是阿里巴巴开源的一个基于 MySQL 数据库增量日志(binlog)解析的组件,本文主要介绍了如何使用Canal实现MySQL数据同步功能,希望对大家有所帮助
    2025-06-06
  • lnmp关闭mysql日志保护硬盘空间的方法

    lnmp关闭mysql日志保护硬盘空间的方法

    这篇文章主要介绍了lnmp关闭mysql日志保护硬盘空间的方法,需要的朋友可以参考下
    2014-02-02
  • mysql中InnoDB事务隔离的记录锁、间隙锁和临键锁

    mysql中InnoDB事务隔离的记录锁、间隙锁和临键锁

    mysql中InnoDB默认的事务隔离级别为可重复读(Repeated Read, RR),我们当下的所有介绍都是基于这个隔离级别为前提的,记录锁锁定索引关联的具体记录,间隙锁锁定间隔,防止间隔中被其他事务插入,临键锁锁定索引记录+间隔,防止幻读
    2023-12-12
  • mysql锁表确认及解除锁表的实现示例

    mysql锁表确认及解除锁表的实现示例

    使用MySQL数据库时,我们可能会遇到数据库表被锁定的情况,本文主要介绍了mysql锁表确认及解除锁表的实现示例, 具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • 一文带你理解MySQL TCL 事务控制

    一文带你理解MySQL TCL 事务控制

    本文主要介绍了MySQL TCL事务控制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • win10下安装mysql8.0.23 及 “服务没有响应控制功能”问题解决办法

    win10下安装mysql8.0.23 及 “服务没有响应控制功能”问题解决办法

    这篇文章主要介绍了win10下安装mysql8.0.23 及 “服务没有响应控制功能”问题解决办法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Oracle 和 mysql的9点区别

    Oracle 和 mysql的9点区别

    这篇文章主要介绍了Oracle 和 mysql的9点区别,需要的朋友可以参考下
    2014-04-04
  • Mysql基础学习之LAG与LEAD开窗函数

    Mysql基础学习之LAG与LEAD开窗函数

    lead和lag是在SQL中用于创建窗口函数的两个常用函数,这篇文章主要给大家介绍了关于Mysql基础学习之LAG与LEAD开窗函数的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • 浅谈mysql可有类似oracle的nvl的函数

    浅谈mysql可有类似oracle的nvl的函数

    下面小编就为大家带来一篇浅谈mysql可有类似oracle的nvl的函数。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02

最新评论