《MySQL必知必会》第6-7章 过滤数据与数据过滤

1. WHERE子句

根据WHERE子句中指定的搜索条件进行过滤,WHERE子句在表名之后给出.

1
2
3
4
5
6
7
8
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)

在同时使用ORDERBY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误

2. WHERE子句操作符

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

3. WHERE子句操作

3.1 检索单个值

1
2
3
4
5
6
7
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在执行匹配时默认不区分大小写,所以fuses与Fuses匹配。

3.2 不匹配检查

1
2
3
4
5
6
7
8
9
10
11
12
13
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 |
| 1005 | JetPack 1000 |
| 1005 | JetPack 2000 |
| 1002 | Oil can |
+---------+--------------+
7 rows in set (0.00 sec)
`<>`和`!=`的作用是相同的,上面的语句还可以写作: `select vend_id,prod_name from products where vend_id != 1003;`

如果仔细观察上述WHERE子句中使用的条件,会看到有的值括在单引号内(如前面使用的’fuses’),而有的值未括起来。单引号用来限定字符串。如果将值与串类型的列进行比较,则需要限定引号。用来与数值列进行比较的值不用引号。

3.3 范围检查

检查某个范围的值,可使用BETWEEN操作符。它需要两个值,即范围的开始值和结束值。

1
2
3
4
5
6
7
8
9
10
11
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)

3.4 空值检查

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

1
2
3
4
5
6
7
8
mysql> select cust_id from customers where cust_email is null;
+---------+
| cust_id |
+---------+
| 10002 |
| 10005 |
+---------+
2 rows in set (0.00 sec)

4. 组合WHERE子句

4.1 AND操作符

通过不止一个列进行过滤,可使用AND操作符给WHERE子句附加条件。
用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。

1
2
3
4
5
6
7
8
9
10
11
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.00 sec)

添加多个过滤条件,每添加一条就要使用一个AND。

4.2 OR操作符

OR操作符告诉DBMS匹配任一条件而不是同时匹配两个条件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> select prod_name,prod_price from products where vend_id = 1002 or vend_id = 1003;
+----------------+------------+
| prod_name | prod_price |
+----------------+------------+
| Detonator | 13.00 |
| Bird seed | 10.00 |
| Carrots | 2.50 |
| Fuses | 3.42 |
| Oil can | 8.99 |
| Safe | 50.00 |
| Sling | 4.49 |
| TNT (1 stick) | 2.50 |
| TNT (5 sticks) | 10.00 |
+----------------+------------+
9 rows in set (0.00 sec)

4.3 计算次序

SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。

1
2
3
4
5
6
7
8
9
10
mysql> select prod_name,prod_price from products where (vend_id = 1002 or vend_id = 1003) and prod_price >=10;
+----------------+------------+
| prod_name | prod_price |
+----------------+------------+
| Detonator | 13.00 |
| Bird seed | 10.00 |
| Safe | 50.00 |
| TNT (5 sticks) | 10.00 |
+----------------+------------+
4 rows in set (0.00 sec)

圆括号具有较AND或OR操作符高的计算次序,DBMS首先过滤圆括号内的OR条件。
任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认计算次序,即使它确实是你想要的东西也是如此。使用圆括号没有什么坏处,它能消除歧义。

5. IN操作符

IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全都括在圆括号中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> select prod_name,prod_price from products where vend_id in (1002,1003) order by prod_name;
+----------------+------------+
| prod_name | prod_price |
+----------------+------------+
| Bird seed | 10.00 |
| Carrots | 2.50 |
| Detonator | 13.00 |
| Fuses | 3.42 |
| Oil can | 8.99 |
| Safe | 50.00 |
| Sling | 4.49 |
| TNT (1 stick) | 2.50 |
| TNT (5 sticks) | 10.00 |
+----------------+------------+
9 rows in set (0.00 sec)

IN操作符 WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。

IN操作符的优点:

  • 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。
  • 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
  • IN操作符一般比OR操作符清单执行更快。
  • IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。第14章将对此进行详细介绍。

6. NOT操作符

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

1
2
3
4
5
6
7
8
9
10
11
mysql> select prod_name,prod_price from products where vend_id not in (1002,1003) order by prod_name;
+--------------+------------+
| prod_name | prod_price |
+--------------+------------+
| .5 ton anvil | 5.99 |
| 1 ton anvil | 9.99 |
| 2 ton anvil | 14.99 |
| JetPack 1000 | 35.00 |
| JetPack 2000 | 55.00 |
+--------------+------------+
5 rows in set (0.00 sec)

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

Tips

欢迎收藏和转发,感谢你的支持!(๑•̀ㅂ•́)و✧

欢迎关注我:后端小哥,专注后端开发,希望和你一起进步!