WHERE子句 - 过滤数据

阅读:129
上一节,我们讲到对数据进行排序。本节开始我们讲解对数据进行过滤,WHERE子句。

1. WHERE子句

当数据库中有很多数据时,我们往往只需要一部分感兴趣的数据,那么就需要对数据进行过滤。

在SELECT语句中,WHERE子句时在FROM子句之后。

我们以t_product商品表为例,现在有个需求,需要找出价格为5600的商品,执行以下SQL语句并输出:

mysql> SELECT id, pro_price, pro_name FROM t_product WHERE pro_price = 5600;
+----+-----------+------------+
| id | pro_price | pro_name   |
+----+-----------+------------+
|  6 |   5600.00 | HUAWEI P40 |
+----+-----------+------------+
1 row in set (0.01 sec)

这里不输出所有的行,只输出价格为5600的商品HUAWEI P40。

在实际开发中,对结果过滤,也可以在应用系统中进行。但是,缺陷也是显而易见的,比如SQL直接输出100万条数据,那么应用程序就需要循环出所有的数据,然后找到符合条件的结果。缺陷是:

  • 消耗了应用的性能。
  • 应用和数据库往往不是在同一台服务器上,多余数据需要网络传输,浪费带宽。

 

注意,􏰥􏱝􏰾􏱷􏰒 当ORDER BY子句和 WHERE子句同时出现时 􏰖􏰔􏰾,􏱫􏴊􏳪 ORDER BY 􏴈􏱎应该在WHERE 之后􏱒􏰞,狗则会报错。

􏱃􏴋􏲈􏲕􏱾􏴌􏴍􏴎2. WHERE子句操作符

上面我们在WHERE子句后是用等号过滤出相同的数据,那么,等号就是条件操作符。其实在SQL支持很多条件操作符。

 

编号操作符说明
1=等于
2<>不等于
3!=不等于
4<小于
5<=小于等于
6!<不小于
7>大于
8>=大于等于
9!>不大于
10BETWEEN在指定的两个值之间
11IS NULL为NULL值

 

注:有些操作符不是所有的DBMS都是支持的,如<>、!=等,具体可参考相应的手册。

2.1 操作符举例

我们现在以一部分的操作符,进行举例。

现在我们查询所有商品价格大于5600的商品,执行以下SQL:

mysql> SELECT id, pro_price, pro_name FROM t_product WHERE pro_price > 5600;
+----+-----------+----------------+
| id | pro_price | pro_name       |
+----+-----------+----------------+
|  1 |  12000.00 | Apple phone 12 |
|  2 |   9800.00 | HUAWEI Mate40  |
+----+-----------+----------------+

可以看到结果符合预期,列出商品大于5600的所有商品。

 

我们看第二个例子,查询出所有商品名称不是HUAWEI Mate40的商品,执行以下SQL:

mysql> SELECT id, pro_price, pro_name FROM t_product WHERE pro_name <> 'HUAWEI Mate40';
+----+-----------+----------------+
| id | pro_price | pro_name       |
+----+-----------+----------------+
|  1 |  12000.00 | Apple phone 12 |
|  4 |   4800.00 | XiaoMi 10      |
|  5 |   3900.00 | OPPO Reno4     |
|  6 |   5600.00 | HUAWEI P40     |
+----+-----------+----------------+
4 rows in set (0.01 sec)

以上列出了所有不是HUAWEI Mate40的手机。

注:上面查询的SQL WHERE条件加了单引号,那么什么时候需要加单引号查询呢?如果是字符型列进行比较,就需要单引号,数值型不用引号。

 

范围查询。很多时候我们需要进行范围查询,比如,查询商品价格在3900-9800的商品,执行以下SQL:

mysql> SELECT id, pro_price, pro_name FROM t_product WHERE pro_price BETWEEN 3900 AND 9800;
+----+-----------+---------------+
| id | pro_price | pro_name      |
+----+-----------+---------------+
|  2 |   9800.00 | HUAWEI Mate40 |
|  4 |   4800.00 | XiaoMi 10     |
|  5 |   3900.00 | OPPO Reno4    |
|  6 |   5600.00 | HUAWEI P40    |
+----+-----------+---------------+
4 rows in set (0.00 sec)

BETWEEN是范围查询,开始值和结束值用AND隔开。

空值检查。在表设计时,有些列是允许为空值的。如果一个列中有不包含值时,则为NULL。注意,NULL,无值(no value),和包含0、空字符串或空格等是不同的。检索空值列时,需要用IS NULL操作符子句。

现在在t_product表中,插入两条为空值的数据。执行以下SQL:

INSERT INTO `t_product` VALUES (7, NULL, 13900.00, 5);
INSERT INTO `t_product` VALUES (8, NULL, 5800.00, 1);

检索所有商品名称为NULL的商品,执行SQL:

mysql> SELECT id, pro_price, pro_name FROM t_product WHERE pro_name IS NULL;
+----+-----------+----------+
| id | pro_price | pro_name |
+----+-----------+----------+
|  7 |  13900.00 | NULL     |
|  8 |   5800.00 | NULL     |
+----+-----------+----------+
2 rows in set (0.00 sec)

 

总结:

  • 对检索数据进行过滤使用WHERE子句。在SELECT语句中,WHERE子句时在FROM子句之后。
  • WHERE子句支持很多操作符。操作符各个DBMS支持有所不同,这个需要查询DBMS官方手册。

读后有收获,请作者喝杯咖啡

全部评论

发表评论
更多精彩内容,请关注微信公众号