在SQL中,视图(View)是一种建立在SELECT查询结果集上的虚拟表。
视图可以基于数据库表或其他视图来构建,它本身没有自己的数据,而是使用了存储在基础表中的数据。
视图一但被定义,它便作为对象存储在数据库中,但视图本身并不存储数据,而是通过其虚拟视窗映射到基础表 中的数据。
对视图的操作与对数据库表的操作一样,可以对其数据进行查询和一定约束的修改与删除。
【例】若需要建立一个由基础课程数据构成的视图BasicCourseView
CREATE VIEW BasicCourseView AS SELECT CourseName, CourseCredit, CoursePeriod, TestMethod FROM Course WHERE CourseType=’基础课’;
【例】操作访问视图,像访问数据表一样
SELECT * FROM BasicCourseView ORDER BY CourseName;
DROP VIEW BasicCourseView;
【例3-48】在选课管理系统数据库中,我们希望查询选修“数据库原理及应用”课程的学生名单。需要关联课程 信息表(Course)、开课计划表(Plan)、选课注册表(Register)、学生信息表(Student),其查询SQL语句如下。
SELECT C.CourseName AS 课程名称, S.StudentID AS 学号, S.StudentName AS 姓名 FROM Course AS C,Plan AS P, Register AS R, Student AS S WHERE C.CourseID=P.CourseID AND C. CourseName=' 数据库原理及应用’ AND P.CoursePlanID=R.CoursePlanID AND R.StudentID=S. StudentID;
这个SQL语句较复杂和冗长,为了让外部程序简单地实现该信息的查询,可以先定义一个名称为 DataBaseCourseView视图,其视图创建SQL语句如下。
CREATE VIEW DataBaseCourseView AS SELECT C.CourseName AS 课程名称, S.StudentID AS 学号, S.StudentName AS 姓名 FROM Course AS C, Plan AS P, Register AS R, Student AS S WHERE C.CourseID=P.CourseID AND C. CourseName=’数据库原理及应用’ AND P.CoursePlanID=R.CoursePlanID AND R.StudentID=S.StudentID;
当DataBaseCourseView视图被创建完成后,外部程序就可以通过一个简单的SELECT语句查询视图数据,其操作语 句如下。
SELECT * FROM DataBaseCourseView;
从上面的视图使用可看到,视图访问操作可以获得与数据库表直接访问操作同样的结果,但视图可以让编程人员 使用简单的SQL查询语句,而非编写复杂的SQL语句。
通过视图可以将基础数据库表中部分敏感数据隐藏起来,外部用户无法得知数据库表的完整数据,降低数据库被 攻击的风险。此外,通过视图访问,用户只能查询和修改他们所能见到的数据,可以保护部分隐私数据。
【例3-49】在选课管理系统数据库中,除教务管理部门用户外,其他用户只能浏览教师基本信息,如教师编号、 教师姓名、性别、职称、所属学院,教师其他信息被隐藏,可定义视图来处理信息,其视图创建SQL语句如下。
CREATE VIEW BasicTeacherInfoView AS SELECT T.TeacherID AS 编号, T.TeacherName AS 教师姓名, T.TeacherGender AS 性别, T. TeacherTitle AS 职称, C.CollegeName AS 所属学院 FROM Teacher AS T, College AS C WHERE T.CollegeID=C.CollegeID;
当 BasicTeacherInfoView 视图被创建完成后,外部程序就可以通过一个简单的 SELECT语句查询视图数据,其操作 语句如下。
SELECT * FROM BasicTeacherInfoView ORDER BY 所属学院 , 编号;
视图可提供一定程度的数据逻辑独立性。当数据表结构发生改变,只要视图结构不变,应用程序可以不做修改。
【例3-50】在选课管理系统数据库中,如果教师信息表(Teacher)的结构进行了改变,增加了“出生日期”字段,其表结构为(TeacherID,TeacherName,TeacherGende,BirthDay,TeacherTitle, CollegeID,TeacherPhone)。但只要定义教师 基本信息的视图BasicTeacherInfoView结构不变,则使用该视图的外部程序不需要变动。
视图可以将部分用户不关心的数据进行过滤,仅仅提供他们所感兴趣的数据。
【例3-51】在选课管理系统数据库中,教务部门希望查询出没有被学生选修的课程名称及其教师信息。这里可以 创建一个查询该信息的视图NoSelCourseView,其视图创建SQL语句如下。
CREATE VIEW NoSelCourseView AS SELECT C.CourseName AS 课程名称, T.TeacherName AS 教师, COUNT(R.CoursePlanID) AS 选课人数 FROM Course AS C JOIN Plan AS P ON C.CourseID=P.CourseID JOIN Teacher AS T ON P.TeacherID=T.TeacherID LEFT JOIN Register AS R ON P.CoursePlanID=R.CoursePlanID GROUP BY C.CourseName, T.TeacherName;
当NoSelCourseView视图创建完成后,外部程序就可以通过一个简单的SELECT语句查询视图数据
SELECT 课程名称, 教师 FROM NoSelCourseView WHERE 选课人数=0;