记录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 用于在 SELECTINSERTUPDATE 或 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的每一步提升!

全部评论

相关推荐

但听说转正率很低,我现在有在实习了,好纠结要不要去
熬夜脱发码农:转正率低归低,但是实习的经历你可以拿着,又不是说秋招不准备了
点赞 评论 收藏
分享
白火同学:大二有这水平很牛了,可以适当对关键信息加粗一点,比如关键技术、性能指标之类的。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务