首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
9.1 基本查询语句
9.2 单表查询
9.2.1 查询所有字段
9.2.2 查询指定字段
9.2.3 查询指定数据
9.2.4 带关键字IN的查询
9.2.5 带关键字BETWEEN AND的范围查询
9.2.6 带LIKE的字符匹配查询
9.2.7 用IS NULL关键字查询空值
9.2.8 带AND的多条件查询
9.2.9 带OR的多条件查询
9.2.10 用DISTINCT关键字去除结果中的重复行
9.2.11 用ORDER BY关键字对查询结果进行排序
9.2.12 用GROUP BY关键字分组查询
9.2.13 用LIMIT限制查询结果的数量
9.3 聚合函数查询
9.3.1 COUNT()统计函数
9.3.2 SUM()求和函数
9.3.3 AVG()平均数函数
9.3.4 MAX()最大值函数
9.3.5 MIN()最小值函数
9.4 连接查询
9.4.1 内连接查询
9.4.2 外连接查询
9.4.3 复合条件连接查询
9.5 子查询
9.5.1 带IN关键字的子查询
9.5.2 带比较运算符的子查询
9.5.3 带EXISTS关键字的子查询
9.5.4 带ANY关键字的子查询
9.5.5 带ALL关键字的子查询
9.6 合并查询结果
9.7 定义表和字段的别名
9.7.1 为表取别名
9.7.2 为字段取别名
9.8 使用正则表达式查询
9.8.1 匹配指定字符中的任意一个
9.8.2 使用“*”和“ ”来匹配多个字符
9.8.3 匹配以指定的字符开头和结束的记录
10.1 MySQL函数
10.2 数学函数
10.2.1 ABS(x)绝对值函数
10.2.2 FLOOR(x)向下取整函数
10.2.3 RAND()随机数函数
10.2.4 PI()圆周率函数
10.2.5 TRUNCATE(x,y)截断函数
10.2.6 ROUND(x)近似值函数和ROUND(x,y)四舍五入函数
10.2.7 SQRT(x)平方函数
10.3 字符串函数
10.3.1 INSERT(s1,x,len,s2)替换函数
10.3.2 UPPER(s)函数和UCASE(s)字母大写函数
10.3.3 LEFT(s,n)取左函数
10.3.4 RTRIM(s)去空格函数
10.3.5 SUBSTRING(s,n,len)截取函数
10.3.6 REVERSE(s)反转函数
10.3.7 FIELD(s,s1,s2,…,sn)位置函数
10.3.8 LOCATE(s1,s)、POSITION(s1 IN s)和INSTR(s,s1)3个位置函数
10.4 日期和时间函数
10.4.1 CURDATE()和CURRENT_DATE()当前日期函数
10.4.2 CURTIME()和CURRENT_TIME()当前时间函数
10.4.3 NOW()当前日期和时间函数
10.4.4 DATEDIFF(d1,d2)间隔天数函数
10.4.5 ADDDATE(d,n)日期计算函数
10.4.6 ADDDATE(d,INTERVAL expr type)日期时间计算函数
10.4.7 SUBDATE(d,n)日期计算函数
10.5 条件判断函数
10.6 系统信息函数
10.6.1 获取MySQL版本号、连接数和数据库名的函数
10.6.2 获取用户名的函数
10.6.3 获取字符串的字符集和排序方式的函数
10.7.1 格式化函数FORMAT(x,n)
10.7.2 改变字符集的函数
10.7.3 改变字段数据类型的函数
当前位置:
首页>>
技术小册>>
MySQL从入门到精通(三)
小册名称:MySQL从入门到精通(三)
### 10.3.5 SUBSTRING(s,n,len)截取函数 在MySQL数据库中,`SUBSTRING`函数是一个极其强大且灵活的工具,它允许你从字符串中截取任意长度的子字符串。这个函数在处理文本数据时尤为重要,无论是数据清洗、数据格式化,还是简单的字符串操作,`SUBSTRING`都能发挥关键作用。在本章中,我们将深入探讨`SUBSTRING(s,n,len)`函数的用法、语法规则、实际应用场景以及一些高级技巧。 #### 10.3.5.1 语法解析 `SUBSTRING`函数的基本语法如下: ```sql SUBSTRING(s, n, len) ``` - **s**:源字符串,即你想要从中截取子字符串的原始字符串。 - **n**:起始位置,指定从源字符串中的哪个位置开始截取。注意,MySQL中的位置计数从1开始,与某些编程语言(如Python,其位置计数从0开始)不同。 - **len**(可选):要截取的长度。如果省略此参数,`SUBSTRING`将从起始位置`n`一直截取到源字符串的末尾。 #### 10.3.5.2 基本用法示例 ##### 示例1:截取固定长度的子字符串 假设我们有一个包含用户电子邮件的表`users`,字段名为`email`,我们想要获取每个电子邮件地址的域名部分(即`@`符号之后的部分)。由于域名的长度不固定,但我们可以假设它不会超过某个长度(例如100字符),我们可以使用`SUBSTRING`结合`LOCATE`(查找子字符串位置的函数)来实现: ```sql SELECT email, SUBSTRING(email, LOCATE('@', email) + 1, 100) AS domain FROM users; ``` 这里,`LOCATE('@', email)`找到`@`符号在`email`字段中的位置,然后`SUBSTRING`从这个位置之后开始截取,直到字符串末尾(或者达到指定的长度100,但在这个例子中,由于指定了足够的长度,实际上它会截取到字符串末尾)。 ##### 示例2:截取从特定位置开始的子字符串 如果我们只想获取用户名的第一部分(即`@`符号之前的部分),并且假设用户名不会超过某个固定长度,我们可以直接指定起始位置和长度: ```sql SELECT email, SUBSTRING(email, 1, LOCATE('@', email) - 1) AS username FROM users; ``` 这里,`SUBSTRING`从第1个字符开始截取,直到`@`符号之前的位置(通过`LOCATE('@', email) - 1`计算得出)。 #### 10.3.5.3 实际应用场景 ##### 场景1:格式化电话号码 在存储电话号码时,可能出于隐私保护或格式统一的需要,我们需要对电话号码进行格式化。比如,将全数字格式的电话号码转换为带分隔符(如短横线或空格)的格式。使用`SUBSTRING`结合`CONCAT`(连接字符串的函数)可以轻松实现: ```sql SELECT phone, CONCAT(SUBSTRING(phone, 1, 3), '-', SUBSTRING(phone, 4, 3), '-', SUBSTRING(phone, 7, 4)) AS formatted_phone FROM contacts; ``` 这个查询将电话号码分为三部分,每部分之间用短横线分隔。 ##### 场景2:提取日期部分 在处理包含日期的字符串时,`SUBSTRING`同样有用。假设有一个字段存储的日期格式为`YYYYMMDD`,我们需要将其转换为`YYYY-MM-DD`的格式: ```sql SELECT date_str, CONCAT( SUBSTRING(date_str, 1, 4), '-', SUBSTRING(date_str, 5, 2), '-', SUBSTRING(date_str, 7, 2) ) AS formatted_date FROM events; ``` 这个查询通过`SUBSTRING`和`CONCAT`将原始日期字符串转换成了更易读的格式。 #### 10.3.5.4 高级技巧与注意事项 - **负值处理**:在MySQL中,如果`n`是负值,`SUBSTRING`函数会将其视为从字符串末尾开始的位置计数。然而,这种行为并不推荐在生产环境中使用,因为它可能导致混淆和不易维护的代码。 - **长度超出源字符串**:如果指定的`len`值超过了从`n`开始到源字符串末尾的剩余长度,`SUBSTRING`会返回从`n`开始到源字符串末尾的所有字符,而不是报错。 - **性能考虑**:虽然`SUBSTRING`函数在处理小规模数据时效率很高,但在处理大量数据时,频繁的字符串操作可能会影响性能。在这种情况下,考虑使用数据库设计或查询优化技术来减少字符串操作的需求。 - **与其他函数的结合使用**:`SUBSTRING`经常与`LOCATE`、`LENGTH`(返回字符串长度的函数)、`CHAR_LENGTH`(返回字符串字符数的函数,考虑多字节字符)等函数结合使用,以实现复杂的字符串处理逻辑。 #### 10.3.5.5 结论 `SUBSTRING(s,n,len)`函数是MySQL中一个非常有用的字符串处理工具,它允许你灵活地从源字符串中截取任意长度的子字符串。通过掌握其语法和用法,你可以轻松处理各种文本数据相关的需求,无论是简单的字符串截取,还是复杂的字符串格式化任务。此外,了解`SUBSTRING`与其他字符串函数的结合使用,将进一步提升你的数据处理能力,帮助你更高效地利用MySQL数据库。
上一篇:
10.3.4 RTRIM(s)去空格函数
下一篇:
10.3.6 REVERSE(s)反转函数
该分类下的相关小册推荐:
MySQL从入门到精通(一)
MySQL必知必会核心内容
MySQL8.0入门与实践
MySQL从入门到精通(四)
MySQL从入门到精通(二)
MySQL必会核心问题
SQL零基础到熟练应用(增删改查)
MySQL 实战 45 讲
MySQL从入门到精通(五)
细说MySQL(零基础到高级应用)