_5_ SQL 高级数据过滤(AND OR IN NOT)

本文DEMO

https://gitee.com/changsanjiang/SQLDemo/tree/master

在之前例子中, 我们使用的WHERE子句都是单一的条件. 为了进行更强的过滤控制, SQL允许给出多个WHERE子句. 即结合以AND或OR子句的方式使用.

AND 操作符

输入:

SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4
ORDER BY prod_name;

分析:

此SQL语句检索供应商DLL01制造且价格小于4美元的所有产品的ID, 价格, 名称. 在WHERE子句中包含两个条件, 使用AND关键字联结在了一起.

AND指示DBMS只返回满足所有给定条件的行. 如果某个产品由DLL01制造, 但价格高于4美元, 则不被检索, 类似的, 如果价格小于4美元, 但供应商不是DLL01, 也不会被检索.

输出:

《_5_ SQL 高级数据过滤(AND OR IN NOT)》 image.png

OR 操作符

OR 操作符为或者的意思, 它指示DBMS检索匹配任一条件的行. 事实上, 许多DBMS在OR子句中当遇到某个条件得到满足时, 就不再计算剩余的条件了.

输入:

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

分析:

OR 操作符告诉DBMS匹配DLL01或BRS01任意一个制造商制造的产品.

输出:

《_5_ SQL 高级数据过滤(AND OR IN NOT)》 image.png

OR 与 AND 的优先级(结合使用)

WHERE子句可以包含任意数目的AND和OR操作符. 允许两者结合使用, 进行复杂, 高级的过滤.

在结合使用时, 会碰到一个有趣的问题. 为了说明这个问题, 我们先看一个例子:

输入:

SELECT vend_id, prod_name, prod_price 
FROM Products 
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' 
      AND prod_price >= 10; 

输出:

《_5_ SQL 高级数据过滤(AND OR IN NOT)》 image.png

分析:

原本想检索的数据是供应商DLL01或BRS01所有价格大于10美元的商品. 但在返回行中, 有四行小于10美元.

显然, 返回的行未按预期的条件进行过滤.

为什么会这样呢? 原因在于两个操作符的优先级. SQL(像多数语言一样)在处理OR操作符前, 优先处理AND操作符. 所以由此, 上述输入它理解为: 由供应商BRS01制造并且价格高于10美元或由供应商DLL01制造的商品, 不管其价格如何.

这个问题的解决方法就是使用圆括号对操作符进行明确的分组. 请看:

输入:

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

输出:

《_5_ SQL 高级数据过滤(AND OR IN NOT)》 image.png

分析:

由上可见, 圆括号具有比AND或OR操作符更高的优先级. 所以DBMS首先过滤圆括号中的OR条件, 接着过滤价格大于等于10美元的产品.

所以, 建议在任何结合使用的场景中, 都使用圆括号进行明确的分组. 不要过分依赖默认求值顺序, 即使它确实如你所想的那样.

IN 操作符

IN 操作符指定一组值, 进行匹配. 某个值达成, 即可被检索. 如下:

输入:

SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ('DLL01', 'BRS01');

输出:

《_5_ SQL 高级数据过滤(AND OR IN NOT)》 image.png

分析:

此语句检索供应商DLL01或BRS01制造的产品. 括号中的值用逗号分隔.

你可能会猜测IN操作符完成了与OR相同的功能. 恭喜你答对了! 下面的语句与上例子完成了相同的工作.

输入:

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

为什么使用IN操作符? 其优点如下:

  • 在很多合法选项中, IN 操作符更易读, 直观
  • 在与其他AND和OR结合语句中使用IN, 求值顺序更容易管理
  • IN操作符一般比一组OR操作符执行得更快(上面的这个合法选项很少的例子, 你看不出性能差异)
  • IN的最大优点是可以包含其他SELECT语句, 能够更动态地建立WHERE子句. 以后随着深入我们对此介绍.

NOT 操作符

NOT 操作符只有一个功能, 就是否定其后所跟的任何条件. 因为NOT从不单独使用(它总是与其他操作符一起使用), 所以他的语法与其他操作符有所不同.

输入:

SELECT vend_id, prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;

输出;

《_5_ SQL 高级数据过滤(AND OR IN NOT)》 image.png

分析:

这里的NOT否则跟在其后的条件. 所以这条件语句表示检索除了供应商DLL01的所有产品.

上面的例子也可以使用!=或者<>操作符来完成. 如下:

SELECT vend_id, prod_name
FROM Products
WHERE vend_id != 'DLL01'
ORDER BY prod_name;

为什么使用NOT?

对于这种简单的WHERE子句, 使用NOT确实没有什么优势. 但在更复杂的子句中, NOT是非常有用的. 例如在与IN操作符联合使用时, NOT可以非常简单地找出与条件列表不匹配的行.

    原文作者:changsanjiang
    原文地址: https://www.jianshu.com/p/baf3bf15c338
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