1、用通配符进行过滤
通配符(wildcard) 用来匹配值的一部分的特殊字符
百分号 (%) 通配符 %表示任何字符出现任意次数
1 mysql> SELECT prod_id, prod_name 2 -> FROM products 3 -> WHERE prod_name LIKE 'jet%'; 4 +---------+--------------+ 5 | prod_id | prod_name | 6 +---------+--------------+ 7 | JP1000 | JetPack 1000 | 8 | JP2000 | JetPack 2000 | 9 +---------+--------------+10 2 rows in set (0.05 sec)
通配符可在搜索模式中任意位置使用,并且可以使用多个通配符。
1 mysql> SELECT prod_id, prod_name 2 -> FROM products 3 -> WHERE prod_name LIKE '%anvil%'; 4 +---------+--------------+ 5 | prod_id | prod_name | 6 +---------+--------------+ 7 | ANV01 | .5 ton anvil | 8 | ANV02 | 1 ton anvil | 9 | ANV03 | 2 ton anvil |10 +---------+--------------+11 3 rows in set (0.01 sec)
通配符(%)不能匹配NULL
下划线 (_) 通配符 只能匹配单个字符
1 mysql> SELECT prod_id, prod_name 2 -> FROM products 3 -> WHERE prod_name LIKE '_ ton anvil'; 4 +---------+-------------+ 5 | prod_id | prod_name | 6 +---------+-------------+ 7 | ANV02 | 1 ton anvil | 8 | ANV03 | 2 ton anvil | 9 +---------+-------------+10 2 rows in set (0.00 sec)
使用通配符的技巧
(1) 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
(2) 在确定需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符至于搜索模式的开始处,搜索起来是最慢的。
(3) 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
2、用正则表达式进行搜索
基本字符匹配
1 mysql> SELECT prod_name 2 -> FROM products 3 -> WHERE prod_name REGEXP '1000' 4 -> ORDER BY prod_name; 5 +--------------+ 6 | prod_name | 7 +--------------+ 8 | JetPack 1000 | 9 +--------------+10 1 row in set (0.03 sec)11 12 mysql> SELECT prod_name13 -> FROM products14 -> WHERE prod_name REGEXP '.000'15 -> ORDER BY prod_name;16 +--------------+17 | prod_name |18 +--------------+19 | JetPack 1000 |20 | JetPack 2000 |21 +--------------+22 2 rows in set (0.00 sec)
'.'是正则表达式语言中的一个特殊的字符。它表示匹配任意一个字符。
LIKE匹配整个列。如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不会返回(除非使用通配符)。而REGEXP在列值内进行匹配,如果被匹配的文本在列
值中出现,REGEXP将会找到它,相应的行将被返回。
OR匹配
1 mysql> SELECT prod_name 2 -> FROM products 3 -> WHERE prod_name REGEXP '1000|2000' 4 -> ORDER BY prod_name; 5 +--------------+ 6 | prod_name | 7 +--------------+ 8 | JetPack 1000 | 9 | JetPack 2000 |10 +--------------+11 2 rows in set (0.03 sec)
匹配几个字符之一
1 mysql> SELECT prod_name 2 -> FROM products 3 -> WHERE prod_name REGEXP '[123] Ton' 4 -> ORDER BY prod_name; 5 +-------------+ 6 | prod_name | 7 +-------------+ 8 | 1 ton anvil | 9 | 2 ton anvil |10 +-------------+11 2 rows in set (0.00 sec)
匹配范围
1 mysql> SELECT prod_name 2 -> FROM products 3 -> WHERE prod_name REGEXP '[1-5] Ton' 4 -> ORDER BY prod_name; 5 +--------------+ 6 | prod_name | 7 +--------------+ 8 | .5 ton anvil | 9 | 1 ton anvil |10 | 2 ton anvil |11 +--------------+12 3 rows in set (0.00 sec)
为了匹配特殊字符,必须用\\为前导。\\-表示查找-,\\.表示查找.
1 mysql> SELECT vend_name 2 -> FROM vendors 3 -> WHERE vend_name REGEXP '\\.' 4 -> ORDER BY vend_name; 5 +--------------+ 6 | vend_name | 7 +--------------+ 8 | Furball Inc. | 9 +--------------+10 1 row in set (0.05 sec)
\\也用来引用元字符
\\f <==> 换页
\\n <==> 换行
\\r <==> 回车
\\t <==> 制表
\\v <==> 纵向制表
匹配字符类
类 说明
[:alnum:] 任意字母和数字(同[a-zA-Z0-9])
[:alpha:] 任意字符
[:blank:] 空格和制表
[:cntrl:] ASCII控制字符(ASCII0到31和127)
[:digit:] 任意数字
[:graph:] 与[:printf:]相同,但不包含空格
[:lower:] 任意小写字母
[:print:] 任意可打印字符
[:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:] 包含空格在内的任意空白字符
[:upper:] 任意大写字母
[:xdigit:] 任意十六进制数字
匹配多个实例(举例)
1 mysql> SELECT prod_name 2 -> FROM products 3 -> WHERE prod_name REGEXP '\\([0-9] sticks?\\)' 4 -> ORDER BY prod_name; 5 +----------------+ 6 | prod_name | 7 +----------------+ 8 | TNT (1 stick) | 9 | TNT (5 sticks) |10 +----------------+11 2 rows in set (0.00 sec)
1 mysql> SELECT prod_name 2 -> FROM products 3 -> WHERE prod_name REGEXP '[[:digit:]]{4}'; 4 +--------------+ 5 | prod_name | 6 +--------------+ 7 | JetPack 1000 | 8 | JetPack 2000 | 9 +--------------+10 2 rows in set (0.00 sec)
定位符
1 mysql> SELECT prod_name 2 -> FROM products 3 -> WHERE prod_name REGEXP '^[0-9\\.]' 4 -> ORDER BY prod_name; 5 +--------------+ 6 | prod_name | 7 +--------------+ 8 | .5 ton anvil | 9 | 1 ton anvil |10 | 2 ton anvil |11 +--------------+12 3 rows in set (0.00 sec)