SQL使用空值

  • 格式:doc
  • 大小:89.00 KB
  • 文档页数:4

什么是空值
空值从技术上来说就是“未知的值”。

但空值并不包括零、一个或者多个空格组成的字符串、以及零长度的字符串。

从实际应用中,空值说明还没有向数据库中输入相应的数据,或者某个特定的记录行不需要使用该列。

在实际的操作中有下列几种情况可使得一列成为NULL。

(1)其值未知,如课程表中不明确具体的课程内容。

(2)其值不存在,如在学生表中某个学生由于没有参加考试,所以该学生的考试成绩为空值。

(3)列对表行不可用。

检测空值
因为空值代表的是未知的值,所以并不是所有的空值都相等。

例如,“student”表中有两个学生的年龄未知,但无法证明这两个学生的年龄相等。

这样就不能用“=”运算符来检测空值。

所以SQL引入了一个特殊的操作符IS来检测特殊值之间的等价性。

语法:
WHERE Expression IS NULL
示例:
查询“grade”表中没有“课程成绩”的学生。

在查询分析器中输入的SQL语句如下:use student
select *
from grade
where 课程成绩is null
实现的过程如图1所示。

图1 查询没有课程成绩的学生
上述程序改为用“=”运算符来查询空值,查询结果如图2所示。

图2 用“=”运算符查询空值
实现的过程如图1所示。

图1 查询没有课程成绩的学生
上述程序改为用“=”运算符来查询空值,查询结果如图2所示。

图2 用“=”运算符查询空值
从上面的例子中看出,用“=”运算符来检测空值是不成功的。

IS运算符可以与NOT配合使用以检查非空的值。

示例:
在“grade”表中,查询“课程成绩”不为空的记录。

在查询分析器中输入的SQL语句如下:
use student
select *
from grade
where 课程成绩is not null
实现的过程如图3所示。

图3 查询学生“课程成绩”不为空的记录
处理空值
在实际使用数据表的数据时,空值是很不受欢迎的。

通常需要将空值转换为一个有效的值,以便对数据的理解,或者防止表达式出错。

SQL为处理空值提供了几个专门用来处理空值的函数。

ISNULL( )函数可以将空值转换为有效的值;而NULLIF( )函数可以根据指定的条件来生成空值。

1.使用ISNULL( )函数来处理空值
ISNULL( )函数是用指定的值替换空值。

语法:
ISNULL (check_expression , replacement_value )
参数说明:
●●check_expression:将被检查是否为NULL值的表达式。

check_expression 可以是任何类型的。

●●replacement_value:在check_expression为NULL值时,将用replacement_value 值替换NULL值。

replacement_value 必须与check_expresssion具有相同的类型。

返回类型:返回与check_expression相同的类型。

说明:如果check_expression不为NULL值,那么返回该表达式的值;否则返回re placement_value。

示例:
在“grade”表中,“课程成绩”为NULL值的,用数值“0”来替代。

在查询分析器中输入的SQL语句如下:
use student
select 学号, 课程代号,
isnull(课程成绩,0) as 课程成绩, 学期
from grade
实现的过程如图1所示。

图1 “课程成绩”为NULL值的用“0”替代
如果课程成绩不为空值,ISNULL( )函数将会返回原值。

只有课程成绩为NULL值时,ISNULL( )函数将会对其进行处理,用数值0替代。

2.使用NULLIF( )函数来处理空值
NULLIF( )函数功能:如果一个数据表中应该使用NULL值的地方使用了其他数据,那么就可以使用NULLIF( )函数将这些不一致的值替换为空值。

语法:
NULLIF ( expression , expression )
参数说明:
expression:常量、列名、函数、子查询或算术运算符、按位运算符以及字符串运算符的任意组合。

返回类型:返回类型与第一个expression相同。

如果两个表达式不相等,NULLIF 返回第一个expression的值。

如果相等,NULLIF 返回第一个expression类型的空值。

说明:如果两个表达式相等且结果表达式为NULL,NULLIF等价于CASE的搜索函数。

示例:
在“grade”表中,“学期”值是“1”的替换成NULL值。

在查询分析器中输入的SQL 语句如下:
use student
select nullif(学期,'1') as 学期
from grade
实现的过程如图2所示。

图2 “学期”是“1”的替换成NULL值。