通配符与正则表示的使用都是用来匹配一个字符串,可以用于匹配数据表中的某个字段的值,或者用于其它的SQL命令中的模糊查询。
通配符与正则表达式都将作为SQL中where
子句的内容,前者通过使用 LIKE
和 NOT LIKE
操作符,后者通过使用 REGEXP
和 NOT REGEXP
或者 RLIKE
和 NOT RLIKE
操作符。
使用
LIKE
和NOT LIKE
操作符
%
百分号通配符演示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)
_
下划线通配符_
下划线通配符演示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)
演示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)
使用
REGEXP
和NOT REGEXP
操作符,或者RLIKE
和NOT RLIKE
,这两套操作符同义。
^
表示模式匹配的开始,$
表示模式匹配的结尾^
字符来表示目标字符串的开头,$
字符表示目标字符串的结尾演示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
字段)是否匹配
.
点 元字符.
符号代表着一个字符character,但是测试表明其代表的是一个字节,因此字母和汉字所用的.
符号数量将会不同).
代表一个字符演示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)
.
代表一个汉字演示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)
结果显示是不行的
.
代表一个汉字演示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个.
符号,查询出了记录。
[]
方括号元字符[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)
*
星号元字符*
匹配0个或多个在它之前的模式.*
可以匹配所有长度的所有字符串{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)
LIKE
和 NOT LIKE
操作符;正则表达式使用 REGEXP
和 NOT REGEXP
或者 RLIKE
和 NOT RLIKE
操作符