SQL必知必会总结5 高级数据过滤(AND、OR、IN、NOT)

如何组合 WHERE 子句以建立功能更强、更高级的搜索条件?如何使用 NOT 和 IN 操作符?

5.1组合 WHERE 子句

总结 4 所有 WHERE 子句在过滤数据时使用的都是单一的条件。为了进行更强的过滤控制,SQL 允许给出多个 WHERE 子句。这些子句有两种使用方式,即以 AND 子句或 OR 子句的方式使用。
操作符(operator)
用来联结或改变 WHERE 子句中的子句的关键字,也称为逻辑操作符(logical operator)。

5.1.1 AND操作符

要通过不止一个列进行过滤,可以使用 AND 操作符给 WHERE 子句附加条件。

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

在这里插入图片描述
AND
用在 WHERE 子句中的关键字,用来指示检索满足所有给定条件的行。

说明:没有 ORDER BY 子句
在每个SOL语句末尾可以加上一个 ORDER BY 子句,它应该放在 WHERE 子句之后。

5.1.2 OR操作符

OR 操作符与 AND 操作符正好相反,OR 操作符告诉 DBMS 匹配任一条件而不是同时匹配两个条件。

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

SQL必知必会总结5 高级数据过滤(AND、OR、IN、NOT)_第1张图片
OR
WHERE 子句中使用的关键字,用来表示检索匹配任一给定条件的行。

5.1.3 求值顺序

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

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

在这里插入图片描述
因为圆括号具有比 AND 或 OR 操作符更高的求值顺序,所以 DBMS首先过滤圆括号内的OR条件。
优先级:()> AND > OR
提示:在 WHERE 子句中使用圆括号
任何时候使用具有 AND 和 OR 操作符的 WHERE 子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认求值顺序,即使它确实如你希望的那样。使用圆括号没有什么坏处,它能消除歧义。

5.2 IN 操作符

IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN 取一组由逗号分隔、括在圆括号中的合法值。

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

SQL必知必会总结5 高级数据过滤(AND、OR、IN、NOT)_第2张图片
IN 操作符后跟由逗号分隔的合法值,这些值必须括在圆括号中。IN 操作符完成了与 OR 相同的功能。

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

SQL必知必会总结5 高级数据过滤(AND、OR、IN、NOT)_第3张图片
为什么要使用 IN 操作符?其优点如下。
 在有很多合法选项时,IN 操作符的语法更清楚,更直观。
 在与其他 AND 和 OR 操作符组合使用 IN 时,求值顺序更容易管理。
 IN 操作符一般比一组 OR 操作符执行得更快(在上面这个合法选项很少的例子中,你看不出性能差异)。
 IN 的最大优点是可以包含其他 SELECT 语句,能够更动态地建立WHERE 子句。
IN
WHERE 子句中用来指定要匹配值的清单的关键字,功能与 OR 相当。

5.3 NOT 操作符

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

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

SQL必知必会总结5 高级数据过滤(AND、OR、IN、NOT)_第4张图片
上面的例子也可以使用<>操作符来完成

SELECT prod_name 
FROM Products 
WHERE vend_id <> 'DLL01' 
ORDER BY prod_name;

SQL必知必会总结5 高级数据过滤(AND、OR、IN、NOT)_第5张图片
对于这里的这种简单的 WHERE 子句,使用 NOT 确实没有什么优势。但在更复杂的子句中,NOT 是非常有用的。例如,在与 IN 操作符联合使用时,NOT 可以非常简单地找出与条件列表不匹配的行。

说明:MariaDB 中的 NOT
MariaDB 支持使用 NOT 否定 IN、BETWEEN 和 EXISTS 子句。大多数DBMS 允许使用 NOT 否定任何条件。

你可能感兴趣的:(SQL,必知必会)