MySQL学习笔记(四)

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_name
13     -> FROM products
14     -> 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)
posted @ 2013-04-09 22:54  liushaobo  阅读(171)  评论(0编辑  收藏  举报