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 null 或 is 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);