美文网首页
SQL 对结果进行过滤(二)

SQL 对结果进行过滤(二)

作者: 山药鱼儿 | 来源:发表于2022-03-08 20:20 被阅读0次

本节我们学习如何用 ANDOR 操作符组合成 WHERE 子句,以及 INNOT IN 操作符。

组合 WHERE 子句

连载的上一篇文章中,我们在使用 WHERE 子句指定搜索条件时,都是单一的条件。为了执行更复杂的过滤操作,我们可以使用 ANDOR 操作符来组合多个条件。

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 检索出厂商 IDDLL01BRS01 的商品信息。

SELECT prod_id, vend_id, prod_name, prod_price 
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';

检索结果:

注:OR 用来表示检索匹配任意给定条件的行。

ANDOR 优先级的问题

WHERE 子句可以包含任意数目的 ANDOR 操作符,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 子句中同时包含了 ANDOR 操作符,我们都会使用圆括号明确优先级,而不是依赖默认的顺序。

IN / NOT IN 操作符

IN 操作符

IN 操作符后跟一组由逗号分隔的、括在圆括号中的合法值,用来指定条件范围。还是筛选供应商 DLL01BRS01 的产品信息,我们可以使用 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 了。筛选出非供应商 DLL01BRS01 的产品信息:

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 BR02BR03 订购总数大于或等于 100 个的订单号、产品 ID 以及订购数量。

SQL 语句如下:

SELECT order_num, prod_id, quantity
FROM OrderItems
WHERE prod_id IN ('BR01','BR02','BR03') AND quantity >= 100;

检索结果:

相关文章

网友评论

      本文标题:SQL 对结果进行过滤(二)

      本文链接:https://www.haomeiwen.com/subject/qrnarrtx.html