MySQL过滤数据-WHERE子句

这次我们继续学习如何使用SELECT语句的WHERE子句指定搜索条件,达到对数据进行过滤的目的。

1.使用WHERE子句

数据库表一般包含大量的数据,通常只会根据特定操作或报告的需要提取表数据的子集。

(1)在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM之后)之后给出:

这条语句从products表中检索两个列,但不返回所有行,只返回prod_price值为2.50的行。

(2)WHERE子句的位置:在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误。

2.WHERE子句操作符

(1)MySQL支持下面列出的所有条件操作符:

(2)检索单个值

我们已经看到了上述测试相等的例子。下面是一个类似的例子:

(3)不匹配检查

列出不是由供应商1003制造的所有产品:

WARNING:何时使用引号?单引号用来限定字符串。如果将值与串类型的列进行比较,则需要限定引号。用来与数值列进行比较的值不用引号。

(4)范围值检查——BETWEEN

检索价格在5美元和10美元之间的所有产品:

在使用BETWEEN时,必须指定两个值,这两个值必须用AND关键字分隔。

(5)空值检查——IS NULL

SELECT语句有一个特殊的WHERE子句,可用来检查具有NULL值的列:

接下来,我们将学习组合WHERE子句以建立功能更强的更高级的搜索条件。并学习如何使用NOT和IN操作符。

3.组合WHERE子句

前面介绍的WHERE子句在过滤数据时使用的都是单一的条件。为了进行更强的过滤控制,MySQL允许给出多个WHERE子句。这些子句可以两种方式使用:以AND子句的方式或OR子句的方式使用。

(1)AND操作符——用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。

(2)OR操作符——WHERE子句中使用的关键字,用来表示检索匹配任一给定条件的行。

(3)计算次序

WHERE可包含任意数目的AND和OR操作符。但是,组合AND和OR带来一个问题:假如需要列出价格为10元以上且由1002或1003制造的所有产品,考虑下面的语句是否正确?

由输出结果,存在价格小于10的行。原因在于计算的次序。

  • SQL在处理OR操作符前,优先处理AND操作符。上面的语句,它理解为:“由供应商1003制造的价格为10元以上的产品,或者有供应商1002制造的任何产品,而不管其价格如何。”
  • 换句话说,AND在计算次序中优先级更高。
  • 解决此问题的方法是使用圆括号明确地分组相应的操作符:

    WARNING:任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认计算次序。
4.IN操作符

(1)圆括号在WHERE子句中还有另外一种用法。IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。

(2)IN操作符完成与OR相同的功能,上述输入语句等价于:

  • IN操作符的优点如下:

1)在使用长的合法选项清单时,IN操作符的语法更清楚且更直观;
2)在使用IN时,计算的次序更容易管理;
3)IN操作符一般比OR操作符执行的更快;
4)IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。

5.NOT操作符

(1)WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。

(2)列出除1002和1003之外的所有供应商制造的产品:

WARNING:MySQL中的NOT——MySQL支持使用NOT对IN、BETWEEN和EXISTS子句取反,这与多数其他DBMS允许使用NOT对各种条件取反有很大的差别。

发表评论

电子邮件地址不会被公开。 必填项已用*标注