mysql必知必会--数 据 过 滤

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

组合 WHERE 子句

第6章中介绍的全部 WHERE 子句在过滤数据时使用的都是单一的条
件。为了进行更强的过滤控制,MySQL容许给出多个 WHERE 子句。这些子
句能够两种方式使用:以 AND 子句的方式或 OR 子句的方式使用blog

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

AND操做符

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

此SQL语句检索由供应商 1003 制造且价格小于等于10美圆的所
有产品的名称和价格。这条 SELECT 语句中的 WHERE 子句包含两
个条件,而且用 AND 关键字联结它们。 AND 指示DBMS只返回知足全部给
定条件的行。若是某个产品由供应商 1003 制造,但它的价格高于10美圆,
则不检索它。相似,若是产品价格小于10美圆,但不是由指定供应商制
造的也不被检索。搜索

AND 用在 WHERE 子句中的关键字,用来指示检索知足全部给定
条件的行。
上述例子中使用了只包含一个关键字 AND 的语句,把两个过滤条件组
合在一块儿。还能够添加多个过滤条件,每添加一条就要使用一个 AND 。语法

OR 操做符

OR 操做符与 AND 操做符不一样,它指示MySQL检索匹配任一条件的行。
请看以下的 SELECT 语句

此SQL语句检索由任一个指定供应商制造的全部产品的产品
名和价格。 OR 操做符告诉DBMS匹配任一条件而不是同时匹配
两个条件。方法

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

计算次序

WHERE 可包含任意数目的 AND 和 OR 操做符。容许二者结合以进行复杂
和高级的过滤d3

可是,组合 AND 和 OR 带来了一个有趣的问题。为了说明这个问题,来
看一个例子。假如须要列出价格为10美圆(含)以上且由 1002 或 1003 制
造的全部产品。下面的 SELECT 语句使用 AND 和 OR 操做符的组合创建了一个
WHERE 子句
数据

请看上面的结果。返回的行中有两行价格小于10美圆,显然,
返回的行未按预期的进行过滤。为何会这样呢?缘由在于计
算的次序。SQL(像多数语言同样)在处理 OR 操做符前,优先处理 AND 操
做符。当SQL看到上述 WHERE 子句时,它理解为由供应商 1003 制造的任何
价格为10美圆(含)以上的产品,或者由供应商 1002 制造的任何产品,
而无论其价格如何。换句话说,因为 AND 在计算次序中优先级更高,操做
符被错误地组合了db

此问题的解决方法是使用圆括号明确地分组相应的操做符。请看下
面的 SELECT 语句

这条 SELECT 语句与前一条的惟一差异是,这条语句中,前两个
条件用圆括号括了起来。由于圆括号具备较 AND 或 OR 操做符高
的计算次序,DBMS首先过滤圆括号内的 OR 条件。这时,SQL语句变成了
选择由供应商 1002 或 1003 制造的且价格都在10美圆(含)以上的任何产
品,这正是咱们所但愿的
在WHERE子句中使用圆括号 任什么时候候使用具备 AND 和 OR 操做
符的 WHERE 子句,都应该使用圆括号明确地分组操做符。不要
过度依赖默认计算次序,即便它确实是你想要的东西也是如
此。使用圆括号没有什么坏处,它能消除歧义。

IN 操做符

圆括号在 WHERE 子句中还有另一种用法。 IN 操做符用来指定条件范
围,范围中的每一个条件均可以进行匹配。 IN 取合法值的由逗号分隔的清
单,全都括在圆括号中。下面的例子说明了这个操做符

此 SELECT 语句检索供应商 1002 和 1003 制造的全部产品。 IN 操
做符后跟由逗号分隔的合法值清单,整个清单必须括在圆括号
中。

若是你认为 IN 操做符完成与 OR 相同的功能,那么你的这种猜想是对
的。下面的SQL语句完成与上面的例子相同的工做

为何要使用 IN 操做符?其优势具体以下。

  • 在使用长的合法选项清单时, IN 操做符的语法更清楚且更直观。
  • 在使用 IN 时,计算的次序更容易管理(由于使用的操做符更少)。
  • IN 操做符通常比 OR 操做符清单执行更快。
  • IN 的最大优势是能够包含其余 SELECT 语句,使得可以更动态地建
    立 WHERE 子句。第14章将对此进行详细介绍

IN WHERE 子句中用来指定要匹配值的清单的关键字,功能与 OR
至关

NOT 操做符

WHERE 子句中的 NOT 操做符有且只有一个功能,那就是否认它以后所
跟的任何条件

NOT WHERE 子句中用来否认后跟条件的关键字。

为何使用 NOT ?对于简单的 WHERE 子句,使用 NOT 确实没有什么优
势。但在更复杂的子句中, NOT 是很是有用的。例如,在与 IN 操做符联合
使用时, NOT 使找出与条件列表不匹配的行很是简单

MySQL中的NOT MySQL支持使用 NOT 对 IN 、 BETWEEN 和
EXISTS子句取反,这与多数其余 DBMS容许使用 NOT 对各类条件

本章讲授如何用 AND 和 OR 操做符组合成 WHERE 子句,并且还讲授了如 何明确地管理计算的次序,如何使用 IN 和 NOT 操做符 取反有很大的差异

相关文章
相关标签/搜索