第5课 高级数据过滤
1.组合where子句
前面所讲的where筛选都只使用一个条件,在实际情况中,我们往往需要对数据进行多重条件筛选,如在销售记录中筛选出消费金额大于1千且性别为男性的用户。
要实现上述问题,就需要使用逻辑操作符将筛选条件组合起来。
(1)AND操作符
筛选出满足所有给定条件的数据
SELECT prod_id,prod_price,prod_name
FROM Products
WHERE vend_id='DLL01' AND prod_price<=4;
(2)OR操作符
筛选出满足任一给定条件的数据
SELECT prod_id,prod_price,prod_name
FROM Products
where vend_id='DLL01' or vend_id='BRS01';
(3)求值顺序
当AND和OR组合使用时,AND的优先级要高于OR。
SELECT prod_name,prod_price
FROM products
WHERE vend_id='DLL01' OR vend_id='BRS01' AND prod_price>=10;
上述代码实现的是:供应商BRS01制造的价格为10美元以上的产品,以及供应商DLL01制造的产品。
要想实现:返回供应商BRS01和DLL01制造的价格10美元以上的产品,则需要提高OR的优先级。
提高优先级可以使用圆括号来实现,圆括号的优先级要大于AND和OR。
SELECT prod_name,prod_price
FROM products
WHERE (vend_id='DLL01' OR vend_id='BRS01') AND prod_price>=10;
2.IN操作符
IN操作符用来指定条件范围,范围内的每个条件都可以进行匹配。
SELECT prod_name,prod_price
FROM products
WHERE vend_id IN('DLL01','BRS01')
ORDER BY prod_name;
满足IN操作符后括号中条件的数据都会被筛选出来
IN完成的工作与OR一致的
SELECT prod_name,prod_price
FROM products
WHERE vend_id='DLL01' OR vend_id='BRS01'
ORDER BY prod_name;
但是与OR相比,IN具有更多的优点:
语法更直观、更简洁;
求值顺序更容易管理;
执行速度更快;
最大的优点是可以包含其他select语句。
3.NOT操作符
否定后面所跟的条件
#列出除DLL01之外的所有供应商制造的产品
SELECT prod_name FROM products
WHERE NOT vend_id='DLL01'
ORDER BY prod_name;
4.课后练习
(1)编写SQL语句,从Vendors表中检索供应商名称(vend_name),仅返回加利福尼亚州的供应商(需要按国家[USA]和州[CA]进行过滤,没准其他国家也存在一个加利福尼亚州)。
SELECT vend_name FROM Vendors
WHERE vend_country='USA' AND vend_state='CA';
(2)编写SQL语句,查找所有至少订购了总量100个的BR01、BR02或BR03的订单。你需要返回OrderItems表中的订单号(order_num)、产品ID(prod_id)和数量,并按产品ID和数量进行过滤。
SELECT order_num,prod_id,quantity FROM OrderItems
WHERE quantity>=100 AND prod_id IN ('BR01','BR02','BR03');
(3)编写SQL语句,返回所有价格在3美元到6美元之间的产品名称(prod_name)和价格(prod_price)。使用AND, 然后按价格对结果进行排序。
SELECT prod_name,prod_price FROM Products
WHERE prod_price>=3 AND prod_price<=6
ORDER BY prod_price;
(4)下面的SQL语句有问题吗?(尝试在不运行的情况下指出。)
SELECT vend_name FROM Vendors
ORDER BY vend_name
WHERE vend_country=‘USA’ AND vend_state=‘CA’;
#order by子句应该放在where子句后面
SELECT vend_name FROM Vendors
WHERE vend_country='USA' AND vend_state='CA'
ORDER BY vend_name;