章节3.4.4 — 3.7.3
SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作。需要注意:各结果的列数、对应项的数据类型必须相同。主要有以下操作:
并操作 UNION
交操作 INTERSECT
差操作 EXCEPT
例题1:查询计算机科学系的学生及年龄不大于19岁的学生。
SELECT *
FROM Student
WHERE Sdept='CS'
UNION
SELECT *
FROM Student
WHERE Sage<=19;
//使用 UNION时,系统会自动去掉重复元组;可用 UNION ALL操作符保留重复元组。
例题2:查询选修了课程1或者选修了课程2的学生。
SELECT *
FROM Student
WHERE Sdept='CS'
INTERSECT
SELECT *
FROM Student
WHERE Sage<=19;
例题3:查询选修了课程1或者选修了课程2的学生。
SELECT Sno
FROM SC
WHERE Cno='1'
INTERSECT
SELECT Sno
FROM SC
WHERE Cno='2';
例题4:查询计算机科学系的学生 与 年龄不大于19岁的学生的交集。
SELECT *
FROM Student
WHERE Sdept='CS'
EXCEPT
SELECT *
FROM Student
WHERE Sage<=19;
子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这是子查询生成的临时派生表成为主查询的查询对象。如果子查询中没有聚集函数,派生表可以不指定属性列,子查询SELECT子句后面的列名为其默认属性。
例题1:查询所有选修了1号课程的学生姓名。
SELECT Sname
FROM Student,(SELECT Sno FROM SC WHERE Cno='1')AS SC1
WHERE Student.Sno=SC1.Sno;
通过FROM子句生成派生表时,AS关键字可以省略,但必须为一个派生关系指定一个别名。
1.插入数据
1)插入元组
INSERT into SC values ('123456789',‘1’,80);
//按照表的构成填入数据,需要注意要保持数据类型不变
INSERT into SC(Cno,Sno) values ('1','123456789');
//按照指定顺序填入,未指定的默认为 NULL
2)插入子查询结果
语句格式:
INSERT
[INTO] <表名> [<属性列1>,<属性列2>,…]
子查询;
例题1:对每一个系,求学生的平均年龄,并把结果存入数据库。
建立新表:
CREATE TABLE Dept_age
(Sdept char(15),
Avg_age smallint);
存入数据:
INSERT
INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage)
FROM student
GROUP BY Sdept;
修改操作又称为更新操作,其语句的一般格式为
UPDATE <表名>
SET <列名>=<表达式> [,<列名>=<表达式>] …
[WHERE <条件>];
例题1:将学生201215121 的年龄改为22岁。
UPDATE Student
SET Sage=22
WHERE Sno='201215121';
例题2:将所有学生的年龄增加1岁。
UPDATE Student
SET Sage=Sage+1;
例题3:将计算机科学系全体学生的成绩置零.
UPDATE SC
SET Grade =0;
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Sdept='CS');
3.删除数据
删除操作语句的一般格式为
DELETE
FROM <表名>
[WHERE <条件>];
如果省略WHERE语句代表删除表中全部元组。DELETE语句删除的是表中的数据,而不是关于表的定义。
例题1:删除学号为201215128的学生记录。
DELETE
FROM Student
WHERE Sno='201215128';
例题2:删除所有学生的选课记录。
DELETE
FROM SC;
例题3:删除计算机科学系所有学生的选课记录。
DELETE
FROM SC;
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Sdept='CS');
空值就是“不知道”或“不存在”或“无意义”的值。
1.空值的产生
例题1:向SC表插入一个元组,学生号是“201215126”,课程号是“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 来表示。
例题3:从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.空值的算术运算
例题4:找出选修1号课程的不及格的学生。
SELECT Sno
FROM SC
WHERE Grade<60 AND Cno='1';
例题5:找出选修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);
视图是从一个或几个基本表导出的表。它与基本表不同,是一个虚表。
1.定义视图
1)建立视图的一般格式为
CREATE VIEW<视图名>[(<列名>[,<列名>]…)]
AS<子查询>
[WITH CHECK OPTION];
其中WITH CHECK OPTION的作用是在更新操作时自动检查子查询中的条件。
例题1:建立信息系学生的视图。
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS';
例题2:建立信息系学生的视图,并要求进行修改和插入操作时需要保证视图只有信息系的学生。
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS'
WITH CHECK OPTION;
例题3:建立信息系选修了1号课程的学生的视图(包括学号、姓名、成绩)。
CREATE VIEW IS_S1(Sno,Sname,Grade)
AS
SELECT Student.Sno,Sname,Grade
FROM Student,SC
WHERE Sdept='IS' AND
Student.Sno=SC.Sno AND
SC.Cno='1';
例题4:建立信息系选修了1号课程且成绩在90分以上的学生的视图。
CREATE VIEW IS_S2
AS
SELECT SSno,Sname,Grade
FROM IS_S1
WHERE Grade>=90;
例题5:定义一个反映学生出生年份的视图(带虚拟列的视图)。
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2014-Sage
FROM Student;
例题6:将学生的学号和平均成绩定义为一个视图。
CREATE VIEW S_G(Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
From SC
GROUP BY Sno;
例题7:将Student表中所有女生记录定义为一个视图。
CREATE VIEW F_Student(F_Sno,name,sex,age,dept)
AS
SELECT *
From Student
WHERE Ssex='女';
2)删除视图
该语句的格式为
DROP VIEW <视图表> [CASCADE];
删除视图时,将从系统目录中删除视图的定义和有关视图的其他信息。 还将删除视图的所有权限。
使用 DROP TABLE 删除的表上的任何视图都必须使用 DROP VIEW 显式删除。
例题8:删除视图BT_S和视图IS_S1。
drop view BT_S;
drop view IS_S1 cascade; --关键字 'cascade' 附近有语法错误。
2.查询视图
视图定义后,用户就可以对基本表一样对视图进行查询了。
例题1:在信息系学生的视图中找出年龄小于20岁的学生。
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
例题1:在信息系学生的视图中找出年龄小于20岁的学生。
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
**视图消解:**在有效性检查中,如果视图存在,则转换成等价的对基本表的查询,然后再执行修正后的查询
转化后的例题1:
SELECT Sno,Sage
FROM IS_Student
WHERE Sdept='IS' AND Sage<20;
例题2:查询选修了1号课程的信息系学生。
SELECT IS_Student.Sno,Sname
FROM IS_Student,SC
WHERE IS_Student.Sno=SC.Sno AND SC.Cno='1';
例题3:在S_G视图中查询平均成绩在90分以上的学生学号和平均成绩。
SELECT *
FROM S_G
WHERE Gavg>=90;
视图一旦定义,其定义将永远保存在数据字典中,之后所有的查询都可以直接引用该视图。
3.更新视图
更新视图是通过视图来插入(INSERT)、删除(DELETE)和修改(UPDATE)数据。
· 对视图的更新最终要转换为对基本表的更新。
例题1:将信息系学生视图IS_Student 中学号为“201215122”的学生姓名改为“刘辰”。
UPDATE IS_Student
SET Sname='刘辰'
WHERE Sno='201215122';
转化后:
UPDATE Student
SET Sname='刘辰'
WHERE Sno='201215122' AND Sdept='IS';
例题2:向信息系学生视图 IS_Student 中插入一个新的学生记录,其中学号为“201215129”,姓名为“赵新”,年龄为20岁。
INSERT
INTO IS_Student
VALUES('201215129','赵新',20);
转化后:
INSERT
INTO Student(Sno,Sname,Sage,Sdept)
VALUES('201215129','赵新',20,'IS');
例题3:删除信息系学生视图IS_Student中学号为“201215129”的记录。
DELETE
FROM IS_Student
WHERE Sno='201215129';
转化为
DELETE
FROM Student
WHERE Sno='201215129'AND Sdept='IS';
…………………………………………………………………………….
以上就是文章全部内容,感谢阅读。