《MySQL必知必会》—— 6.过滤数据 7.数据过滤

目录

六、过滤数据

使用WHERE字句

WHERE字句操作符

七、数据过滤

7.1 组合WHERE字句

AND操作符

OR操作符

计算次序

7.2 IN操作符

7.3 NOT 操作符


六、过滤数据

使用WHERE字句

指定搜索条件(过滤条件)

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.02 sec)

ps. ORDER BY字句应该在WHERE字句的后面。

WHERE字句操作符

WHERE字句操作符
操作符说明
=

等于

<>不等于
!=不等于
<小于
<=小于等于
>大于
>=大于等于
BETWEEN ... AND ...

在指定的两个值之间

包括开始值和结束值

IS NULL

空值检查

不是值为0,是没有值

ps. 限定字符串的时候需要加单引号.

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)

mysql> SELECT prod_name, prod_price
    -> FROM products
    -> WHERE prod_price < 5;
+---------------+------------+
| prod_name     | prod_price |
+---------------+------------+
| Carrots       |       2.50 |
| Fuses         |       3.42 |
| Sling         |       4.49 |
| TNT (1 stick) |       2.50 |
+---------------+------------+
4 rows in set (0.00 sec)

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.00 sec)

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)

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

mysql> SELECT cust_id
    -> FROM customers
    -> WHERE cust_email IS NOT NULL;
+---------+
| cust_id |
+---------+
|   10001 |
|   10003 |
|   10004 |
+---------+
3 rows in set (0.00 sec)

七、数据过滤

7.1 组合WHERE字句

多个WHERE字句用:AND 或者 OR的方式使用

AND操作符

AND:返回满足所有给定条件的行。当有多个过滤条件时,每添加一条使用一个AND。

检索:由供应商1003制造的价格小于等10美元的所有产品的名称和价格。

mysql> SELECT prod_id, prod_price, prod_name
    -> FROM products
    -> WHERE vend_id = 1003 AND prod_price <= 10;
+---------+------------+----------------+
| prod_id | prod_price | prod_name      |
+---------+------------+----------------+
| FB      |      10.00 | Bird seed      |
| FC      |       2.50 | Carrots        |
| SLING   |       4.49 | Sling          |
| TNT1    |       2.50 | TNT (1 stick)  |
| TNT2    |      10.00 | TNT (5 sticks) |
+---------+------------+----------------+
5 rows in set (0.01 sec)

OR操作符

OR:检索匹配任一条件的行,而不是所有条件。

检索:任何制造商是1002或1003中的产品名字和价格。如果写成AND,将没有数据返回。

mysql> SELECT prod_name, prod_price
    -> FROM products
    -> WHERE vend_id = 1002 OR vend_id = 1003;
+----------------+------------+
| prod_name      | prod_price |
+----------------+------------+
| Fuses          |       3.42 |
| Oil can        |       8.99 |
| Detonator      |      13.00 |
| Bird seed      |      10.00 |
| Carrots        |       2.50 |
| Safe           |      50.00 |
| Sling          |       4.49 |
| TNT (1 stick)  |       2.50 |
| TNT (5 sticks) |      10.00 |
+----------------+------------+
9 rows in set (0.00 sec)

mysql> SELECT prod_name, prod_price
    -> FROM products
    -> WHERE vend_id = 1002 AND vend_id = 1003;
Empty set (0.00 sec)

计算次序

检索:价格是10美元(含)以上 且 由1002或1003制造的的所有产品。

加入不加括号来约束:出现了价格小于10的产品,因为AND的优先级大于OR的优先级;

所以该WHERE语句的实际结果是:制造商是1002 或者 价格是10美元(含)以上且由1003制造 的产品

mysql> SELECT prod_name, prod_price, vend_id
    -> FROM products
    -> WHERE vend_id = 1002 OR vend_id = 1003 AND prod_price >= 10;
+----------------+------------+---------+
| prod_name      | prod_price | vend_id |
+----------------+------------+---------+
| Fuses          |       3.42 |    1002 |
| Oil can        |       8.99 |    1002 |
| Detonator      |      13.00 |    1003 |
| Bird seed      |      10.00 |    1003 |
| Safe           |      50.00 |    1003 |
| TNT (5 sticks) |      10.00 |    1003 |
+----------------+------------+---------+
6 rows in set (0.00 sec)

正确结果如下:

mysql> SELECT prod_name, prod_price, vend_id
    -> FROM products
    -> WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;
+----------------+------------+---------+
| prod_name      | prod_price | vend_id |
+----------------+------------+---------+
| Detonator      |      13.00 |    1003 |
| Bird seed      |      10.00 |    1003 |
| Safe           |      50.00 |    1003 |
| TNT (5 sticks) |      10.00 |    1003 |
+----------------+------------+---------+
4 rows in set (0.00 sec)

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

7.2 IN操作符

IN操作符用来指定条件范围,范围中每个条件都可以进行匹配。功能上等于OR,但是语法更直观、更快、可以包含其他SELECT语句。

IN取合法值的用逗号分割,包括在圆括号内。

mysql> SELECT prod_name, prod_price, vend_id
    -> FROM products
    -> WHERE vend_id IN (1002, 1003)
    -> ORDER BY prod_name;
+----------------+------------+---------+
| prod_name      | prod_price | vend_id |
+----------------+------------+---------+
| Bird seed      |      10.00 |    1003 |
| Carrots        |       2.50 |    1003 |
| Detonator      |      13.00 |    1003 |
| Fuses          |       3.42 |    1002 |
| Oil can        |       8.99 |    1002 |
| Safe           |      50.00 |    1003 |
| Sling          |       4.49 |    1003 |
| TNT (1 stick)  |       2.50 |    1003 |
| TNT (5 sticks) |      10.00 |    1003 |
+----------------+------------+---------+
9 rows in set (0.00 sec)

7.3 NOT 操作符

NOT:否定它之后的任何条件。和 IN 联合使用找出与条件列表不匹配的行。

MySQL中的NOT:支持使用NOT对IN,BETWEEN和EXISTS字句取反。这和其他多数DBMS允许使用NOT对各种条件取反不大一样。

检索:除了1002和1003之外的所有供应商的产品。

mysql> SELECT prod_name, prod_price, vend_id
    -> FROM products
    -> WHERE vend_id NOT IN (1002, 1003)
    -> ORDER BY prod_name;
+--------------+------------+---------+
| prod_name    | prod_price | vend_id |
+--------------+------------+---------+
| .5 ton anvil |       5.99 |    1001 |
| 1 ton anvil  |       9.99 |    1001 |
| 2 ton anvil  |      14.99 |    1001 |
| JetPack 1000 |      35.00 |    1005 |
| JetPack 2000 |      55.00 |    1005 |
+--------------+------------+---------+
5 rows in set (0.00 sec)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值