WHERE子句组合 - IN、NOT操作符 - 过滤数据

阅读:127
	上一节,我们讲到WHERE子句用于过滤数据。本节将讲解组合WHERE子句,包括NOT和IN操作符。

WHERE子句可以多个组合,子句间用AND子句或OR子句。这里AND和OR称为操作符(operator),用来联结WHERE子句的关键字,或称为逻辑操作符。

1 AND操作符

WHERE子句间用AND操作符,表示多个WHERE子句条件都需要满足,这里WHERE子句可以为多个。

下面给出一个例子,查询商品名称为NULL,并且价格大约10000的商品,执行以下SQL:

mysql> SELECT id, pro_price, pro_name FROM t_product WHERE pro_price > 10000 and pro_name IS NULL;
+----+-----------+----------+
| id | pro_price | pro_name |
+----+-----------+----------+
|  7 |  13900.00 | NULL     |
+----+-----------+----------+
1 row in set (0.00 sec)

以上SQL输出品名称为NULL,并且价格大约10000的商品。

2. OR操作符

OR操作符和AND操作符相反,匹配到任一条件的行即可。许多DBMS执行时,满足第一个条件时,其他条件则不再计算。

我们把1.1的查询条件改为OR操作符,即查询商品名称为NULL,或者价格大约10000的商品。执行以下SQL:

mysql> SELECT id, pro_price, pro_name FROM t_product WHERE pro_price > 10000 OR pro_name IS NULL;
+----+-----------+----------------+
| id | pro_price | pro_name       |
+----+-----------+----------------+
|  1 |  12000.00 | Apple phone 12 |
|  7 |  13900.00 | NULL           |
|  8 |   5800.00 | NULL           |
+----+-----------+----------------+
3 rows in set (0.00 sec)

查看输出结果,和1.1不同的是,满足任何一个条件均输出。

3. AND和OR优先级

我们执行一个有意思的SQL,查询商品的sku为5或者1,价格大于5000的商品,如下:

mysql> SELECT id, pro_price, pro_name, pro_sku FROM t_product WHERE pro_sku = 5 OR pro_sku = 1 AND pro_price > 5000;
+----+-----------+---------------+---------+
| id | pro_price | pro_name      | pro_sku |
+----+-----------+---------------+---------+
|  2 |   9800.00 | HUAWEI Mate40 |       1 |
|  5 |   3900.00 | OPPO Reno4    |       5 |
|  6 |   5600.00 | HUAWEI P40    |       1 |
|  7 |  13900.00 | NULL          |       5 |
|  8 |   5800.00 | NULL          |       1 |
+----+-----------+---------------+---------+
5 rows in set (0.00 sec)

这里可以看到价格小于5000的商品也输出了。为什么呢?

因为AND和OR操作符有优先级不同,也就是求值顺序不同。AND操作符优先级高于OR操作符。该句的意思先执行AND操作符,找出所有sku为1的且价格大于5000的商品,然后把商品sku为5的全部输出。

解决此问题的最好方式,是使用圆括号,事实上,无论任何时候使用圆括号都是最好的方式,不要过分依赖求值顺序。

我们使用圆括号后,执行以下SQL:

mysql> SELECT id, pro_price, pro_name, pro_sku FROM t_product WHERE (pro_sku = 5 OR pro_sku = 1) AND pro_price > 5000;
+----+-----------+---------------+---------+
| id | pro_price | pro_name      | pro_sku |
+----+-----------+---------------+---------+
|  2 |   9800.00 | HUAWEI Mate40 |       1 |
|  6 |   5600.00 | HUAWEI P40    |       1 |
|  7 |  13900.00 | NULL          |       5 |
|  8 |   5800.00 | NULL          |       1 |
+----+-----------+---------------+---------+
4 rows in set (0.00 sec)

4. IN操作符

IN操作符用来指定条件范围,范围中任一条件都可以进行匹配。IN操作符用圆括号,中间多个条件用逗号分隔。

我们现在找出商品的sku为1或5的商品,执行以下SQL:

mysql> SELECT id, pro_price, pro_name, pro_sku FROM t_product WHERE pro_sku IN (1, 5);
+----+-----------+---------------+---------+
| id | pro_price | pro_name      | pro_sku |
+----+-----------+---------------+---------+
|  2 |   9800.00 | HUAWEI Mate40 |       1 |
|  5 |   3900.00 | OPPO Reno4    |       5 |
|  6 |   5600.00 | HUAWEI P40    |       1 |
|  7 |  13900.00 | NULL          |       5 |
|  8 |   5800.00 | NULL          |       1 |
+----+-----------+---------------+---------+
5 rows in set (0.00 sec)

注意,IN操作符完成了和OR操作符相同的功能。那么为什么还是使用IN操作符呢?IN操作符币OR操作符有如下优势:

  • IN操作符清晰明了,直观。
  • 使用IN操作符无需关注优先级,求值顺序容易管理。
  • IN操作符执行更快。
  • IN操作符可以包含SELECT语句,可以动态建立WHERE子句。

 

5. NOT操作符

用于否定其后的条件。注意,NOT操作符从不单独使用,都是和其他操作符一起使用。

现在我们检索所有商品的sku不是1和不是5的商品。执行以下SQL:

mysql> SELECT id, pro_price, pro_name, pro_sku FROM t_product WHERE pro_sku NOT IN (1, 5);
+----+-----------+----------------+---------+
| id | pro_price | pro_name       | pro_sku |
+----+-----------+----------------+---------+
|  1 |  12000.00 | Apple phone 12 |       2 |
|  4 |   4800.00 | XiaoMi 10      |       3 |
+----+-----------+----------------+---------+
2 rows in set (0.00 sec)

总结:

  • WHERE子句可以多个组合,用AND和OR操作符联结起来。
  • AND操作符表示多个条件都需要同时满足。
  • OR操作符,满足一个条件即可。
  • IN操作符,用于匹配括号内任一条件。
  • NOT是否定后面的条件。

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

全部评论

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