MySQL视图

本文详细介绍了MySQL视图的概念,视图作为虚拟表,存储的是查询定义而非数据。视图的作用包括集中数据、简化查询、提供数据安全和方便数据导出。创建视图时需要注意列数限制、名称冲突等问题,并可以通过`WITH CHECK OPTION`进行更新检查。修改视图示例演示了如何改变显示信息。删除视图的正确操作。最后,通过示例展示了如何使用视图进行数据操作,强调了对视图的操作需考虑与基表的一致性。

视图是一个虚拟表,从一个或多个表中导出(视图也可以从视图中导出),其内容由查询语句定义生成。数据库中只存储了视图定义,而不存放视图所对应的数据,视图所对应的数据仍存放在视图所引用的基表中。

作用

  1. 视图可以集中数据,满足不同用户对数据的不同要求。
  2. 视图可以简化复杂查询的结构,从而方便用 户对数据的操作。
  3. 视图能够对数据提供安全保护。
  4. 便于组织数据导出。

创建视图

  CREATE VIEW    view_name [ ( column [ ,...n ] ) ] 
     AS select_statement 
     [with check option]

注意如下:

  1. 在一个视图中最多引用1024列,视图中记录的行数限制由基表中记录数目决定
  2. 视图名称不允许与该用户拥有的表重名
  3. 列的名称一般继承其基表中列的名称,如果视图中某一列是算术表达式、函数、常量或者来自多个表的列名相同,必须要为视图中的列定义名称
  4. 不能在临时表上创建视图,也不能创建临时视图
    示例:以学生表为基础建立一个视图,其名称为“学生名单”,其包含列为学生表中的学号和姓名
create view student_inf
as
	select id,name
    from student

其中[with check option]对通过视图操作的数据是否满足定义视图时的条件做检查.以下对这个选项做说明:

我们可以通过对视图的操作间接操作基表.例如创建如下视图:

create view Math_inf
as
	select id,grade from score where claId='math'

向这一视图插入数据

insert into Math_inf values(9,83)

这一指令将转换为对基表score的插入操作执行.根据基表的定义,我们可以看到插入的数据是不完整的,需要通过默认值来填充

insert into score values(9,NULL,83)

所以当我们再次查询这一视图时,发现并没添加新的信息.对于用户而言,在数学成绩信息中成功插入了一条新纪录;而对于数据库来说,新插入的记录并没有指定课程信息,产生了冲突.其根本原因在于对视图的修改不等于对基表的修改.如果对视图的修改能够等价于对基本表的修改,那么这样的更新才是允许的
因此[with check option]是对相关条件进行检查,以保证通过视图的插入和更新操作都满足定义视图时的约束.通常来说,带有where条件的都要加这句
关于修改视图的约束问题,在下文还会详细分析


修改视图

ALTER VIEW  view_name [ ( column [ ,...n ] ) ] 
AS 
      select_statement

示例:修改student_inf,以Id,Name,Class显示信息

alter view student_inf(Id,Name,Class)
as
  select id,name,claNum     from student

删除视图

DROP VIEW  { view } [ ,...n ] 

使用视图

select colmun_list from view_name

示例:显示student_inf视图

select * from student_inf

在上文提到过,我们可以修改视图从而修改基表.具体的过程是将对视图的操作指令转换为对基表的操作指令,但这一转换不是永远正确的,有时会存在逻辑上的冲突,根本原因就在于在视图限定的条件没有在转换后的指令上体现出来
示例:

CREATE VIEW  数据库成绩
   AS
      SELECT *
      FROM  S_C
      WHERE CNO = '001'
 
UPDATE  数据库成绩
	SET SCORE=SCORE*1.1
    WHERE  SNO='0003' 

将上面的更新指令等价到基表上,则有

update S_C
set SCORE=SCORE*1.1
where SNO='0003'

并没有体现CNO='001’这一约束,因此是不对的
删除也是同样的道理,在视图中删除不等价于在基表中删除

DELETE  FROM   数据库成绩
	WHERE SNO= '0002'
DELETE  FROM   S_C
	WHERE SNO= '0002'

下面这条语句转换后是正确的

CREATE VIEW  学生名单
	AS
		SELECT SNO,SNAME
		FROM  S
		
INSERT INTO 学生名单
VALUES ('0011','zz')

在视图中插入,等价于在基表中插入

insert into S values('0011','zz',NULL...)

例题:给出表 student(id,name,sex,birth,admission_time,department_code)
1.建立计算机系(department_code= ‘01’ )学生视图,该视图包含学生的id,name和admission_time信息

create view compute_student
as
	select id,name,admission_time
	from student
	where department_code='01'
	with check option

2)建立student表中全体学生年龄的视图,该视图包含学生的id、name和年龄信息

create view all_student_age
as
	select id,name,(YEAR(GETDATE())-YEAR(birth) AS age)
	from student

给出表

学生学号,姓名,性别
课程课程号,课程名
选修学号,课程号,成绩

1)建立选修“高等数学”的学生的视图,该视图包含学生的学号和姓名信息

CREATE VIEW 高等数学
AS
	SELECT 学号,姓名
	FROM 学生
	WHERE 
		学号 IN 
			(SELECT 学号 FROM 选修 WHERE 课程号=
				(SELECT 课程号 FROM 课程 WHERE 课程名='高等数学')
			)
	WITH CHECK OPTION

2)建立没有获得学分(成绩<60)的学生的视图,该视图包含学生的学号、姓名、课程名和成绩信息

CREATE VIEW 没有学分
AS 
	SELECT 学号,姓名,课程名,成绩
	FROM (学生 JOIN 选修 ON 学生.学号=选修.学号)
		JOIN 课程 ON 课程.课程号=选修.课程号
	WHERE
		成绩<60
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值