SQL语句之空值的处理

  • 空值的处理
  • 1. 空值的产生
  • 2. 空值的判断
  • 3. 空值的约束条件
  • 4. 空值的算术运算,比较运算和逻辑运算


空值的处理

所谓空值就是 “不知道” 或 “不存在” 或 “无意义” 的值 ,SQL语句中允许某些元组的某些属性在一定情况下取空值,一般有以下几种情况:

  • 该属性应该有一个值,但目前不知道它的具体值。例如:某学生的年龄属性,因为学生登记表填漏了,不知道该学生年龄,因此取空值。
  • 该属性不应该有值。例如:缺考学生的成绩为空,因为他没哟参加考试。
  • 由于某种原因不便于填写。例如:一个人的电话号码不想让大家知道,则取空值。

因此,空值是一个很特殊的值,含有不确定性,对关系运算带来特殊的问题,需要做特殊的处理。

1. 空值的产生

  • 例1:向 SC 表中国插入一个元组,学生号是 ‘201215129’,课程号是‘1’,成绩为空
insert into SC(Sno,Cno,Grade)
		values('201215126','1',null);
/*在插入时该学生还没有考试成绩,取空值*/

insert into SC(Sno,Cno)
		values('201215126','1');
/*在插入语句中没有赋值的属性,其值为空值*/
  • 例2:将 Student 表中学生号为 “201215200” 的学生所属的系改为空值
update Student
set Sdept=null
where Sno='201215200';

外连接也会产生空值(前面已有相关例子),空值的关系运算也会产生空值

2. 空值的判断

判断一个属性的值是否为空值,用 is nullis not null 来表示。

  • 例1:从 Student 表中找出漏填了数据的学生信息
select *
from Student
where Sname is null or Ssex is null or Sage is null or Sdept is null;

3. 空值的约束条件

属性定义(或者域定义)中有 not null 约束条件的不能取空值,加了 unique 限制的属性不能取空值,码属性不能取空值

4. 空值的算术运算,比较运算和逻辑运算

空值与另一个值(包括另一个空值)的算术运算的结果为空值;
空值与另一个值(包括另一个空值)的比较结果为 unkonwn 。有了 unknown 后,传统的逻辑运算中二值(ture,false)逻辑就扩展成了三值逻辑。
and,or,not 的真值表如下所示,其中 T 代表 true ,F 代表 false ,U 代表 unknown

x , y

x and y

x or y

not x

T , T

T

T

F

T , U

U

T

F

T , F

F

T

F

U , T

U

T

U

U , U

U

U

U

U , F

F

U

U

F , T

F

T

T

F , U

F

U

T

F , F

F

F

T

在查询语句中,只有使 where 和 having 自居中的选择条件为 true 的元组才被选出作为输出结果

  • 例1:找出选修1号课程的不及格的学生
select Sno
from SC
where Grade <60 and Cno='1';
// 选出的学生都是那些参加了考试 (Grade 属性为非空值)而不及格的学生,不包括缺考的学生,因为前者使得条件 Grade<60 的值为 unknown
  • 例2:选出选修1号课程的不及格的学生以及缺考的学生
select Sno
from SC
where Grade<60 and Cno='1'
union 
select Sno
from SC
where Grade is null and Cno='1';
select Sno
from SC 
where Cno='1' and (Grade<60 or Grade is null);