首页
技术小册
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从入门到精通(三)
### 第9章 高级查询与优化 #### 9.8 使用正则表达式查询 在MySQL中,正则表达式(Regular Expressions)是一种强大的文本处理工具,允许你基于复杂的模式匹配来搜索、替换或验证字符串。MySQL通过`REGEXP`或`RLIKE`操作符支持正则表达式的使用,这在处理文本数据时尤其有用,如搜索、过滤和验证数据。本章将详细介绍如何在MySQL查询中使用正则表达式,包括其基本语法、常用模式、实例以及性能考虑。 ##### 9.8.1 正则表达式基础 在MySQL中,正则表达式并不直接作为SQL语言的一部分,而是通过`REGEXP`或`RLIKE`操作符与字符串值一起使用。这两个操作符在功能上等价,都可以用来执行正则表达式匹配。正则表达式的基本语法遵循POSIX(Portable Operating System Interface)标准,但也支持一些MySQL特有的扩展。 **基本元字符**: - `.`:匹配任意单个字符(除了换行符)。 - `^`:匹配字符串的开始位置。 - `$`:匹配字符串的结束位置。 - `*`:匹配前面的子表达式零次或多次。 - `+`:匹配前面的子表达式一次或多次。 - `?`:匹配前面的子表达式零次或一次。 - `{n}`:n 是一个非负整数。匹配确定的 n 次。 - `{n,}`:n 是一个非负整数。至少匹配n 次。 - `{n,m}`:m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 - `[xyz]`:字符集合。匹配所包含的任意一个字符。 - `[^xyz]`:负值字符集合。匹配未包含的任意字符。 - `[a-z]`:字符范围。匹配指定范围内的任意字符。 - `\`:转义字符。用于匹配包括特殊字符在内的任意字符。 ##### 9.8.2 使用REGEXP进行搜索 假设你有一个名为`employees`的表,其中包含一个名为`email`的列,你想找出所有以`@example.com`结尾的电子邮件地址。你可以使用如下查询: ```sql SELECT email FROM employees WHERE email REGEXP '@example\\.com$'; ``` 注意,`.`在正则表达式中是特殊字符,用于匹配任意单个字符。因此,如果你想要匹配实际的`.`字符,需要使用反斜杠`\`进行转义。此外,由于`\`在MySQL字符串中也是转义字符,因此你需要使用`\\`来表示正则表达式中的`\`。 ##### 9.8.3 复杂模式匹配 **匹配多种模式**:你可以使用`|`操作符来匹配多个模式中的任意一个。例如,查找以`@example.com`或`@test.com`结尾的电子邮件: ```sql SELECT email FROM employees WHERE email REGEXP '@(example\\.com|test\\.com)$'; ``` **匹配字符集合和范围**:假设你想要找出所有以字母开头,后跟任意数量的字母或数字的电子邮件: ```sql SELECT email FROM employees WHERE email REGEXP '^[a-zA-Z][a-zA-Z0-9]*@'; ``` 这个正则表达式首先匹配一个字母(`[a-zA-Z]`),然后匹配零个或多个字母或数字(`[a-zA-Z0-9]*`),最后以`@`符号开始域名部分。 ##### 9.8.4 性能考虑 虽然正则表达式提供了强大的文本处理能力,但它们可能会对查询性能产生负面影响,尤其是在处理大型数据集时。因为正则表达式匹配通常是逐字符进行的,且可能涉及复杂的回溯算法,这会导致CPU密集型操作。 为了提高性能,你可以考虑以下策略: - **避免在大型数据集上使用复杂的正则表达式**:尽量使用简单的模式,或者通过其他方式(如字符串函数)来预处理数据,以减少正则表达式的工作量。 - **使用索引**:如果可能,尽量通过WHERE子句中的其他条件(这些条件可以利用索引)来减少需要正则表达式匹配的行数。 - **评估替代方案**:在某些情况下,使用LIKE操作符或字符串函数(如`SUBSTRING`、`LOCATE`等)可能更有效率。 ##### 9.8.5 示例与练习 **示例1**:查找所有包含至少一个数字的电子邮件地址。 ```sql SELECT email FROM employees WHERE email REGEXP '[0-9]+'; ``` **示例2**:查找所有用户名部分包含大写字母的电子邮件地址(假设用户名和域名之间以`@`分隔)。 ```sql SELECT email FROM employees WHERE email REGEXP '^[^@]+[A-Z]+[^@]*@'; ``` **练习**: 1. 编写一个查询,找出所有以`a`开头,以`z`结尾,且长度至少为5个字符的电子邮件用户名。 2. 假设有一个`products`表,其中包含一个名为`description`的列,编写一个查询来找出所有描述中包含“special offer”或“discount”的产品。 通过学习和实践正则表达式在MySQL查询中的应用,你将能够更灵活地处理文本数据,提高数据检索的准确性和效率。记住,正则表达式的力量在于其灵活性和表达能力,但也需要谨慎使用,以避免不必要的性能开销。
上一篇:
9.7.2 为字段取别名
下一篇:
9.8.1 匹配指定字符中的任意一个
该分类下的相关小册推荐:
SQL零基础到熟练应用(增删改查)
MySQL8.0入门与实践
MySQL从入门到精通(二)
MySQL必会核心问题
MySQL从入门到精通(一)
MySQL从入门到精通(五)
细说MySQL(零基础到高级应用)
MySQL 实战 45 讲
MySQL从入门到精通(四)