过滤数据

Posted 霖行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了过滤数据相关的知识,希望对你有一定的参考价值。

过滤数据

本章将讲授如何使用SELECT语句的WHERE子句指定搜索条件。

使用WHERE子句

数据库一般包含大量的数据,很少需要检索表中所有的行。通常只会根据需求来提取部分表数据。只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)。

在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE关键字位于FROM关键字后。

mysql> SELECT prod_name, prod_price
    -> FROM products
    -> WHERE prod_price = 2.50;
+---------------+------------+
| prod_name     | prod_price |
+---------------+------------+
| Carrots       |       2.50 |
| TNT (1 stick) |       2.50 |
+---------------+------------+
2 rows in set (0.01 sec)

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

  • SQL过滤与应用过滤 数据也可以在应用层过滤。让数据库返回大量原始数据,然后在客户机进行遍历检索。但这将会极大影响客户机性能,并且客户机应用将缺乏可伸缩性,再者多余数据导致网络宽带的浪费。
  • WHERE子句的位置 在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE后,否则会产生错误(ORDER BY的使用:MySQL必知必会——第五章排序检索数据)。

WHERE子句操作符

MySQL支持的条件操作符:

操作符说明
=等于
<>、!=不等于
<小于
<=小于等于
>大于
>=大于等于
BETWEEN在指定的两个值间

检查单个值

检索文本值:

mysql> SELECT prod_name, prod_price
    -> FROM products
    -> WHERE prod_name = 'fuses';
+-----------+------------+
| prod_name | prod_price |
+-----------+------------+
| Fuses     |       3.42 |
+-----------+------------+
1 row in set (0.00 sec)

WHERE prod_name = 'fuses’语句,它返回prod_name的值为Fuses的一行。

列出价格小于10的所有产品:

mysql> SELECT prod_name, prod_price
    -> FROM products
    -> WHERE prod_price < 10;
+---------------+------------+
| prod_name     | prod_price |
+---------------+------------+
| .5 ton anvil  |       5.99 |
| 1 ton anvil   |       9.99 |
| Carrots       |       2.50 |
| Fuses         |       3.42 |
| Oil can       |       8.99 |
| Sling         |       4.49 |
| TNT (1 stick) |       2.50 |
+---------------+------------+
7 rows in set (0.00 sec)

列出价格小于等于10的所有产品:

mysql> SELECT prod_name, prod_price
    -> FROM products
    -> WHERE prod_price <= 10;
+----------------+------------+
| prod_name      | prod_price |
+----------------+------------+
| .5 ton anvil   |       5.99 |
| 1 ton anvil    |       9.99 |
| Bird seed      |      10.00 |
| Carrots        |       2.50 |
| Fuses          |       3.42 |
| Oil can        |       8.99 |
| Sling          |       4.49 |
| TNT (1 stick)  |       2.50 |
| TNT (5 sticks) |      10.00 |
+----------------+------------+
9 rows in set (0.00 sec)

不匹配检查

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

mysql> SELECT vend_id, prod_name
    -> FROM products
    -> WHERE vend_id <> 1003;
+---------+--------------+
| vend_id | prod_name    |
+---------+--------------+
|    1001 | .5 ton anvil |
|    1001 | 1 ton anvil  |
|    1001 | 2 ton anvil  |
|    1002 | Fuses        |
|    1002 | Oil can      |
|    1005 | JetPack 1000 |
|    1005 | JetPack 2000 |
+---------+--------------+
7 rows in set (0.01 sec)

这里的 <> 可以替换成 !=

  • 何时使用引号 观察上述例子,会看到有些过滤条件的值括在单引号内(如,‘fuses’)。这里单引号是用来限定字符串的。在MySQL中,将值与字符串类型的列进行比较需要限定引号。而与数值列进行比较的值不用引号。

范围值检查

为了检查某个范围的值,可以使用BETWEEN操作符。其语法与其他操作符略有不同,它需要两个值,范围的开始值与结束值。

检索价格在5和10之间的产品:

mysql> SELECT prod_name, prod_price
    -> FROM products
    -> WHERE prod_price BETWEEN 5 AND 10;
+----------------+------------+
| prod_name      | prod_price |
+----------------+------------+
| .5 ton anvil   |       5.99 |
| 1 ton anvil    |       9.99 |
| Bird seed      |      10.00 |
| Oil can        |       8.99 |
| TNT (5 sticks) |      10.00 |
+----------------+------------+
5 rows in set (0.00 sec)

使用BETWEEN时,必须指定它的开始值与结束值。这两个值必须用AND关键字分隔。数据过滤时,开始值与结束值也包括在结果内。

空值检查

在创建表时,可以指定其中的列是否可以不包含值。一个列不包含值时,称其为包含空值NULL。

NULL 无值(no value),它与字段包含0、空字符或仅仅包含空格不同。

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

mysql> SELECT prod_name
    -> FROM products
    -> WHERE prod_price IS NULL;
Empty set (0.00 sec)

当要检索的列没有无值的行时,不返回数据。

mysql> SELECT cust_id
    -> FROM customers
    -> WHERE cust_email IS NULL;
+---------+
| cust_id |
+---------+
|   10002 |
|   10005 |
+---------+
2 rows in set (0.01 sec)

这条语句显示没有填写邮箱的顾客。

  • NULL与不匹配 在通过过滤选择出不具有特定值的行时,你可能希望返回具有NULL值的行。但未知具有特殊的含义,数据库不知道它们是否匹配,所有过滤时不会返回具有NULL值的行。

以上是关于过滤数据的主要内容,如果未能解决你的问题,请参考以下文章

使用数据表表单过滤器过滤报告

Spark RDD数据过滤

数据过滤器显示没有要过滤的内容

NGS 数据过滤之 Trimmomatic 详细说明

重置剑道多过滤器复选框数据源以反映过滤后的数据

数据过滤算法