上一节的WHERE子句都是单一条件。
为了实现更强大的过滤功能,SQL允许给出多个WHERE子句,这些子句有2种使用方法,AND子句和OR子句
操作符
用于改变或者联结WHERE子句中的子句的关键字,也称为逻辑操作符
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
检索匹配任一条件即可
检索出供应商为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
其用来指定条件范围,范围内的每个条件都可以进行匹配。
其取值由一组逗号分隔,括在圆括号中的合法值
检索由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操作符的优点
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可以非常方便简单的找出与条件列表不匹配的行