使用WHERE子句

数据库一般都包含大量的数据,很少需要检索表中的所有行,通常只需要检索一部分

检索所需的数据需要指定搜索条件(searsh criteria)或称为过滤条件(filter condition)

这时就需要在FROM子句后加上WHERE子句

1
2
3
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;

提示:SQL 过滤与应用过滤

当然你也可以选择在接收到数据后在应用层过滤,但 墙裂不建议这样做 ,一来会浪费带宽,而来更加浪费时间

注意:WHERE 子句的位置

在同时使用 ORDER BYWHERE 子句时,应该让 ORDER BY 位于 WHERE 之后,否则将产生错误 (关于 ORDER BY请看上一篇

WHERE 子句的操作符

下表列出了所有操作符

操作符 说明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
!< 不小于
> 大于
>= 大于等于
!> 不大于
BETWEEN 在指定的两个值之间
IS NULL NULL
注意:操作符兼容

表中列出的操作符有些是冗余的(如<>!=!<>=),并非所有的DBMS都支持这些操作符(例如MySQL不支持!>!<),请参阅你所使用的DBMS的文档

下面来看几个例子

比较单个值

列出所有价格小于 10 美元的产品

1
2
3
SELECT prod_name, prod_price
FROM Products
WHERE prod_price < 10;

不匹配检查

列出所有供应商不是DLL01的产品

1
2
3
SELECT vend_id ,prod_name
FROM Products
WHERE vend_id != 'DLL01';

范围值检查

要检查某个范围的值,可以使用BETWEEN操作符

检索价格在 5 美元和 10 美元之间的所有产品

1
2
3
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;

空值检查

在创建表时,可以指定表中能不能有空值(NULL)

NULL不等于 0,空字符串,或是空格,NULL就是NULL,什么数据都没有

确定值是否为 NULL ,不能简单地检查是否等于 NULL ,而必须使用 IS NULL 子句

1
2
3
SELECT prod_name, prod_price
FROM Products
WHERE prod_price IS NULL;

因为表中没有没有这样的行,所以没有返回数据,但是在Customers表中有NULL

1
2
3
SELECT cust_name
FROM Customers
WHERE cust_email IS NULL;

可见有两位顾客没有留下邮箱地址

注意:NULL 和非匹配

通过过滤选择不包含指定值的所有行时,你可能希望返回含NULL值的行,但因为NULL的特殊性,实际上这做不到