利用通配符过滤
要利用通配符必须使用LIKE
表示后面的搜索模式用的是通配符匹配而不是相等匹配
%
概念:表示任意字符出现任意次数
包括出现0次
示例:WHERE prod_name LIKE 'jet%'
根据MySQL配置,搜索可以区分大小写
JET和jet是不一样的
%出现位置
字符串的前中后都可以
坑
有些字符串末尾有空格容易被忽视导致匹配不到
比如 %wangle ,匹配不到‘wangle ’
解决
在末尾也加上%
%虽然能匹配0次,但是不能匹配null
比如想直接用 LIKE ‘%’是匹配不到 null值的
_
和%类似,区别是_限定匹配一个字符
不多也不少必须一个
注意
通配符比较慢,非必要不要滥用
不要把通配符放在搜索模式的最开头,这样最慢
正则表达式
和LIKE类似,用正则必须以REGEXP开头
表示后面用的都是正则表达式
OR
REGEPX用 | 来表示 OR
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000';
注意
'1000|2000' 中是没空格的
|左右不要乱加空格,会认为是字符串的一部分
多个|使用的时候不要以为是局部的OR
比如 ‘1|2|3 wagnle’
不是1或2或3王乐
而是'1','2',' wngle'
IN
REGEXP用 []表示in
'[123] wangle'
能匹配 '1 wangle' '2 wangle' '3 wangle'
也可以写作[1|2|3]但是多此一举…
[^123]可用
[0-9]、[a-z]可用
转义
用\\转义
和常见的一个\转义不同
比如要转义\就得三个\\\
特殊字符 . [] | -
.的原意是匹配任意字符
空白符 \\f \\n \\r \\t \\v
常见字符集
[:alnum:] 等于 [a-zA-Z0-9]
……
多次匹配 支持
+ 表示一次或者多次
……
定位符
来由
REGEPX是包含匹配,也就是说在值中的任意位置包含即可
那么我们想要在固定的位置包含就要用定位符
定位符
文本的开始 ^
^[0-9]表示以数字开头的文本
文本的结束 $
e$表示以e结尾的文本
^向后修饰
$向前修饰
REGEXP '^Safe$ 和 LIKE 'Safe'一样
这种前后定位修饰可以做到和LIKE都一样
词的开始 [[:<:]]
词的结束 [[:>:]]
注意
^放到[]前面就是定位开头,放到里面就是否定
技巧
数据库正则表达式的简单测试办法
SELECT 'Hello' REGEXP '[0-9]';
SELECT 可以不跟字段 直接跟一个字符串
这样连数据库都不需要了
就能直接测试REGEXP
注意
MySQL仅支持一部分正则表达式
REGEXP可以匹配列值内出现的
LIKE只能匹配整个列值相同的
SELECT prod_name
FROM products
WHERE prod_name LIKE '1000';
如果列值中不是完整的‘1000’那么将匹配不到
WHERE prod_name REGEXP '1000';就可以匹配到只包含‘1000’的
REGEXP 可以设定像LIKE一样匹配整个列值
利用 ^ 和 $
大小写
MySQL正则中默认不区分大小写
可以用BINARY设定不区分大小写
WHERE prod_name REGEXP BINARY 'jet'