记录regexp与rlike | 计算用户8月每天的练题数量
计算用户8月每天的练题数量
https://www.nowcoder.com/practice/847373e2fe8d47b4a2c294bdb5bda8b6
--regexp运算符 select day(date) as day, count(question_id) as question_cnt from question_practice_detail where date regexp '2021-08' group by day(date);
在MySQL中,REGEXP
和 RLIKE
是两个功能相同的关键字,它们都用于执行正则表达式匹配。这两个关键字可以互换使用,选择哪一个主要取决于个人或团队的编码习惯。以下是对这两个关键字的详细介绍:
基本用法
REGEXP
和 RLIKE
用于在 SELECT
、INSERT
、UPDATE
或 DELETE
语句的 WHERE
子句中,对字符串列进行正则表达式匹配。如果列中的值符合指定的正则表达式模式,则条件为真。
示例
假设有一个名为 employees
的表,其中有一个名为 name
的列。要查找 name
列中包含字母 "a" 的所有行,可以使用以下查询:
SELECT * FROM employees WHERE name REGEXP 'a'; -- 或者 SELECT * FROM employees WHERE name RLIKE 'a';
这两个查询将返回 name
列中包含至少一个字母 "a" 的所有员工记录。
正则表达式模式
MySQL 支持的正则表达式模式与 POSIX 基本正则表达式(BRE)和扩展正则表达式(ERE)有些相似,但也有一些差异。以下是一些常用的正则表达式模式:
.
:匹配任意单个字符。*
:匹配前面的字符零次或多次。+
:匹配前面的字符一次或多次(MySQL 8.0+ 支持)。?
:匹配前面的字符零次或一次(MySQL 8.0+ 支持)。{n}
:匹配前面的字符恰好 n 次(MySQL 8.0+ 支持)。{n,}
:匹配前面的字符至少 n 次(MySQL 8.0+ 支持)。{n,m}
:匹配前面的字符至少 n 次,但不超过 m 次(MySQL 8.0+ 支持)。^
:匹配字符串的开始。$
:匹配字符串的结束。[abc]
:匹配方括号内的任意一个字符。[^abc]
:匹配不在方括号内的任意字符。a|b
:匹配 a 或 b(MySQL 8.0+ 支持)。()
:用于分组(MySQL 8.0+ 支持,并且需要启用正则表达式的扩展功能)。
注意事项
- 在 MySQL 5.7 及更早版本中,
+
、?
、{n}
、{n,}
、{n,m}
和|
等量词和选择操作符是不被支持的。这些功能在 MySQL 8.0 及更高版本中得到了支持,但默认情况下,MySQL 的正则表达式引擎仍然运行在 POSIX 基本正则表达式模式下。要启用扩展正则表达式功能,可以使用REGEXP_LIKE()
函数(在 MySQL 8.0.4 及更高版本中可用),或者通过设置系统变量regexp_stack_limit
和regexp_time_limit
并使用REGEXP
/RLIKE
(这种方法可能需要一些额外的配置和测试)。 - 在使用正则表达式时,要注意转义特殊字符。例如,
.
在正则表达式中是一个特殊字符,表示任意单个字符。如果你想要匹配字面上的点字符,你需要使用\.
。
# 假设你有一个包含文件名的表,名为files,其中有一个列名为filename。 # 你想要查找所有文件名中包含点号(.)的文件记录,比如report.pdf或image.jpg。 SELECT * FROM files WHERE filename REGEXP '.'; # 这个查询将会匹配所有filename列中包含至少一个任意字符的记录, # 因为.在正则表达式中代表任意单个字符。这不是你想要的结果。 # 为了匹配字面上的点号,你需要对点号进行转义,像这样: SELECT * FROM files WHERE filename REGEXP '\.'; /* 然而,这里有一个重要的注意事项:在MySQL字符串中,反斜杠本身也是一个转义字符。因此,当你想要在字符串中表示一个反斜杠时,你需要使用两个反斜杠(\\)来表示一个实际的反斜杠,即'\\.' 但是,在MySQL的正则表达式函数中(如REGEXP或RLIKE),你通常只需要使用一个反斜杠来转义特殊字符,因为MySQL会自动处理字符串中的转义。然而,由于字符串本身的转义规则,你实际上需要在查询中写两个反斜杠。这是一个常见的混淆点。 在实际应用中,最好先在你的环境中测试一下,以确保查询按预期工作。 */
SQL练练练 文章被收录于专栏
记录自己sql的每一步提升!