第七章 数据过滤
使用WHERE
子句建立更高级的搜索条件,并且使用NOT
和IN
操作符
7.1 组合WHERE
子句
MySQL允许使用多个WHERE
子句,使用方式为,
1. 以AND
子句的形式;
2. 以OR
子句的形式。
7.1.1 AND
操作符
为了通过不止一个列进行过滤,可以使用AND
操作符。
mysql> SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;
+---------+------------+----------------+
| prod_id | prod_price | prod_name |
+---------+------------+----------------+
| FB | 10.00 | Bird seed |
| FC | 2.50 | Carrots |
| SLING | 4.49 | Sling |
| TNT1 | 2.50 | TNT (1 stick) |
| TNT2 | 10.00 | TNT (5 sticks) |
+---------+------------+----------------+
分析,此语句检索出供应商为1003且价格小于等于*10的产品名称和价格。
7.1.2 OR
操作符
从字意可以理解为,指示mysql检索匹配任一条件的行。例如,
mysql> SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003;
+----------------+------------+
| prod_name | prod_price |
+----------------+------------+
| Detonator | 13.00 |
| Bird seed | 10.00 |
| Carrots | 2.50 |
| Fuses | 3.42 |
| Oil can | 8.99 |
| Safe | 50.00 |
| Sling | 4.49 |
| TNT (1 stick) | 2.50 |
| TNT (5 sticks) | 10.00 |
+----------------+------------+
7.1.3 计算次序
WHERE
可包含任意数目的AND
和OR
操作符。
-注意,在任何时候具有AND
和OR
的子句中,都应该使用圆括号明确地分组操作,不可以过分依赖默认计算次序。
7.2 IN
操作符
IN
操作符圆括号在WHERE
中的另外一种用法,IN
操作符用来指定条件范围。取的合法值都需要由逗号分割的清单,全部括在圆括号中。例如,
mysql> SELECT prod_name, prod_price FROM products WHERE vend_id IN (1002, 1003) ORDER BY prod_name;
+----------------+------------+
| prod_name | prod_price |
+----------------+------------+
| Bird seed | 10.00 |
| Carrots | 2.50 |
| Detonator | 13.00 |
| Fuses | 3.42 |
| Oil can | 8.99 |
| Safe | 50.00 |
| Sling | 4.49 |
| TNT (1 stick) | 2.50 |
| TNT (5 sticks) | 10.00 |
+----------------+------------+
分析,IN
的作用与OR
相同。
使用IN
操作符优点如下,
1. 在使用长的合法清单时,IN
操作符更加清晰且直观;
2. 计算次序更容易管理;
3. IN
一般比OR
执行更快;
4. 最大优点是可以执行其他SELECT
语句,即嵌套语句。
7.3 NOT
操作符
NOT
操作符,用来否定之后的任何条件,纵使前面过滤中会显示。
第八章 用通配符进行过滤
介绍使用通配符及LIKE
操作符进行统配搜索
8.1 LIKE
操作符
通配符,用来匹配值的一部分特色符号。
搜索模式,由字面值、通配符或两者组合成的搜索条件。
在SQL中使用通配符,必须使用LIKE
操作符。
8.1.1 百分号(%)通配符
在搜索串中,&表示任何字符出现任意次数,可以出现在搜索模式的任意位置。例如找到所有以jet开头的产品,
mysql> SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'jet%';
+---------+--------------+
| prod_id | prod_name |
+---------+--------------+
| JP1000 | JetPack 1000 |
| JP2000 | JetPack 2000 |
+---------+--------------+
例如找到所有含有jet的产品,
mysql> SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '%anvil%';
+---------+--------------+
| prod_id | prod_name |
+---------+--------------+
| ANV01 | .5 ton anvil |
| ANV02 | 1 ton anvil |
| ANV03 | 2 ton anvil |
+---------+--------------+
或者,寻找以s开头e结尾的产品,
mysql> SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 's%e';
+---------+-----------+
| prod_id | prod_name |
+---------+-----------+
| SAFE | Safe |
+---------+-----------+
- 注意,字符串尾部可能包含空格,使用单一%无法匹配。可以通过添加尾部%,更好的办法是使用函数去掉收尾空格。
8.1.2 下划线(_)通配符
下划线(_)通配符,只能匹配单个字符而不是多个。
mysql> SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '_ ton anvil';
+---------+-------------+
| prod_id | prod_name |
+---------+-------------+
| ANV02 | 1 ton anvil |
| ANV03 | 2 ton anvil |
+---------+-------------+
若使用%字符,
mysql> SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '% ton anvil';
+---------+--------------+
| prod_id | prod_name |
+---------+--------------+
| ANV01 | .5 ton anvil |
| ANV02 | 1 ton anvil |
| ANV03 | 2 ton anvil |
+---------+--------------+
8.2 使用通配符技巧
- 不要过度使用。如果能用其他操作符达到目的,不应该使用通配符。
- 在确定需要使用通配符,除非必要,否则不将他们用在搜索模式的开始处(尽量避免);
- 仔细注意通配符的位置。