MYSQL-通配符与正则表达式的使用
2017-08-11 10:52
495 查看
介绍
通配符与正则表示的使用都是用来匹配一个字符串,可以用于匹配数据表中的某个字段的值,或者用于其它的SQL命令中的模糊查询。通配符与正则表达式都将作为SQL中
where子句的内容,前者通过使用
LIKE和
NOT LIKE操作符,后者通过使用
REGEXP和
NOT REGEXP或者
RLIKE和
NOT RLIKE操作符。
演示数据
MySQL 标准的SQL模式匹配
使用LIKE和
NOT LIKE操作符
1. %
百分号通配符
表示任意多种字符且可以出现任意次数演示1 :
查询
animal表中
en_name字段中以
h开头的记录
mysql> SELECT * FROM animal WHERE en_name LIKE 'h%'; +----+--------------+---------+ | id | en_name | ch_name | +----+--------------+---------+ | 1 | horse | 马 | | 2 | hippopotamus | 河马 | +----+--------------+---------+ 2 rows in set (0.00 sec)
演示2 :
查询
animal表中
en_name字段中不以
h开头的记录
mysql> SELECT * FROM animal WHERE en_name NOT LIKE 'h%'; +----+--------------+-----------+ | id | en_name | ch_name | +----+--------------+-----------+ | 3 | pony | 矮马 | | 4 | thoroughbred | 纯种马 | | 5 | mule | 骡 | | 6 | ox | 牛 | | 7 | pig | 猪 | | 8 | sheep | 羊 | | 9 | deer | 鹿 | | 10 | elephant | 象 | | 11 | tomcat | 公猫 | | 12 | squirrel | 松鼠 | | 13 | mouse | 家鼠 | +----+--------------+-----------+ 11 rows in set (0.00 sec)
演示3 :
查询
animal表中
en_name字段中以
t结尾的记录
mysql> SELECT * FROM animal WHERE en_name LIKE '%t'; +----+----------+---------+ | id | en_name | ch_name | +----+----------+---------+ | 10 | elephant | 象 | | 11 | tomcat | 公猫 | +----+----------+---------+ 2 rows in set (0.00 sec)
(%)通配符不匹配NULL
2. _
下划线通配符
表示任意一个字符(无论是字母还是汉字)如果想匹配两个或多个字符,那就使用两次或多次
_下划线通配符
演示1 :
查询
animal表中
en_name字段中字符(字母)长度为2的记录
mysql> SELECT * FROM animal WHERE en_name LIKE '__'; +----+---------+---------+ | id | en_name | ch_name | +----+---------+---------+ | 6 | ox | 牛 | +----+---------+---------+ 1 row in set (0.00 sec)
演示2 :
查询
animal表中
cn_name字段中字符(汉字)长度为2的记录
mysql> SELECT * FROM animal WHERE ch_name LIKE '__'; +----+--------------+---------+ | id | en_name | ch_name | +----+--------------+---------+ | 2 | hippopotamus | 河马 | | 3 | pony | 矮马 | | 11 | tomcat | 公猫 | | 12 | squirrel | 松鼠 | | 13 | mouse | 家鼠 | +----+--------------+---------+ 5 rows in set (0.00 sec)
3. 通配符可以灵活的搭配使用
演示1 :查询
animal表中
en_name字段值为
tomcat的记录
mysql> SELECT * FROM animal WHERE en_name LIKE '__m%'; +----+---------+---------+ | id | en_name | ch_name | +----+---------+---------+ | 11 | tomcat | 公猫 | +----+---------+---------+ 1 row in set (0.00 sec)
MySQL扩展的正规表达式匹配
使用REGEXP和
NOT REGEXP操作符,或者
RLIKE和
NOT RLIKE,这两套操作符同义。
1. ^
表示模式匹配的开始,$
表示模式匹配的结尾
正规表达式匹配的是目标字符串的子串,也就是说只要目标字符串中有一部分符合模式(即正则表达),那么就匹配成功不同于SQL标准的模式匹配。SQL标准的模式匹配将匹配整个目标字符串,也就是说只有当目标字符串完全符合模式(子串符合模式不算),那么才匹配成功
由于正则表达式将匹配目标字符串或其字串,当我们想要用正则表达式像SQL标准模式一样只匹配整个目标字符串时,就需要用到
^字符来表示目标字符串的开头,
$字符表示目标字符串的结尾
演示1 :
使用
REGEXP查询
animal表中
en_name字段包含字母
m记录
mysql> SELECT * FROM animal WHERE en_name REGEXP 'm'; +----+--------------+---------+ | id | en_name | ch_name | +----+--------------+---------+ | 2 | hippopotamus | 河马 | | 5 | mule | 骡 | | 11 | tomcat | 公猫 | | 13 | mouse | 家鼠 | +----+--------------+---------+ 4 rows in set (0.00 sec)
我们可以看到,正则表达式返回所有
en_name字段中包含
m子串的记录
再来看使用SQL标准模式是否能匹配
en_name字段含
m字串的记录?
mysql> SELECT * FROM animal WHERE en_name LIKE 'm'; Empty set (0.00 sec)
结果显示是不行的,因为SQL模式只检查整个目标字符串(即整个
en_name字段)是否匹配
2. .
点 元字符
表示任意一个字符(注意:虽然官方文档上写着.符号代表着一个字符character,但是测试表明其代表的是一个字节,因此字母和汉字所用的
.符号数量将会不同)
如果是英文,1个
.代表一个字符
演示1 :
查询
animal表中
en_name字段中第二个字符为
o的记录
mysql> SELECT * FROM animal WHERE en_name REGEXP '^.o'; +----+---------+---------+ | id | en_name | ch_name | +----+---------+---------+ | 1 | horse | 马 | | 3 | pony | 矮马 | | 11 | tomcat | 公猫 | | 13 | mouse | 家鼠 | +----+---------+---------+ 4 rows in set (0.00 sec)
如果是UTF-8编码,3个
.代表一个汉字
演示2 :
查询
animal表中
ch_name字段中第二个字符为
马的记录
mysql> SELECT * FROM animal WHERE ch_name REGEXP '^...马'; +----+--------------+---------+ | id | en_name | ch_name | +----+--------------+---------+ | 2 | hippopotamus | 河马 | | 3 | pony | 矮马 | +----+--------------+---------+ 2 rows in set (0.00 sec)
上面这条SQL语句中正则表达式使用了3个
.符号,假如我们只用1个
.符号,看看能否查出记录
mysql> SELECT * FROM animal WHERE ch_name REGEXP '^.马'; Empty set (0.00 sec)
结果显示是不行的
如果是GBK编码,2个
.代表一个汉字
演示3 :
下面我们将
en_name这个字段的编码换成GBK后再来查询。
查询
animal表中
ch_name字段中第二个字符为
马的记录
mysql> SELECT * FROM animal WHERE ch_name REGEXP '^..马'; +----+--------------+---------+ | id | en_name | ch_name | +----+--------------+---------+ | 2 | hippopotamus | 河马 | | 3 | pony | 矮马 | +----+--------------+---------+ 2 rows in set (0.00 sec)
可以看到上面的SQL语句中的正则表达式用了2个
.符号,查询出了记录。
3. []
方括号元字符
方括号表示一个集合,表示此集合中的任意一个字符。如[abc],可以匹配字符’a’、’b’、’c’。
[a-z]匹配所有字母
[0-9]匹配所有数字
演示4 :
查询
animal表中
en_name字段中以字符
h或
p开头的记录
mysql> SELECT * FROM animal WHERE en_name REGEXP '^[hp]'; +----+--------------+---------+ | id | en_name | ch_name | +----+--------------+---------+ | 1 | horse | 马 | | 2 | hippopotamus | 河马 | | 3 | pony | 矮马 | | 7 | pig | 猪 | +----+--------------+---------+ 4 rows in set (0.00 sec)
4. *
星号元字符
表示*匹配0个或多个在它之前的模式
.*可以匹配所有长度的所有字符串
5. {n}
重复n次操作符
表示前面的通配符重复n次。如.{4},表示的意思同 模式
....一样
演示4 :
查询
animal表中
en_name字段包含连续两个
p的记录
mysql> SELECT * FROM animal WHERE en_name REGEXP 'p{2}'; +----+--------------+---------+ | id | en_name | ch_name | +----+--------------+---------+ | 2 | hippopotamus | 河马 | +----+--------------+---------+ 1 row in set (0.00 sec)
小结
SQL标准模式匹配整个字符串;而扩展正规表达式 ,匹配整个字符串或者其字串。SQL标准模式使用
LIKE和
NOT LIKE操作符;正则表达式使用
REGEXP和
NOT REGEXP或者
RLIKE和
NOT RLIKE操作符
MySQL中的匹配模式不区分大小写
相关文章推荐
- MySql like通配符使用(mysql 正则表达式)
- MySql中正则表达式的使用方法描述
- mysql正则表达式 LIKE 通配符
- mysql 使用正则表达式查询
- Visual Studio“查找和替换”窗口"快速替换"使用正则表达式和通配符.快速智能高效替换.可用的通配符和表达式
- 使用sqlserver"查找和替换"的正则表达式和通配符功能
- MySQL中使用正则表达式查询
- 【转】MYSQL入门学习之二:使用正则表达式搜索
- 使用MySQL正则表达式 __MySQL必知必会
- MySQL入门-6:通配符匹配和正则表达式
- 使用MySQL正则表达式
- MySql中正则表达式的使用方法描述
- mysql中如何使用正则表达式查询
- MySQL正则表达式使用——MySQL系列(四)
- 使用sqlserver"查找和替换"的正则表达式和通配符功能
- MYSQL入门学习之二:使用正则表达式搜索
- mysql正则表达式 LIKE 通配符
- mysql中使用正则表达式查询
- 使用MySQL正则表达式 __MySQL必知必会
- Linux Shell 正则表达式之 通配符、元字符、转义符使用实例介绍