数据库学习8 — 集合查询、数据更新、视图

章节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;

数据库学习8 — 集合查询、数据更新、视图_第1张图片

二、基于派生表的查询

子查询不仅可以出现在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;

数据库学习8 — 集合查询、数据更新、视图_第2张图片
2.修改数据

修改操作又称为更新操作,其语句的一般格式为
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';

…………………………………………………………………………….

数据库学习8 — 集合查询、数据更新、视图_第3张图片

以上就是文章全部内容,感谢阅读。

你可能感兴趣的:(SQL,server,数据库,sql)