目录
博主用的是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);
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 否定 IN、BETWEEN 和 EXISTS 子句。大多数DBMS 允许使用 NOT 否定任何条件。
4、小结
- 在WHERE中写入多个条件来过滤时,需要使用逻辑操作符AND或者OR,其中AND优先级比OR高,但是()的优先级最高,所有尽量多使用()。
- IN 操作符指定条件范围,范围一组逗号和括号表示,在范围中的每个值都可以进行匹配,该功能与OR相当。
- NOT关键字用于否定其后的一切条件,从不单独使用。