本节我们学习如何用 AND 和 OR 操作符组合成 WHERE 子句,以及 IN 和 NOT IN 操作符。
组合 WHERE 子句
连载的上一篇文章中,我们在使用 WHERE
子句指定搜索条件时,都是单一的条件。为了执行更复杂的过滤操作,我们可以使用 AND
和 OR
操作符来组合多个条件。
AND 操作符
下面,在 WHERE
子句中使用 AND
操作符,在商品表中检索出由供应商 DLL01
制造且价格小于 4 美元的所有商品。其中,商品表如下:
检索出由供应商 DLL01
制造且价格小于 4 美元的所有商品的 ID 名称和价格:
SELECT prod_id, prod_name, prod_price
FROM Products
WHERE vend_id='DLL01' AND prod_price < 4;
运行结果:
注:只有当使用 AND 关键字接连的条件都满足时,该行才会被检索出来。
OR 操作符
OR
操作符的作用与 AND
操作符相反,OR
操作符连接的任意一个条件得到满足,相应的行就会被检索出来。比如,下面的 SQL
检索出厂商 ID 为 DLL01
或 BRS01
的商品信息。
SELECT prod_id, vend_id, prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
检索结果:
注:OR 用来表示检索匹配任意给定条件的行。
AND 和 OR 优先级的问题
WHERE
子句可以包含任意数目的 AND
和 OR
操作符,AND
操作符要优先于 OR
被计算。比如下面的 SQL :
SELECT vend_id, prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
AND prod_price >= 10;
在进行条件判断时,将先判断 vend_id = 'DLL01'
是否成立?如不成立则继续判断是否满足 vend_id = 'BRS01' AND prod_price >= 10
?也就是说上述检索条件变成了厂商 ID 为 DLL01
的产品或者 厂商 BRS01
提供的产品价格大于 10 的产品。
检索结果:
如果我们想改变优先级,可以使用 ()
:
SELECT vend_id, prod_name, prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10;
检索结果:
使用 ()
时,括号中的语句将被优先执行。日常工作中,如果 WHERE
子句中同时包含了 AND
和 OR
操作符,我们都会使用圆括号明确优先级,而不是依赖默认的顺序。
IN / NOT IN 操作符
IN 操作符
IN 操作符后跟一组由逗号分隔的、括在圆括号中的合法值,用来指定条件范围。还是筛选供应商 DLL01
和 BRS01
的产品信息,我们可以使用 IN
来改写原来的 OR
条件:
SELECT prod_id, vend_id, prod_name, prod_price
FROM Products
WHERE vend_id IN ('DLL01','BRS01');
运行结果:
既然 OR
可以完成的工作,为什么还须要使用 IN
呢?
- 在合法值比较多时,显然
IN
语法更清晰、直观; -
IN
操作符一般比一组OR
效率更高; -
IN
最大的有点是可以包含其他SELECT
语句。
NOT 操作符
NOT 操作符用于否定其后所跟的任何条件,其中最常见的组合便是 NOT IN
了。筛选出非供应商 DLL01
和 BRS01
的产品信息:
SELECT prod_id, vend_id, prod_name, prod_price
FROM Products
WHERE vend_id NOT IN ('DLL01','BRS01');
筛选结果:
案例实践
1、筛选出美国加利福尼亚州的供应商:
SQL 语句如下:
SELECT vend_name
FROM Vendors
WHERE vend_country='USA' AND vend_state='CA';
运行结果:
2、从订单表中,检索出产品 BR01
BR02
和 BR03
订购总数大于或等于 100 个的订单号、产品 ID 以及订购数量。
SQL 语句如下:
SELECT order_num, prod_id, quantity
FROM OrderItems
WHERE prod_id IN ('BR01','BR02','BR03') AND quantity >= 100;
检索结果:
网友评论