高级数据过滤--组合条件、IN和NOT

目录

1、组合条件的WHERE子句

(1)AND操作符

(2)OR操作符

(3)求值顺序

2、IN操作符

3、NOT操作符

4、小结 


博主用的是mysql8 DBMS,附上示例资料:

百度网盘链接: https://pan.baidu.com/s/1XaWi3Y7hpXbs_uHq2cPI6Q

提取码: fpnx

1、组合条件的WHERE子句

为了进行更强的过滤控制,SQL 允许给出多个 WHERE 子句。这些子句有两种使用方式,即以 AND 子句或 OR 子句的方式使用。

操作符(operator):用来联结或改变 WHERE 子句中的子句的关键字,也称为逻辑操作符 (logical operator)。

(1)AND操作符

要通过不止一个列进行过滤,可以使用 AND 操作符给 WHERE 子句附加条件。下面的代码给出了一个例子:

-- 检索由供应商 1001 制造且价格小于等于 6 美元的所有产品的名称和价格
SELECT prod_name, prod_price
FROM products
WHERE vend_id = 1001  AND prod_price <= 6
ORDER BY prod_price;

 AND 指示 DBMS 只返回满足所有给定条件的行。

AND

  • 用在 WHERE 子句中的关键字,用来指示检索满足所有给定条件的行。这个例子只包含一个 AND 子句,因此最多有两个过滤条件。可以增加多个过滤条件,每个条件间都要使用 AND 关键字。

(2)OR操作符

OR 操作符与 AND 操作符正好相反,它指示 DBMS 检索匹配任一条件的行。事实上,许多 DBMS OR WHERE 子句的第一个条件得到满足的情况下,就不再计算第二个条件了(在第一个条件满足时,不管第二个条件是否满足,相应的行都将被检索出来)。

请看如下的 SELECT 语句:

SELECT prod_name, prod_price, vend_id
FROM products
WHERE vend_id = 1002 OR vend_id = 1001 

OR:WHERE 子句中使用的关键字,用来表示检索匹配任一给定条件的行。 

(3)求值顺序

WHERE 子句可以包含任意数目的 AND OR 操作符。允许两者结合以进行复杂、高级的过滤。 但是,组合 AND OR 会带来了一个有趣的问题。为了说明这个问题,下面的 SELECT 语句使用组合的 AND OR 操作符建立了一个 WHERE 子句:

-- SQL(像多数语言一样)在处理 OR 操作符前,优先处理 AND 操作符
-- 这里对于1002的供应商就会显示所有产品
SELECT prod_name, prod_price, vend_id
FROM products
WHERE vend_id = 1002 OR vend_id = 1001 
AND prod_price <= 6;

原因在于求值的顺序。SQL(像多数语言一样)在处理 OR 操作符前,优先处理 AND 操作符。此问题的解决方法是使用圆括号对操作符进行明确分组。请看下面的SELECT 语句及输出:

-- 解决方法是使用圆括号对操作符进行明确分组。
SELECT prod_name, prod_price, vend_id
FROM products
WHERE (vend_id = 1002 OR vend_id = 1001) 
AND prod_price <= 6;

这条 SELECT 语句与前一条的唯一差别是,将前两个条件用圆括号括了起来。因为圆括号具有比 AND 或 OR 操作符更高的求值顺序,所以 DBMS首先过滤圆括号内的OR条件。

提示:在 WHERE 子句中使用圆括号

  • 任何时候使用具有 AND OR 操作符的 WHERE 子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认求值顺序,即使它确实如你希望的那样。使用圆括号没有什么坏处,它能消除歧义。

2、IN操作符

  • IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN 取一组由逗号分隔、括在圆括号中的合法值。
  • IN 操作符完成了与 OR 相同的功能,IN能做到的OR也能做到
SELECT prod_name, prod_price, vend_id
FROM products
WHERE vend_id IN (1001, 1002);
IN:WHERE 子句中用来指定要匹配值的清单的关键字,功能与 OR 相当。

3、NOT操作符

WHERE 子句中的 NOT 操作符有且只有一个功能,那就是否定其后所跟的任何条件。因为 NOT 从不单独使用(它总是与其他操作符一起使用),所以它的语法与其他操作符有所不同。NOT 关键字可以用在要过滤的列前,而不仅是在其后。

NOT:WHERE 子句中用来否定其后条件的关键字。

-- NOT 关键字可以用在要过滤的列前,而不仅仅是在其后。
SELECT prod_name, prod_price, vend_id
FROM products
WHERE NOT vend_id IN (1001, 1002);


-- NOT 操作符有且只有一个功能,那就是否定其后所跟的任何条件
SELECT prod_name, prod_price, vend_id
FROM products
WHERE vend_id NOT IN (1001, 1002);

说明:MariaDB 中的 NOT

  • MariaDB 支持使用 NOT 否定 INBETWEEN EXISTS 子句。大多数DBMS 允许使用 NOT 否定任何条件。

4、小结 

  1. 在WHERE中写入多个条件来过滤时,需要使用逻辑操作符AND或者OR,其中AND优先级比OR高,但是()的优先级最高,所有尽量多使用()。
  2. IN 操作符指定条件范围,范围一组逗号和括号表示,在范围中的每个值都可以进行匹配,该功能与OR相当。
  3. NOT关键字用于否定其后的一切条件,从不单独使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值