MYSQL-LIKE和REGEXP的区别

使用的数据

mysql> select * from websites;
+----+--------------+---------------------------+-------+---------+
| id | name         | url                       | alexa | country |
+----+--------------+---------------------------+-------+---------+
|  1 | Google       | https://www.google.cm/    |     1 | USA     |
|  2 | 淘宝         | https://www.taobao.com/   |    13 | CN      |
|  3 | 菜鸟教程     | http://www.runoob.com/    |   300 | CN      |
|  4 | 微博         | http://weibo.com/         |    20 | CN      |
|  5 | Facebook     | https://www.facebook.com/ |     3 | USA     |
|  6 | 百度         | www.baidu.com             |   223 | CN      |
+----+--------------+---------------------------+-------+---------+
6 rows in set (0.00 sec)

相同点

like 与 regexp 均默认不区分大小写, 如果要区分, 增加关键字binary.

-- where name like binary '%a%'
-- where name regexp binary '.*a.*'
mysql> select * from websites where name like binary "g%";
Empty set (0.00 sec)
mysql> select * from websites where name like binary "G%";
+----+--------+------------------------+-------+---------+
| id | name   | url                    | alexa | country |
+----+--------+------------------------+-------+---------+
|  1 | Google | https://www.google.cm/ |     1 | USA     |
+----+--------+------------------------+-------+---------+
1 row in set (0.00 sec)

重要区别

like 整个字段匹配表达式成功才返回
regexp 部分字符匹配表达式成功即可返回

差别类似于python中re模块的两个方法
like  --> re.match
regexp --> re.search
-- 下面like匹配表达式只能匹配name字段有且只有字母g的行
mysql> select * from websites where name like binary "g";
Empty set (0.00 sec)
-- 下面regexp匹配表达式能匹配name字段中包含字母g的行
mysql> select * from websites where name regexp binary "g";
+----+--------+------------------------+-------+---------+
| id | name   | url                    | alexa | country |
+----+--------+------------------------+-------+---------+
|  1 | Google | https://www.google.cm/ |     1 | USA     |
+----+--------+------------------------+-------+---------+
1 row in set (0.00 sec)    

