组合WHERE子句
上一节的WHERE子句都是单一条件。
为了实现更强大的过滤功能,SQL允许给出多个WHERE子句,这些子句有2种使用方法,AND子句和OR子句
操作符
用于改变或者联结WHERE子句中的子句的关键字,也称为逻辑操作符
AND操作符
AND
检索满足所有条件
检索出供应商为DLL01,并且,价格小于等于4美元的商品ID,商品名字,商品价格
mysql> SELECT PROD_ID,PROD_NAME,PROD_PRICE FROM PRODUCTS
-> WHERE VEND_ID = 'DLL01' AND PROD_PRICE <= 4
-> ORDER BY PROD_NAME;
+---------+---------------------+------------+
| PROD_ID | PROD_NAME | PROD_PRICE |
+---------+---------------------+------------+
| BNBG02 | Bird bean bag toy | 3.49 |
| BNBG01 | Fish bean bag toy | 3.49 |
| BNBG03 | Rabbit bean bag toy | 3.49 |
+---------+---------------------+------------+
OR操作符
OR
检索匹配任一条件即可
检索出供应商为DLL01,或者,价格小于等于4美元的商品ID,商品名字,商品价格
mysql> SELECT PROD_ID,PROD_NAME,PROD_PRICE FROM PRODUCTS
-> WHERE VEND_ID = 'DLL01' OR PROD_PRICE <= 4;
+---------+---------------------+------------+
| PROD_ID | PROD_NAME | PROD_PRICE |
+---------+---------------------+------------+
| BNBG01 | Fish bean bag toy | 3.49 |
| BNBG02 | Bird bean bag toy | 3.49 |
| BNBG03 | Rabbit bean bag toy | 3.49 |
| RGAN01 | Raggedy Ann | 4.99 |
+---------+---------------------+------------+
求值顺序
如果现在我们要求检索出价格大于10美元,且由DLL01或者BRSO1制造的商品,输出的结果中可能会包含价格小于10美元的商品。
出现上述问题,是因为我们的求值顺序不正确
AND的优先级比OR高。SQL优先处理AND语句。这就会导致操作符错误的组合我们的条件
解决的方法就是使用圆括号对操作符进行分组
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 |
+--------------------+------------+
IN操作符
IN
其用来指定条件范围,范围内的每个条件都可以进行匹配。
其取值由一组逗号分隔,括在圆括号中的合法值
检索由DLL01和BRS01制造的商品
mysql> SELECT PROD_NAME,PROD_PRICE FROM PRODUCTS
-> WHERE (VEND_ID = 'DLL01' OR VEND_ID = 'BRS01')
-> ORDER BY PROD_PRICE;
+---------------------+------------+
| PROD_NAME | PROD_PRICE |
+---------------------+------------+
| Fish bean bag toy | 3.49 |
| Bird bean bag toy | 3.49 |
| Rabbit bean bag toy | 3.49 |
| Raggedy Ann | 4.99 |
| 8 inch teddy bear | 5.99 |
| 12 inch teddy bear | 8.99 |
| 18 inch teddy bear | 11.99 |
+---------------------+------------+
注意!
IN操作符完成了和OR操作符一致的功能
IN操作符的优点
- 很多条件存在的情况下,IN操作符更加直观、简洁;
- 存在多个OR操作符或者AND操作符时,使用IN操作符,求值顺序更加容易管理
- IN操作符比一组OR操作符执行更快
- IN操作符最大的优点是可以包含其他的SELECT语句,能动态地创建WHERE子句
NOT操作符
NOT
只用来否定其后所跟的任何条件
其从不会单独使用
其可以用在要过滤的列前或者列后
列出除DLL01之外的所有供应商制造的商品
mysql> SELECT PROD_NAME,VEND_ID FROM PRODUCTS
-> WHERE NOT VEND_ID = 'DLL01';
+--------------------+---------+
| PROD_NAME | VEND_ID |
+--------------------+---------+
| 8 inch teddy bear | BRS01 |
| 12 inch teddy bear | BRS01 |
| 18 inch teddy bear | BRS01 |
| King doll | FNG01 |
| Queen doll | FNG01 |
+--------------------+---------+
NOT的优势
对于简单的WHERE子句,使用NOT操作符无法突出其优势
但是,在更复杂的子句中,NOT是非常有用的
例如,在与IN操作符联合使用时,NOT可以非常方便简单的找出与条件列表不匹配的行