由于本人的水平有限,可能会有一些遗漏,希望大家能够进行补充。

视图

视图是查看数据库中表数据的一种方式。它提供了存储了预定义的查询语句作为数据库中的对象供以后使用的能力。视图是一种虚拟表,并不是实际存在于数据库中,因此,视图并不会占据物理存储空间(除非是索引视图)。在我们使用视图查询数据时,数据库会从真实表中取出对应的数据。因此,视图中的数据是依赖于真实表中的数据的。一旦真实表中的数据发生改变,显示在视图中的数据也会发生改变。

视图虽然本质上于表不同,但是视图经过定义后其结构形式和表一样,可以进行查询、修改、更新和删除等操作。并且视图也有很多的优点:

1) 简化查询操作

如果一个查询语句比较复杂,会使用聚合函数或者需要联立多个表进行查询时,那么我们就可以将这些复杂查询定义为视图,从而简化用户对数据的访问。

2) 提高数据的安全性

在创建视图时,我们可以规定那些数据可以查询,那些不能查询。而在用户在使用视图时我们可以授予用户访问视图的权限,因此用户只能查询或修改视图中的数据,并不会对实际的数据库表进行操作,从而提高了数据库的安全性。

3) 更改数据格式

我们可以创建一个涉及多个表的复杂查询视图,然后把视图中的数据组织并输出到另一个应用程序中,在另一个程序中进行进一步的分析和操作。

1 视图的创建

在进行视图的创建时我们可以采用两种方式进行创建,一种是利用MySQL的图形化界面,如SQLyog等进行视图的创建,而另一种则是使用SQL语句进行视图的创建,关于图像化界面中视图的创建在这里就不再进行讲解,下面为大家介绍一下用SQL语句进行视图的创建。关于要使用的数据库表,在这里仍会使用在MySQL基础里的表。

CREATE DATABASE cjgl;

USE cjgl;

/*Table structure for table `course` */

DROP TABLE IF EXISTS `course`;

