PS:组成视图的属性列名要么全部省略要么全部指定。如果省略了视图的各个属性名,则由SELECT子句目标列中的各个字段组成。但在下列情况下必须明确指定组成视图的所有属性列名:
1)SELECT子句目标列中包含聚集函数或者列表达式;
2)SELECT子句目标列是‘*’;
3)多表连接时出现了同名属性列;
4)需要为视图中某个列定义更合适的名字
CREATE VIEW是说明语句,它创建一个视图,并将视图的定义存放在数据字典中,而定义中的<查询表达式>并不立即执行
CREATE VIEW SE_Students
AS SELECT Sno, Sname, Sex, Birthday, Dno
FROM Students
WHERE Speciality = ‘软件工程’
WITH CHECK OPTION;
//建立软件工程学生的视图SE_Students,属性列为 Sno, Sname, Sex, Birthday, Dno,并且包含专业为软件工程专业的所有学生的信息
PS:SE_Students是通过单个表Students上的选择和投影定义的视图,包含Students的码。通常,这种视图称为行列子集视图。行列子集视图是可更新的,因此我们使用了短语WITH CHECK OPTION,以便通过该视图插入学生元组时自动将属性Speciality上的值设置为“软件工程”。SELECT子句中的结果列都是属性,它们成为视图表的属性
CREATE VIEW EI_SC (Sno, Cno, Grade)
AS SELECT *
FROM SC
WHERE Sno IN (SELECT Sno
FROM Students
WHERE Dno= ‘IE’);
//建立信息工程学院学生的选课记录EI_SC,它与SC具有相同的属性,但只包含Dno为IE的学生
CREATE VIEW Student_Grades (Sno, Sname, Cname, Grade)
AS SELECT S.Sno, Sname, Cname, Grade
FROM Students S, SC, Courses C
WHERE S.Sno = SC.Sno AND C.Cno = SC.Cno;
//建立学生成绩视图Student_Grades,它包含如下属性:学号、学生姓名、课程名和成绩
CREATE VIEW CS_Student_Grades (Sno, Sname, Cname, Grade)
AS SELECT S.Sno, Sname, Cname, Grade
FROM Students S, Student_Grades SG
WHERE S.Sno = SG.Sno AND Speciality = ‘计算机科学与技术’;
//建立计算机科学与技术专业学生成绩视图CS_Student_Grades,它包含如下属性:学号、学生姓名、课程名和成绩
CREATE VIEW Student_Avg_Grades (Sno, Sname, Avg_Grade)
AS SELECT S.Sno, Sname, AVG (Grade)
FROM Students S, SC
WHERE S.Sno=SC.Sno
GROUP BY S.Sno, Sname;
//定义学生平均成绩视图Student_Avg_Grades,它包括如下属性:学生的学号、姓名和平均成绩(Avg_Grade)
DROP VIEW Student_Grades或DROP VIEW Student_Grades RESTRICT
不能删除例视图Student_Grades,因为视图CS_Student_Grades的定义依赖于它
DROP VIEW Student_Grades CASCADE将删除视图Student_Grades
并且级联地删除视图CS_Student_Grades
SELECT *
FROM SE_Students
WHERE Sex= ‘男’;
等价于
SELECT *
FROM (SELECT Sno, Sname, Sex, Birthday, Dno
FROM Students
WHERE Speciality = ‘软件工程’)
AS SE_Students (Sno, Sname, Sex, Birthday, Dno)
WHERE Sex= ‘男’;
//查询软件工程专业的男生
SELECT Sname, Cname, Grade
FROM Student_Grades
WHERE Sno=‘200605108’;
//查询学号为200605108的学生的各科成绩。要求显示学生姓名、课程名和成绩
INSERT INTO SE_Students (Sno, Sname, Birthday, Sex, Dno)
VALUES (‘200605109’, ‘吴畅’, 1987-05-04, ‘女’, ‘EI’);
等价于
INSERT INTO Students (Sno, Sname, Birthday, Sex, Dno, Speciality)
VALUES (‘200605109’, ‘吴畅’, 1987-05-04, ‘女’, ‘EI’, ‘软件工程’);
//向软件工程专业学生的视图SE_Students(见例4.42)中插入一个新的记录
//学号为200605109,姓名为吴畅,出生年月1987-05-04,女性,所在院系EI。
DELETE FROM SE_Students
WHERE Sno=‘200705201’;
等价于:
DELETE FROM Students
WHERE Sno=‘200705201’ ;
//删除软件工程专业学号为200705201的学生
UPDATE SE_Students
SET Sname=‘李岩’
WHERE Sno=‘200705268’;
//将软件工程专业学号为200705268的学生姓名改为“李岩”
PS:如果学号为200705268的学生不是软件工程专业的学生,该语句不会修改任何元组