数据过滤操作符:AND、OR、IN、NOT。
4.1. AND操作符
用来改变 WHERE
子句中的子句关键字,也成逻辑操作符。通过使用 AND
来给 WHERE
子句附加条件。
例:索引出供应商'DLL01'制造且价格小于等于4美金的所有产品名称和价格。
mysql> SELECT prod_id, prod_price, prod_name
-> FROM Products
-> WHERE vend_id = 'DLL01' AND prod_price <= 4;
+---------+------------+---------------------+
| prod_id | prod_price | prod_name |
+---------+------------+---------------------+
| BNBG01 | 3.49 | Fish bean bag toy |
| BNBG02 | 3.49 | Bird bean bag toy |
| BNBG03 | 3.49 | Rabbit bean bag toy |
+---------+------------+---------------------+
3 rows in set (0.02 sec)
解释: SLELECT 语句中的子句WHERE包含两个条件,供应商指定DLL01,价格高于4美金,不显示,如果价格小于 4美金,都不术语DELL01的,也不显示。
4.2. OR操作符
检索匹配任意条件。
mysql> SELECT prod_name, prod_price
-> FROM Products
-> WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
+---------------------+------------+
| prod_name | prod_price |
+---------------------+------------+
| Fish bean bag toy | 3.49 |
| Bird bean bag toy | 3.49 |
| Rabbit bean bag toy | 3.49 |
| 8 inch teddy bear | 5.99 |
| 12 inch teddy bear | 8.99 |
| 18 inch teddy bear | 11.99 |
| Raggedy Ann | 4.99 |
+---------------------+------------+
7 rows in set (0.01 sec)
解释: 索引供应商所有产品的产品名和价格,并匹配任意条件 DLL01或者BRS01.
4.3. 计算次序
WHERE
运行 AND
与 RO
结合,进行复杂操作,和高级过滤。
检索10美金以上,并且由DLL10或者BRSO1制造。
mysql> SELECT prod_name, prod_price FROM Products WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' AND prod_price >= 10;
+---------------------+------------+
| prod_name | prod_price |
+---------------------+------------+
| Fish bean bag toy | 3.49 |
| Bird bean bag toy | 3.49 |
| Rabbit bean bag toy | 3.49 |
| 18 inch teddy bear | 11.99 |
| Raggedy Ann | 4.99 |
+---------------------+------------+
5 rows in set (0.00 sec)
返回的价格带有10美金一下的,原因是 AND
有优先级,SQL在处理 OR
前,先处理了 AND
,直接检索BRS01,或者DLL01,而忽略了价格。解决的方法是用园括号进行分组操作。
mysql> SELECT prod_name, prod_price
-> FROM Products
-> WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
-> AND prod_price >= 10;
+--------------------+------------+
| prod_name | prod_price |
+--------------------+------------+
| 18 inch teddy bear | 11.99 |
+--------------------+------------+
1 row in set (0.01 sec)
()
圆括号具有比 AND
,RO
更高的操作计算顺序。注意: 使用 AND
和OR
操作WHERE
句子,都应该用圆括号明确分组操作。
4.4. IN 操作符
IN
操作符用来指定范围,范围中的每一条,都进行匹配。IN
取值规律,由逗号分割,全部放置括号中。
mysql> SELECT prod_name, prod_price
-> FROM Products
-> WHERE vend_id IN ('DLL01', 'BRS01')
-> ORDER BY prod_name;
+---------------------+------------+
| prod_name | prod_price |
+---------------------+------------+
| 12 inch teddy bear | 8.99 |
| 18 inch teddy bear | 11.99 |
| 8 inch teddy bear | 5.99 |
| Bird bean bag toy | 3.49 |
| Fish bean bag toy | 3.49 |
| Rabbit bean bag toy | 3.49 |
| Raggedy Ann | 4.99 |
+---------------------+------------+
7 rows in set (0.01 sec)
解释: 用SELECT检索,DLL01和BRS01制造的所有产品,IN操作符后跟由逗号分割的合法值清单。
IN
相当与完成了 OR
相同的功能,下面的结果与上面输出结果一样:
mysql> SELECT prod_name, prod_price
-> FROM Products
-> WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
-> ORDER BY prod_name;
+---------------------+------------+
| prod_name | prod_price |
+---------------------+------------+
| 12 inch teddy bear | 8.99 |
| 18 inch teddy bear | 11.99 |
| 8 inch teddy bear | 5.99 |
| Bird bean bag toy | 3.49 |
| Fish bean bag toy | 3.49 |
| Rabbit bean bag toy | 3.49 |
| Raggedy Ann | 4.99 |
+---------------------+------------+
7 rows in set (0.00 sec)
- 使用IN的优点:
- 语法清晰,特别是语法较长时
- 操作符少,计算次序容易管理
- IN比OR执行速度快
- 最大的优点,可以包含其他SELECT语句,能够更加动态的建立WHERE子句。
4.5. NOT操作符
NOT
操作符总是与其他操作符一起使用,用在要过滤的前面。
mysql> SELECT vend_id, prod_name FROM Products WHERE NOT vend_id = 'DLL01' ORDER BY prod_name;
+---------+--------------------+
| vend_id | prod_name |
+---------+--------------------+
| BRS01 | 12 inch teddy bear |
| BRS01 | 18 inch teddy bear |
| BRS01 | 8 inch teddy bear |
| FNG01 | King doll |
| FNG01 | Queen doll |
+---------+--------------------+
5 rows in set (0.00 sec)
列出不带有DLL01之外的所有产品。
下一节:利用通配符进行复杂的数据操作:LIKE、REGEXP、百分号%、下划线 _、方括号[]、