第5课、高级过滤
组合 WHERE 子句
AND OR:与条件、或条件
多个 WHERE 子句有两种使用方式:AND 子句 或 OR 子句。
1)AND 操作符 |
需求:如果某个产品由供应商 DLL01 制造,但价格不高于4美元。
SELECT vend_id,prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
-- 书上没有 SELECT vend_id 列,为方便理解输出结果,该段语句 SELECT 后添加 vend_id
输出结果:
2)OR 操作符 |
需求:供应商要么为 DLL01,要么为 BRS01 。
SELECT vend_id,prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
-- 书上没有 SELECT vend_id 列,为方便理解输出结果,该段语句 SELECT 后添加 vend_id
输出结果:
2.2)求值顺序 |
问题例子:
需求:供应商为 DLL01 和 BRS01,且这两个供应商的产品价格都大于等于10.
SELECT vend_id,prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
AND prod_price >= 10;
-- 书上没有 SELECT vend_id 列,为方便理解输出结果,该段语句 SELECT 后添加 vend_id
输出结果:
但是,输出结果中有小于10的价格出现。
分析:
SQL 理解 WHERE 子句问题:由于 AND 操作符优先级高,所以判断为:
vend_id = 'BRS01' AND prod_price >= 10
然后才是:
vend_id = 'DLL01' OR
解决方案:
SELECT vend_id,prod_name, prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10;
-- 多加了个括号
输出结果:
3)IN 操作符 |
IN:条件范围
IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配
需求:检索由供应商 DLL01 和 BRS01 制造的所有产品。
SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ('DLL01','BRS01')
ORDER BY prod_name;
-- 以下例子与上面例子相同工作。
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
ORDER BY prod_name;
输出结果:
4)NOT 操作符 |
NOT:非条件
NOT 否定其后所跟的任何条件。可以用在要过滤的列前,也可以用在其后。
需求:列出除 DLL01 之外的所有供应商制造的产品。
SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;
-- 以下例子与上面例子相同工作
SELECT prod_name
FROM Products
WHERE vend_id <> 'DLL01'
ORDER BY prod_name;
输出结果:
总结
AND OR:与条件、或条件
WHERE 条件1 AND 条件2;
WHERE 条件1 OR 条件2;
//AND OR 同时使用,注意关键字的优先级:
WHERE (条件1 OR 条件2) AND 条件3;
IN:条件范围
WHERE vend_id IN ('列值1','列值2')
NOT:非条件
WHERE NOT 条件1