这篇文章主要是学习一下SELECT语句的WHERE子句的使用和一些需要注意的问题。
在�大部分情况下,我们只需要检索数据库中的一些特定的数据子集而不是所有的数据。�完成这种类似操作需要指定 搜索条件(search criteria) ,搜索条件也被叫做 过滤条件(filter condition) 。在SELECT语句中,可以使用 WHERE 子句来指定过滤的搜索条件,WHERE子句在FROM子句之后给出。
简单的过滤
首先看一个最基本的例子,从产品表中选取产品单价为3.49的行:
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49
结果如下:
这条语句从Products表中检索两个列,并且只返回了prod_price为3.49的行。
使用WHERE子句时也可以使�ORDER BY子句,只需要注意,因该让ORDER BY子句位于WHERE之后,否则会出现错误。
在继续下一步的学习之前,还有一个问题需要讨论,那就是 应该把数据过滤的操作放在应用层还是放在数据库层 。在一些实际开发中,尤其是一些操作流程不规范的项目中,后台喜欢把所有数据都返回给前端,要前端去对数据过滤然后渲染。一般情况下,这种做法是很不妥当的。首先,让应用层处理数据库的操作将会对应用的性能造成很大的影响,并且这种影响是很消极的。其次,数据库进行优化之后,可以更快速有效的对数据进行过滤,其效率远高于在应用层进行过滤。此外,在应用�层过滤数据,服务器将不得不通过网络发送多余的数据,这会导致网络带宽的浪费。所以总的来说, 在数据库层对数据进行过滤 是较为高效和合理的方式。
条件操作符
在使用WHERE子句进行数据过滤时,主要还是使用条件操作符来对数据进行判断,从而选取到需要的数据。
首先看一下标准的SQL中所有的条件操作符:
操作符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
!< | 不小于 |
> | 大于 |
>= | 大于等于 |
!> | 不大于 |
�BETWEEN | 在指定的两个值之间 |
IS NULL | 为NULL值 |
之前已经看过了校验相等的例子,基本上其它条件操作符的使用都和等号操作符的使用差不多,需要注意的是下面几个操作符。
首先看一下不等于操作符。不等于操作符有两种写法, != 和 <> 这两个操作符通常情况下是可以相互替换的,但是在不同的DBMS下可能情况会不一样,使用时需要查阅对应的DBMS文档。来看一个例子:
SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01';
结果如下:
使用 != 操作符将会得到相同的结果。
通过这个例子还想说明的一个需要注意的�地方是,WHERE子句中的条件,有些值被单引号括起来了,�有些没有。这是因为,单引号是用来限定字符串的,如果将值与字符串类型的列进行比较,就需要限定单引号。如果是与数值类型比较的话,就不需要单引号。
当需要检查某列的值是否在某个范围内时,可以使用 BETWEEN 操作符�。其语法与其他的条件操作符有所不同,因为它需要两个值,即范围的开始值和结束值。下面这个例子说明如何使BETWEEN操作符:
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
结果如下:
上面这个例子是检索单价在5和10之间的所有产品,通过这个例子可以看到,使用BETWEEN操作符时�,要使用 AND 关键字将指定的开始值和结束值分隔。BETWEEN语句会匹配这个范围中所有的值,包括开始值和结束值。
还有一个需要注意的地方是,对于空值的检查。在创建表的时候,设计人员会指定某一列是否能够为空,当一列可以为空的时候,被称为包含空值NULL。
NULL被定义为无值(no value),它与包含字段为0,空字符串或仅仅包含空格不同。
要判断值是否为空,不能简单的使用 value = NULL 。SELECT语句有一个特殊的WHERE子句,可以用来检查具有NULL值的列。这个WHERE子句就是 IS NULL 子句。先看一个例子:
SELECT cust_name
FROM Customers
WHERE cust_email IS NULL;
结果如下:
为了验证这个检索结果的正确性,可以使用SELECT cust_name, cust_email FROM Customers;
来看一下未经过滤掉顾客信息。�
当表中没有�IS NULL的列时,会返回一个空的结果。
还有一点需要注意的是,当通过过滤选择不包含指定值的所有列时,可能会希望返回包含�NULL值的行,但是这做不到。因为NULL有特殊含义,数据库不知道它们是否匹配,所以在进行匹配过滤或者非匹配过滤时,不会返回这些结果。下面用一个例子来说明这个嗯题:
SELECT cust_name, cust_email
FROM Customers
WHERE cust_email <> 'sales@villagetoys.com';
结果如下:
结合之前验证IS NULL语句检索结果正确性的语句的检索结果可以看出来,cust_email为NULL的行没有被检索出来。
最后需要提到的是,许多的DBMS扩展了标准的操作符集,提供了更高级的过滤选择,具体的信息可以查阅对应的DBMS的文档。