CREATE TABLE `course` (
  `courseID` char(8) NOT NULL,
  `coursename` varchar(20) NOT NULL,
  `totalperiod` tinyint(4) DEFAULT NULL,
  `weekperiod` tinyint(4) DEFAULT NULL,
  `credithour` tinyint(4) DEFAULT NULL,
  `remark` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`courseID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `course` */

insert  into `course`(`courseID`,`coursename`,`totalperiod`,`weekperiod`,`credithour`,`remark`) values ('1','计算机网络',NULL,NULL,NULL,NULL),('2','计算机组成原理',NULL,NULL,NULL,NULL),('3','计算机操作系统',NULL,NULL,NULL,NULL),('4','数据结构',NULL,NULL,NULL,NULL);

/*Table structure for table `courseteacher` */

DROP TABLE IF EXISTS `courseteacher`;

CREATE TABLE `courseteacher` (
  `courseID` char(8) NOT NULL,
  `teacherID` char(8) NOT NULL,
  PRIMARY KEY (`courseID`,`teacherID`),
  KEY `FK_CourseTeacher_Teacher` (`teacherID`),
  CONSTRAINT `FK_CourseTeacher_Course` FOREIGN KEY (`courseID`) REFERENCES `course` (`courseID`),
  CONSTRAINT `FK_CourseTeacher_Teacher` FOREIGN KEY (`teacherID`) REFERENCES `teacher` (`teacherID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `courseteacher` */

insert  into `courseteacher`(`courseID`,`teacherID`) values ('1','1'),('2','2'),('3','3'),('4','4');

/*Table structure for table `grade` */

DROP TABLE IF EXISTS `grade`;

CREATE TABLE `grade` (
  `studentID` char(10) NOT NULL,
  `courseID` char(8) NOT NULL,
  `teacherID` char(8) NOT NULL,
  `grade` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`studentID`,`courseID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `grade` */

insert  into `grade`(`studentID`,`courseID`,`teacherID`,`grade`) values ('1','1','1',88),('1','2','2',90),('2','3','3',NULL),('3','3','3',78),('4','2','2',86),('6','4','4',90);

/*Table structure for table `student` */

DROP TABLE IF EXISTS `student`;

CREATE TABLE `student` (
  `studentID` char(10) NOT NULL DEFAULT '',
  `studentName` varchar(10) NOT NULL,
  `sex` char(2) DEFAULT NULL,
  `birthday` datetime DEFAULT NULL,
  `speciality` varchar(30) DEFAULT NULL,
  `credithour` tinyint(4) NOT NULL,
  `ru_date` char(4) DEFAULT NULL,
  `password` varchar(20) DEFAULT NULL,
  `remark` varchar(200) DEFAULT NULL,
  `LoginName` char(20) DEFAULT NULL,
  PRIMARY KEY (`studentID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `student` */

insert  into `student`(`studentID`,`studentName`,`sex`,`birthday`,`speciality`,`credithour`,`ru_date`,`password`,`remark`,`LoginName`) values ('1','曾星宇','男','1998-08-09 00:00:00','计算机',22,NULL,'123456',NULL,NULL),('2','李兴','男','2002-08-05 00:00:00','数学',18,NULL,NULL,NULL,NULL),('3','张裕','女','1998-06-09 00:00:00','计算机',22,NULL,NULL,NULL,NULL),('4','张华','男','1996-12-12 00:00:00','化学',24,NULL,NULL,NULL,NULL),('5','姜丽','女','1997-09-08 00:00:00','化学',23,NULL,NULL,NULL,NULL),('6','孙悟空','男','1999-08-12 00:00:00','数学',21,NULL,NULL,NULL,NULL);

/*Table structure for table `teacher` */

DROP TABLE IF EXISTS `teacher`;

CREATE TABLE `teacher` (
  `teacherID` char(8) NOT NULL,
  `teachername` varchar(10) NOT NULL,
  `sex` char(2) DEFAULT NULL,
  `technicalPost` char(16) DEFAULT NULL,
  `telephone` char(16) DEFAULT NULL,
  `PASSWORD` varchar(20) DEFAULT NULL,
  `remark` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`teacherID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `teacher` */

insert  into `teacher`(`teacherID`,`teachername`,`sex`,`technicalPost`,`telephone`,`PASSWORD`,`remark`) values ('1','赵天宇','男',NULL,NULL,NULL,NULL),('2','苏北','男',NULL,NULL,NULL,NULL),('3','雪儿','女',NULL,NULL,NULL,NULL),('4','张佐恩','男',NULL,NULL,NULL,NULL);

创建视图的语法:CREATE VIEW <视图名> AS <SELECT语句>

注:视图的名称可以自己定义,但要注意一下,视图的名称在数据库中必须是唯一的,不能与其他表或视图同名。

例1:建立计算机系学生的视图

CREATE VIEW vw_stu_jsj1
AS
SELECT studentID,studentName,sex,speciality
FROM student
WHERE speciality='计算机';

例2:建立所有学生选修课程及其成绩的视图。

CREATE VIEW vw_StuGrade1(studentID,studentName,courseName,speciality,grade)
AS
SELECT student.studentID,studentName,courseName,speciality,grade
FROM student INNER JOIN grade ON student.studentID=grade.studentID
    INNER JOIN course ON grade.courseID = course.courseID;

例3:为每个学生及其平均成绩建立一个视图

CREATE VIEW vm_AvgGrade(studentID,gavg)
AS 
SELECT studentID,AVG(grade)
FROM grade
GROUP BY studentID;

注:如果在创建视图时,其列名要么全部忽略,要么全部指定,在全部忽略的情况下,系统会默认将select语句的列名用作视图列名。另外,出现以下三种情况必须指定列名。

1.视图中有算术表达式,内置函数等派生出的列。

2.视图中有两列或多列有相同的名称。

3.自定义的列名。

2 视图的修改

语法:ALTER VIEW <视图名> AS <SELECT语句>

例1:修改vw_StuGrade1的视图定义,将视图中的”studentID“去掉,并为每个列重新命名。

ALTER VIEW vw_StuGrade1(姓名,课程名,所属院系,分数)
AS
SELECT studentName,courseName,speciality,grade
FROM student INNER JOIN grade ON student.studentID=grade.studentID
    INNER JOIN course ON grade.courseID = course.courseID;

3 通过视图查询数据

我们建立视图的目的就是简化查询操作,因此下面的例子将演示用视图进行查询数据

例1:在计算机系学生的视图中找出所有女生信息

SELECT studentID,studentName,sex
FROM vw_stu_jsj1
WHERE sex='女';

4 通过视图更新数据

由于视图是一个虚表,不存在实际的物理空间,因此无论在什么时候更新视图的数据,实际上都是在修改视图的基表中的数据。

例1:向计算机学生视图“vw_stu_jsj1”中插入一个新的学生记录

INSERT INTO vw_stu_jsj1(studentID,studentName,sex,speciality)
VALUES('8','玉兰','女','计算机');

例2:删除计算机系视图“vw_stu_jsj1”中学号为7的记录

DELETE FROM vw_stu_jsj1
WHERE studentID = '7';

当然并不是所有建立的视图都能进行更新

例如:

  • 聚合函数 SUM()、MIN()、MAX()、COUNT() 等。
  • DISTINCT 关键字。
  • GROUP BY 子句。
  • HAVING 子句。
  • UNION 或 UNION ALL 运算符。
  • 位于选择列表中的子查询。
  • FROM 子句中的不可更新视图或包含多个表。
  • WHERE 子句中的子查询,引用 FROM 子句中的表。
    只要包含以上结构的视图都不能进行更新操作。

    5 视图的删除

当我们不需要某个视图时就可以执行DROP VIEW 语句把视图的定义从数据库中删除

语法:DROP VIEW <视图名1> [ , <视图名2> …]

例1:删除视图“vm_AvgGrade”

DROP VIEW vm_AvgGrade;

往期教程
第一期
第二期