/* 如果 regexp 需要匹配整个字段, 最好使用^$
* 比如下面想匹配name为6个字母的行, 期望结果是只显示"Google"* 但实际却把"Facebook"行也匹配出来,因为也满足包含6个字母的表达式.
* /
mysql> select * from websites where name regexp binary "[a-zA-z]{6}";
+----+----------+---------------------------+-------+---------+
| id | name     | url                       | alexa | country |
+----+----------+---------------------------+-------+---------+
|  1 | Google   | https://www.google.cm/    |     1 | USA     |
|  5 | Facebook | https://www.facebook.com/ |     3 | USA     |
+----+----------+---------------------------+-------+---------+
2 rows in set (0.00 sec)
-- 如果只想匹配"Google"行, 按regexp的特性, 则使用"^[a-zA-z]{6}$", 限定整个字段匹配6个字母即可.
mysql> select * from websites where name regexp binary "^[a-zA-z]{6}$";
+----+--------+------------------------+-------+---------+
| id | name   | url                    | alexa | country |
+----+--------+------------------------+-------+---------+
|  1 | Google | https://www.google.cm/ |     1 | USA     |
+----+--------+------------------------+-------+---------+
1 row in set (0.00 sec)

regexp 测试

可以使用 select 语句来测试正则表达式, 匹配返回1, 否则返回0

mysql> select "123" regexp "^\\d{1}$";
+-------------------------+
| "123" regexp "^\\d{1}$" |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set (0.00 sec)

mysql> select "123" regexp "^\\d{1,3}$"; -- 注意 {1,3} 中间如有空格会报错
+---------------------------+
| "123" regexp "^\\d{1,3}$" |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)

regexp 拓展

  1. 如使用反斜杠转义, 则需要使用双反斜杠\\ (mysql解析一个, 正则引擎解析另一个) , 比如表示数字 \\d, 字母 \\w.
  2. 匹配字符类

[:word:] —> 字母、数字或下划线字符 \\w
[:alpha:] —> [a-zA-Z]
[:alnum:] —> [0-9a-zA-Z]
[:blank:] —> 空格或制表符[ \t]
[:digit:] —> \\d
[:lower:] —> [a-z]
[:upper:] —> [A-Z]
[:space:] —> 任意空白字符 \\s
[:xdigit:] —> 16进制字符 [a-fA-F0-9]

### 回答1: MySQL中的LIKE和REGEXP都是用于模式匹配的操作符,但它们有以下区别: 1. LIKE是基于通配符的模式匹配,而REGEXP是基于正则表达式的模式匹配。 2. LIKE只支持通配符%和_,而REGEXP支持更多的正则表达式语法。 3. LIKE比REGEXP更快,因为它不需要解析正则表达式。 4. LIKE适用于简单的模式匹配,而REGEXP适用于更复杂的模式匹配。 5. LIKE不区分大小写,而REGEXP默认区分大小写,但可以使用选项来忽略大小写。 总之,LIKE和REGEXP都有各自的优缺点,应根据具体情况选择使用哪种操作符。 ### 回答2: MySQL是一种流行的关系型数据库管理系统,它支持多种查询语言和表达式。在MySQL中,like和regexp是两种常用的模式匹配工具。它们的主要区别如下: 1. 匹配的精度不同 Like可以支持基于通配符的简单模式匹配,而regexp可以支持更复杂的正则表达式,因此regexp比like的匹配精度更高。 2. 匹配的效率不同 Like的性能相对比较高,因为它只支持简单的模式匹配,而regexp的性能相对较低,因为它支持更复杂的正则表达式。 3. 匹配的功能不同 Like只能支持基于通配符的模式匹配,它支持的通配符有%和_。但regexp可以支持更多的模式匹配,如字符集、重复、位置、子表达式等。 4. 匹配的语法不同 Like的语法比较简单,可以直接用通配符匹配,而regexp需要使用正则表达式进行匹配,需要掌握基本的正则表达式语法。 总结: 在实际应用中,如果只需要进行简单的模式匹配,而且对性能要求较高,那么like是比较好的选择。但如果需要进行复杂的模式匹配,而且对性能要求相对较低,那么就需要使用regexp进行匹配。在实际工作中,合理选择适合的匹配工具,可以提高查询效率和结果精度。 ### 回答3: MySQL是一种流行的关系型数据库管理系统,支持多种查询语句,其中包括like和regexp。两者都是用于搜索文本匹配的功能,但实际上有很大的区别。 第一,like是一种通配符搜索方式,可用于指定字符串模式。你可以使用like来筛选包含特定字符或字符串模式的行,但是这种方式有一定的限制,例如,必须使用%作为任意字符的替代符号。例如,使用'LIKE'%ing'来查找以“ing”结尾的字符串。 与此相反,regexp使用正则表达式来匹配字符串,提供了更多的精细控制。正则表达式是一种模式匹配工具,它使你能够指定更复杂的搜索模式。可以使用正则表达式来匹配字符串的特定模式、字符或文本序列,也可以使用它来搜索某些标记或其他特定规则。 第二,like比regexp更容易理解和编写,而且对于简单的匹配操作,也非常高效。相比之下,regexp可能更加复杂,需要一些初步的学习和理解,但是它提供了更多的控制和灵活性,可以用于处理相当复杂的搜索模式。 总体来说,like是常用的字符串搜索工具,可以轻松处理大多数字符串匹配需求。而regexp则是一种更强大的搜索工具,可以用于匹配更复杂的模式,并提供了更高的精细度和灵活性。当需要进行更复杂的字符串匹配时,regexp是更好的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值