3.带子查询的删除语句
子查询同样也可以嵌套在DELETE语句中,用以构造执行删除操作的条件。
恢复数据:
insert into SC values ('201215121', 1, 92), ('201215121', 2, 85), ('201215121', 3, 88), ('201215122', 2, 90), ('201215122', 3, 80); SELECT * FROM SC;
[例3.78] 删除计算机科学系所有学生的选课记录。
DELETE FROM SC WHERE Sno IN ( SELECT Sno FROM Student WHERE Sdept = 'CS' ); SELECT s.Sno, Sdept, Cno FROM Student s LEFT JOIN SC ON s.Sno = SC.Sno;
3.6 空值处理
所谓空值就是“不知道”或“不存在”或“无意义”的值。
SQL 语言中允许某些元组的某些属性在一定情况下取空值。
一般有以下几种情况:
- 该属性应该有一个值,但目前不知道它的具体值。
- 该属性不应该有值。
- 由于某种原因不便于填写。
空值是一个很特殊的值,含有不确定性,对关系运算带来特殊的问题,需要做特殊的处理。
1.空值的产生
[例3.79] 向SC表中插入一个元组,学生号是“201215126”,课程号是“1”,成绩为空。
INSERT INTO SC(Sno, Cno) VALUES ('201215126', '1'); SELECT * FROM SC;
[例3.80] 将Student表中学生号为“201215200”的学生所属的系改为空值。
# 先插入数据 INSERT INTO Student VALUES ('201215200', 'lili', '女', 21, 'IS'); UPDATE Student SET Sdept = NULL WHERE Sno = '201215200'; SELECT * FROM Student;
另外,外连接也会产生空值。
空值的关系运算也会产生空值。
2.空值的判断
判断一个属性的值是否为空值,用IS NULL 或IS NOT NULL来表示。
将一个属性的值赋值为空值使用 =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. 空值的算术运算、比较运算和逻辑运算
- 空值与另一个值(包括另一个空值)的算术运算的结果为空值,
- 空值与另一个值(包括另一个空值)的比较运算的结果为UNKNOWN。
SELECT 1+NULL, NULL+NULL, 5*NULL, NULL>1, NULL = NULL;
有了UNKNOWN后,传统的逻辑运算中二值以(TRUE, FALSE) 逻辑就扩展成了三值逻辑。
AND、OR、NOT的真值表如表所示:
其中
- T表示TRUE,
- F表示FALSE,
- U表示UNKNOWN。
在查询语句中,只有使WHERE和HAVING子句中的选择条件为TRUE的元组才被选出作为输出结果。
[例3.83]选出选修 1号课程的不及格的学生以及缺考的学生。
插入数据:
INSERT INTO SC VALUES ('201215122', 1, 58), ('201215121', 1, 88), ('201215123', 1, 48); SELECT * FROM SC;
查询:
SELECT * FROM SC WHERE Cno = '1' AND Grade < 60 UNION SELECT * FROM SC WHERE Grade IS NULL;
3.7 视图
视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。
数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。
一旦基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。
视图一经定义,就可以和基本表一样被查询、被删除。也可以在一个视图之上再定义新的视图,但对视图的更新(增、删、改)操作则有一定的限制。
3.7.1 定义视图
1. 建立视图
SQL语言用CREATE VIEW命令建立视图,其一般格式为:
CREATE VIEW 视图名 [(列名 [,列名] ...)] AS 子查询 [ WITH CHECK OPTION ];
- 其中,子查询可以是任意的SELECT语句,
- 是否可以含有ORDER BY子句和DISTINCT
短语,则取决于具体系统的实现。 - WITH CHECK OPTION表示对视图进行UPDATE、INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。
- 组成视图的属性列名或者全部省略或者全部指定,没有第三种选择。
- 如果省略了视图的各个属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。
- 但在下列三种情况下必须明确指定组成视图的所有列名:
- (1)某个目标列不是单纯的属性名,而是聚集函数或列表达式;
- (2)多表连接时选出了几个同名列作为视图的字段;
- (3)需要在视图中为某个列启用新的更合适的名字。
[例3.84] 建立信息系学生的视图。
CREATE VIEW V_IS_Stu AS SELECT Sno, Sname, Sage FROM student WHERE Sdept = 'CS'; SELECT * FROM v_is_stu;