SQL中LIKE模糊查询与REGEXP用法说明

最近在优化WordPress数据库的时候,对一些问题通常都是通过搜索来寻求答案,不过在这期间,大多数的WordPress都用到了模糊查询来进行数据库的操作,现在小觉就其中的LIKE模糊查询与REGEXP各种用法及对特殊字符进行记录。


首先说下LIKE命令都涉及到的通配符:

% 替代一个或多个字符
_ 仅替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist]或者[!charlist] 不在字符列中的任何单一字符


其中搭配以上通配符可以让LIKE命令实现多种技巧:

1、LIKE'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。
2、LIKE'%inger' 将搜索以字母 inger 结尾的所有字符串(如 Ringer、Stringer)。
3、LIKE'%en%' 将搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。
4、LIKE'_heryl' 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl、Sheryl)。
5、LIKE'[CK]ars[eo]n' 将搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。
6、LIKE'[M-Z]inger' 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer)。
7、LIKE'M[^c]%' 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如MacFeather)。


然后是REGEXP命令涉及到的通配符:

“.”匹配任何单个的字符。
一个字符类“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的一个范围,使用一个“-”。“[a-z]”匹配任何小写字母,而“[0-9]”匹配任何数字。
“ *
”匹配零个或多个在它前面的东西。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配的任何数量的数字,而“.*”匹配任何数量的任何东西。
正则表达式是区分大小写的,但是如果你希望,你能使用一个字符类匹配两种写法。例如,“[aA]”匹配小写或大写的“a”而“[a-zA-Z]”匹配两种写法的任何字母。
如果它出现在被测试值的任何地方,模式就匹配(只要他们匹配整个值,SQL模式匹配)。
(直到写到这里,我才发现LIKE和REGEXP之间的区别,说白了就是模糊匹配和完全匹配之间的区别,同时也让小觉明白在一些优化WordPress中的代码中为什么选择REGEXP而不是LIKE,总的来说小觉的目的达到了.)
为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。


其中搭配以上通配符可以让REGEXP命令实现多种技巧:

1、为了找出以“b”开头的名字,使用“^”匹配名字的开始并且“[bB]”匹配小写或大写的“b”:

mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+


2、为了找出以“fy”结尾的名字,使用“$”匹配名字的结尾:

mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+


3、为了找出包含一个“w”的名字,使用“[wW]”匹配小写或大写的“w”:

mysql> SELECT * FROM pet WHERE name REGEXP "[wW]";
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+


好吧,就写到这儿,不来还想继续添加SQL Like
的特殊字符的,但是搞来搞去,小觉自己都看不懂,所以就不写了,毕竟不是专门的数据库管理人员,一些基础的了解下就可以了。

参考页面: http://www.111cn.net/database/mssqlserver/44138.htm


原文链接: http://www.zhugexiaojue.com/note/likeregexp-465.html
### SQL LIKE 模糊查询是否区分大小写 不同类型的数据库管理系统 (DBMS) 对 `LIKE` 运算符处理大小写的方式有所不同。 #### SQLite 中的大小写敏感性 SQLite 数据库对于文本字段,默认情况下是大小写敏感的,但在使用 `LIKE` 进行模糊匹配时却不会考虑字符的大小写差异。为了使 `LIKE` 查询变得大小写敏感,可以在执行实际查询之前通过设置 pragma 参数来改变这一行为: ```sql PRAGMA case_sensitive_like = ON; SELECT * FROM HanziList WHERE Pinyin LIKE 'Q%'; ``` 此操作会使得后续的 `LIKE` 查找遵循严格的字母表顺序比较规则[^1]。 #### MySQL 中实现大小写敏感的模糊查找 在MySQL里,可以通过给定列名加上 `BINARY` 关键字的方法强制让 `LIKE` 表达式变为区分大小写的模式: ```sql SELECT * FROM table_name WHERE BINARY column_name LIKE '%pattern%'; ``` 这种方式能够确保模式字符串中的每一个字符都严格按照其ASCII码值来进行对比[^2]。 #### SQL Server 的解决方案 针对 Microsoft SQL Server 用户而言,当希望启用大小写敏感性的 `LIKE` 语句时,则应该附加特定的语言环境标记到目标属性上,如下所示: ```sql SELECT * FROM TableName WHERE ColumnName LIKE '%Pattern%' COLLATE Chinese_PRC_CS_AS_WS; ``` 这里的 `COLLATE` 子句指定了一个区分大小写的排序规则[^3]。 #### Oracle Database 下的情况 Oracle 默认配置下 `LIKE` 是不区分大小写的;然而,如果确实有必要实施严格的大写字母小写字母区别对待的话,可借助正则表达式的功能并指定 `'i'` 标志位之外的形式完成任务: ```sql SELECT * FROM fbp_glb_element WHERE fiscal_year = 2021 AND MOF_DIV_CODE = '360000000' AND REGEXP_LIKE(ELE_CODE, '^cls$', 'c'); ``` 此处 `'c'` 表明该正则测试将是完全基于大小写的[^4]。 综上所述,虽然标准 SQL 定义并不规定 `LIKE` 应该总是保持大小写不变的行为特性,但各个厂商的产品提供了多种机制让用户可以根据需求调整这种默认设定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值