本篇文章将介绍如何使用SELECT语句的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 |
+---------------+------------+
上例中通过where子句,指定了 prod_price=2.50的过滤条件,这样检索结果只返回prod_price值为2.50的两行。
MySQL支持的WHERE子句操作符:
操作符 | 说明 |
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN...AND... | 在指定的两个值之间 |
下面来看一些具体的使用例子:
检查单个值
相等:列出prod_name的值为Fuses的一行
mysql> select prod_name,prod_price from products where prod_name='fuses';
+-----------+------------+
| prod_name | prod_price |
+-----------+------------+
| Fuses | 3.42 |
+-----------+------------+
MySQL在执行匹配时默认不区分大小写,所以fuses与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 |
+---------------+------------+
不匹配检查,不等于
不等于:列出不是由供应商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 |
| 1005 | JetPack 1000 |
| 1005 | JetPack 2000 |
| 1002 | Oil can |
+---------+--------------+
或者
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 |
+---------+--------------+
范围值检查(BETWEEN...AND...)
下面的例子说明如何使用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 |
+----------------+------------+
从这个例子中可以看到,在使用BETWEEN时,必须指定两个值——所需范围的低端值和高端值。这两个值必须用AND关键字分隔。 BETWEEN匹配范围中所有的值,包括指定的开始值和结束值。
空值检查(NULL)
在一个列不包含值时,称其为包含空值NULL。NULL与字段包含0、空字符串或仅仅包含空格不同。
SELECT语句有一个特殊的WHERE子句,可用来检查具有NULL值的列,这个WHERE子句就是IS NULL子句。
mysql> select cust_id,cust_email from customers where cust_email is null;
+---------+------------+
| cust_id | cust_email |
+---------+------------+
| 10002 | NULL |
| 10005 | NULL |
+---------+------------+
- WHERE子句的位置 在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后, 否则将会产生错误。
- SQL过滤与应用过滤,应用过滤指,SQL的SELECT语句为客户机应用检索出超过实际所需的数据,然后客户机代码对返回数据进行循环,提取出需要的行。
- 应用过滤的缺点:
- 让客户机应用(或开发语言)处理数据库的工作将会极大地影响应用的性能,并且使所创建的应用完全不具备可伸缩性。
- 如果在客户机上过滤数据,服务器不得不通过网络发送多余的数据,这将导致网络带宽的浪费。
- NULL与不匹配:在通过过滤选择出不具有特定值的行时,可能希望返回具有NULL值的行。但是,不行。因为未知具有特殊的含义,数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤时不返回它们。因此,在过滤数据时,一定要验证返回数据中确实给出了被过滤列具有NULL的行。