这一节将记录如何用 ANDOR 操作符组合成 WHERE 子句,如何明确地管理求值顺序,如何使用 INNOT 操作符

组合 WHERE 子句

在上一节中介绍的所有 WHERE 子句在过滤时使用的都是单一条件,为了进行更强的过滤控制,可以使用 ANDOR 组合多个条件

AND 操作符

使用 AND 操作符附加条件

1
2
3
SELECT prod_id, prod_price ,prod_name
FROM Products
WHERE vend_id ='DLL01' AND prod_price <=4;

这个例子只包含一个 AND 子句,可以增加多个

OR 操作符

这个肯定一眼就能看懂吧

1
2
3
SELECT prod_name , prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';

求值顺序

对比 ANDOR 两个操作符,AND 的优先级更高

但是在实际使用时,墙裂建议使用小括号标记优先级

1
2
3
4
SELECT prod_name , prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10;

IN 操作符

IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配

1
2
3
4
SELECT prod_name , prod_price
FROM Products
WHERE vend_id IN ('DLL01','BRS01')
ORDER BY prod_name;

你大概已经发现了,INOR在一些情况下有相同的功能,上面的例子也可以这样写

1
2
3
4
SELECT prod_name , prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
ORDER BY prod_name;

为什么要使用IN呢?其优点如下:

  • 在有很多合法选项时,IN 操作符的语法更清楚,更直观
  • 在与其他 ANDOR 操作符组合使用 IN 时,求值顺序更容易管理
  • IN操作符一般比一组OR操作符执行地更快
  • IN的最大优点是可以包含其他SELECT语句 (将在学到子查询时详细介绍)

NOT 操作符

NOT 操作符用于否定其后所跟的任何条件

下面的例子列出了除 DLL01 之外的所有供应商制造的产品

1
2
3
4
SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;

当然,在本例中你也可以使用!=,对于这里这种简单的 WHERE 子句,使用 NOT 确实没有什么优势

但在更复杂的子句中,NOT 是非常有用的,例如在与 IN 联合使用时, NOT 可以非常简单地找出与条件列表不匹配的行

大多数 DBMS 允许使用 NOT 否定任何条件