《SQL必知必会》笔记(MySQL实现)---数据过滤

这篇文章主要是学习一下SELECT语句的WHERE子句的使用和一些需要注意的问题。

在�大部分情况下,我们只需要检索数据库中的一些特定的数据子集而不是所有的数据。�完成这种类似操作需要指定 搜索条件(search criteria) ,搜索条件也被叫做 过滤条件(filter condition) 。在SELECT语句中,可以使用 WHERE 子句来指定过滤的搜索条件,WHERE子句在FROM子句之后给出。

简单的过滤

首先看一个最基本的例子,从产品表中选取产品单价为3.49的行:

SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49

结果如下:

简单的过滤.png

这条语句从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';

结果如下:

不等于操作符.png

使用 != 操作符将会得到相同的结果。

通过这个例子还想说明的一个需要注意的�地方是,WHERE子句中的条件,有些值被单引号括起来了,�有些没有。这是因为,单引号是用来限定字符串的,如果将值与字符串类型的列进行比较,就需要限定单引号。如果是与数值类型比较的话,就不需要单引号。

当需要检查某列的值是否在某个范围内时,可以使用 BETWEEN 操作符�。其语法与其他的条件操作符有所不同,因为它需要两个值,即范围的开始值和结束值。下面这个例子说明如何使BETWEEN操作符:

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

结果如下:

BETWEEN操作符.png

上面这个例子是检索单价在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;

结果如下:

IS NULL操作符.png

为了验证这个检索结果的正确性,可以使用SELECT cust_name, cust_email FROM Customers;来看一下未经过滤掉顾客信息。�

当表中没有�IS NULL的列时,会返回一个空的结果。

还有一点需要注意的是,当通过过滤选择不包含指定值的所有列时,可能会希望返回包含�NULL值的行,但是这做不到。因为NULL有特殊含义,数据库不知道它们是否匹配,所以在进行匹配过滤或者非匹配过滤时,不会返回这些结果。下面用一个例子来说明这个嗯题:

SELECT cust_name, cust_email
FROM Customers
WHERE cust_email <> 'sales@villagetoys.com';

结果如下:

NULL和非匹配.png

结合之前验证IS NULL语句检索结果正确性的语句的检索结果可以看出来,cust_email为NULL的行没有被检索出来。

最后需要提到的是,许多的DBMS扩展了标准的操作符集,提供了更高级的过滤选择,具体的信息可以查阅对应的DBMS的文档。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇文章主要是讨论通过组合WHERE子句来建立功能更强,更高级的搜索条件,其中包括NOT和IN操作符 此前我们讲过...
    CoolForrest阅读 380评论 0 1
  • 数据库入门 数据库: 保存有组织的数据的容器(通常是一个文件或一组文件).数据库软件应该称为 DBMS(DataB...
    Mjericho阅读 522评论 0 0
  • SQL与MySQL简介 数据库基础 从SQL的角度来看,数据库就是一个以某种有组织的方式存储的数据集合。我们可以采...
    heming阅读 3,172评论 1 8
  • 很多次的同学聚会,我都会惊讶于同学的成长速度飞快,反观自己也被自己吓一跳,速度太慢了。自己脑海深处潜意识是...
    开启2017阅读 350评论 2 3
  • 上上周日在雷克雅未克碰到了一个很有趣的活动,只要有能上网的智能手机,就可以每晚在音乐厅Harpa的立面上玩乓(Po...
    tftlg阅读 317评论 0 1