平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“MySQL数据库通配符、正则表达式示例”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
定义: 结合项目来看,用来匹配值的一部分的特殊字符。通配符本身实际时SQL的WHERE子句中有特殊含义的字符,SQL兼容几种通配符。
理解这一步时,为便于在句子中采用通配符,必须采用LIKE操作符。LIKE指示MySQL后跟的搜索模式借助通配符匹配而不是直接相等匹配进行比较。
…
% 表示任何字符出现任意次数。
【例1】:为了找出所有以词 jet 起头的字段。
SELECT prod_id , prod_name from products WHERE prod_name LIKE ‘jet%’;
…
【例2】:表示匹配任何位置包含文本 anvil 的值
SELECT prod_id , prod_name FROM products WHERE prod_name LIKE ‘%anvil%’;
…
【例3】:找出以s起头,以e结尾的所有字段
SELECT prod_name FROM products WHERE prod_name LIKE ‘s%e’;
…
与 % 类似,但仅代表单个字符
举个例子:
SELECT prod_id , prod_name FROM products WHERE prod_name LIKE ‘_ ton anvil';
结果
1 ton anvil
2 ton anvil
如果换成 %
结果
0.55 ton anvil
1 ton anvil
2 ton anvil
【例 1】查询名字为三个字符且中间字符为 “a” 的所有用户:
SELECT * FROM users WHERE name LIKE ‘a’;
…
【例 2】查询名字以 “J” 开头且第二个字符任意的所有用户:
SELECT * FROM users WHERE name LIKE ‘J_’;
功能:用来指定字符集合,代表方括号内的任意一个字符。
【例 1】查询名字第一个字符是 “A”、“B” 或 “C” 的所有用户
SELECT * FROM users WHERE name LIKE ‘[ABC]%’;
…
【例 2】查询名字中包含 “a”、“e” 或 “i” 的所有用户:
SELECT * FROM users WHERE name LIKE ‘%[aei]%’;
功能:在方括号内采用时,表示否定,即匹配不在方括号内的任意一个字符。
【例 1】查询名字第一个字符不是 “A”、“B” 或 “C” 的所有用户:
SELECT * FROM users WHERE name LIKE ‘[^ABC]%’;
【例 1】查询名字中包含字符 “%” 的所有用户:
SELECT * FROM users WHERE name LIKE ‘%%%’;
通配符很有用,但是是有代价的。
通配符搜索的处理一般要比前面讨论的其他搜索花时间更长。
1,不要过度采用通配符。
2,尽量不要把它们用在搜索模式的开始处。
3,仔细注意他通配符的位置
定义:正则表达式是用来匹配文本的特殊的串。
关键字:REGEXP
【例】检索列 prod_name 包含文本 1000 的所有行。
SELECT prod_name FROM products WHERE prod_name REGEXP ‘1000’;
其中 REGEXP ‘1000’ 表示包含 1000 文本。
【注意】: 正则表达式可能会降低性能。
理解这一步时,【例】检索列 prod_name 包含文本 1000 或者 2000 的所有行。
SELECT prod_name FROM products WHERE prod_name REGEXP ‘1000|2000’;
【例】匹配 prod_name 字段文本包含 1 ton 或者 2 ton 或者 3 ton 的所有行
SELECT prod_name FROM products WHERE prod_name REGEXP ‘[123] ton’;
[123] 表示匹配 1 或者 2 或者 3
落到代码里,集合可用来定义要匹配的一个或多个字符。比如,下面的集合要匹配数字 0到9 [0123456789]
为便于简化这种集合,可采用 - 来定义一个范围。如 [0-9]。
不一定是数字,也能够是字母 如 [a-z]
【例】
SELECT prod_name FROM products WHERE prod_name REGEXP ‘[1-5] ton’;
落到代码里,正则表达式语言由具有特定含义的特殊字符构成,我们已经看到 [] | - 等,如果你要匹配这些特殊字符,该怎么做呢?
为便于匹配特殊字符,必须用 为前导。
【例】找出 vend_name 字段文本中包含 - 字符的所有行
SELECT vend_name FROM vendors WHERE vend_name REGEXP ‘-’
转义字符,
| 项目 | Value |
|---|---|
| \f | 换页 |
| \n | 换行 |
| \r | 回车 |
| \t | 制表 |
| \v | 纵向制表 |
| 项目 | Value |
|---|---|
| * | 0个或1个匹配 |
| + | 1个或多个匹配 |
| ? | 0个或1个匹配 |
| {n} | 指定数目匹配 |
| {n,} | 不少于指定数目的匹配 |
| {n,m} | 匹配数目的范围 |
在这个场景下,总的来说,mysql通配符适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。