思维导图:
**3.6 空值的处理**
在前面的章节中,我们已经多次接触到了空值(NULL)的概念及其处理方式。在这一节中,我们将系统性地深入探讨空值的问题。
**定义:**
空值表示“不知道”、“不存在”或“无意义”的值。SQL语言允许在某些情况下某些元组的某些属性取空值。其出现的原因可以归纳为以下几点:
- 该属性应该有一个值,但当前不知道其具体值。
- 该属性不应该有值。
- 由于某种原因不便于填写。
**1. 空值的产生**
* 例3.79:
插入一个学生号为“201215126”的学生、课程号为“1”的记录,但成绩为空。
INSERT INTO SC(Sno, Cno, Grade)
VALUES('201215126', '1', NULL);
或
INSERT INTO SC(Sno, Cno)
VALUES('201215126', '1');
* 例3.80:
将学生号为“201215200”的学生所属系更改为空值。
UPDATE Student
SET Sdept = NULL
WHERE Sno = '201215200';
**2. 空值的判断**
为了判断一个属性的值是否为空,我们使用IS NULL或IS NOT NULL。
* 例3.81:
从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. 空值的运算**
- **算术运算**:空值与另一个值(包括另一个空值)进行的算术运算结果为NULL。
- **比较运算**:空值与另一个值(包括另一个空值)进行的比较运算结果为UNKNOWN。
- **逻辑运算**:因为存在UNKNOWN,所以逻辑运算由二值逻辑扩展为三值逻辑。其真值表如表3.8所示,其中T表示TRUE,F表示FALSE,U表示UNKNOWN。
---
总结:
**空值处理总结:**
**重点:**
1. **定义**:空值(NULL)表示数据项的不确定性,如“不知道”、“不存在”或“无意义”。
2. **产生**:插入时某些属性未被赋值、外连接操作、属性更新为NULL等操作可能导致空值的产生。
3. **判断**:使用`IS NULL`或`IS NOT NULL`进行空值判断。
4. **约束**:某些属性,如有NOT NULL或UNIQUE约束的,不能取空值。
5. **运算**:空值参与的算术、比较或逻辑运算会产生特殊结果。
**难点:**
1. **三值逻辑**:传统的二值逻辑(TRUE和FALSE)在涉及到NULL时会扩展成三值逻辑(TRUE、FALSE、UNKNOWN),这使得逻辑判断变得复杂。
2. **参与运算的结果**:空值参与的运算往往结果不如预期直观,例如两个空值进行比较的结果是UNKNOWN而不是TRUE或FALSE。
**易错点:**
1. **误认为NULL与空字符串相同**:在数据库中,空值NULL与空字符串是完全不同的。
2. **不恰当的使用**:在进行查询或更新操作时,直接使用等号(=)来查找或处理NULL是无效的,应该使用`IS NULL`或`IS NOT NULL`。
3. **空值在聚合函数中的表现**:如SUM, AVG等聚合函数在处理空值时通常会忽略它,但COUNT函数会计算非空值。
**使用技巧:**
1. **避免不必要的空值**:在设计数据库时,应仔细考虑哪些字段真的可能需要NULL值,并为其余字段设置NOT NULL约束,以保持数据完整性。
2. **默认值**:为某些可能为NULL的属性设置默认值,可以减少不必要的NULL出现。
3. **CASE语句**:在查询中使用CASE语句可以有效地处理和转换空值。
4. **COALESCE和NULLIF函数**:这些SQL函数允许你更方便地处理和替换空值。
5. **谨慎使用外连接**:外连接可能会导致空值的产生,确保你理解并期望这种行为。
总的来说,理解和正确处理空值是数据库操作中的一个重要环节。为确保数据的完整性和准确性,需要对NULL值有深入的理解,并在实际应用中恰当地使用。