MySQL视图

本文深入讲解SQL视图的创建、修改及更新操作,包括基于单表和多表的视图创建,视图字段别名设置,以及通过视图进行数据查询、插入、更新和删除的实践。

 

创建视图的基本格式

CREATE VIEW <视图名称> [(column_list)]

AS SELECT语句;

基于单个数据表建立视图

在使用emp表时,如果需要查询查询empno(编号)、ename(姓名)、job(职位)、hiredate(雇用日期)、sal(月薪)等字段,并指定中文拼音别名,SQL语句如下:

select empno bianhao , ename xinmin, job zhiwei, hiredate guyongriqi, sal yuexin from emp;

         如果需要频繁得进行该语句查询,那么每次都要重写这一行语句。使用视图可以简化操作,对empnoenamejobhiredatesal创建视图:

create view view_01 as select empno , ename , job , hiredate , sal from emp;

  执行完上述语句即可创建名为view_01的视图,如果你是通过Navicat等图形界面工具创建视图,在左侧视图栏下可找到view_01视图。

select * from view_01 ;

查询结果如下:

   

可以发现,我们并未指定查询的字段,但查询效果却与直接在真实数据表上指定字段查询效果一样。但view_01视图并未实现字段别名,继续创建一个view_02为每个列添加别名:

create view view_02 (bianhao , xinmin , zhiwei , guyongriqi , yuexin) as select empno , ename , job , hiredate , sal from emp;

创建基于多个表上视图

创建一个视图,视图中包含每个员工编号(empno)、姓名(ename)、职位(job)、领导编号(mgr)、领导姓名(empno)、部门名称(dname)、部门位置(loc),在真实数据表中查询语句如下:

select e1.empno bianhao, e1.ename xingming, e1.job zhiwei, e1.mgr lindaobianhao, e2.ename lindaoxingming, d.dname bumenmingchen, d.loc bumenweizhi

 

from emp e1 , emp e2 , dept d

 

where e1.mgr=e2.empno and e1.deptno=d.deptno ;

创建视图:

create view view_03 as select e1.empno bianhao, e1.ename xingming, e1.job zhiwei, e1.mgr lindaobianhao, e2.ename lindaoxingming,
d.dname bumenmingchen, d.loc bumenweizhi

 

from emp e1 , emp e2 , dept d

 

where e1.mgr=e2.empno and e1.deptno=d.deptno ;

对刚建立的view_03视图进行查询:

select * from view_03 ;

查询结果如下:

 

可以发现,在select中指定别名与在view视图中指定别名效果是一样的。

修改视图

1)使用create or replace view语句修改视图

create or replace view语句从字面上也可以理解:既可以创建视图,也可以修改视图(存在的话就修改,不存在就创建)。create or replace view语句的语法结构与创建视图的create语句语法结构是完全一样的。

修改上文中创建的视图view_01,添加一个部门编号字段(deptno:

create or replace view view_02 (bianhao , xinmin , zhiwei , guyongriqi , yuexin , bumenbiaohao) as select empno , ename , job , hiredate , sal , 

deptno from emp;

  再次查询view_02,发现确实多了部门编号这一列:

select * from view_02 ;

2)使用alter语句修改视图

alter语句是MySQL提供的另一种修改视图的方法,其语法结果与create or replace语句也是基本一样的。

继续修改视图view_02,添加一个奖金字段(comm):

alter view view_02 (bianhao , xinmin , zhiwei , guyongriqi , yuexin , bumenbiaohao , jiangjin) as select empno , ename , job , hiredate , sal ,

 deptno , comm from emp;

查看view_01视图:

alter语句与create orreplace语句的区别是当视图不存在是,alter语句会报错。

更新视图

更新视图是指通过视图来插入、更新、删除表中的数据,因为视图是一个虚拟表,其中是没有数据的。通过视图更新的时候都是转到真实表上进行的。对视图的更新操作也包括updateinsertdelete

1update

通过视图将员工编号为7369的员工月薪改为1000,在更新前,其数据为:

select * from view_02 where bianhao=7369;

update语句进行更新

update view_02 set yuexin=1000 where bianhao=7369;

再次通过视图查看数据,发现数据确实已更新:

   

再看看真实表中数据有没有更新:

select * from emp where empno=7369;

可以看出,真实表中的数据也一起更新了,说明对视图的更新操作本质上是对真实表的更新。

2insert

  先创建一个视图view_04,该视图结果与emp表一样:

create view view_04 as select * from emp ;

  使用insert语句向view_04视图中插入一条数据:

insert into view_04 values(8002 , 'MARK' , 'CLERK'7902 , '1998-12-12' , 110020 ,500 ) ;

  查看真实emp表中是否添加这么一条数据:

select * from emp where empno =8002  ;

  证明在视图进行insert操作是可以添加数据到真实表的。但一般来说,视图的表结构与视图的表结构可能不一样,若真实表中存在非空等约束,这通过视图的insert操作就回失败。所以,insert操作一般不会通过视图来进行。

3delete

  通过视图删除刚创建的empno8002的记录:

delete from view_04 where empno =8002  ;

  查看真实表中数据是否删除:

select * from emp where empno =8002  ;

   返回的是一个空表,证明真实表中的这条记录也已经被删除了。

总结:

  最后总结一下视图的更新操作,当视图中包含如下内容时,视图的更新操作将不能被执行:

1)视图中不包含真实表中被定义为非空的列(视图中没有,但真实表中为非空约束)。

2)在定义视图的select语句后的字段列表中使用了数学表达式。

3)在定义视图的select语句后的字段列表中使用了聚合函数。

4)在定义视图的select语句中使用了distinctuniontop group by,或having子句。

 

### MySQL 视图的创建与使用 #### 创建视图MySQL 中,可以通过 `CREATE VIEW` 语句来定义一个新的视图视图本质上是一个虚拟表,其内容由查询动态生成[^1]。 ```sql CREATE VIEW view_name AS SELECT column1, column2, ... FROM table_name WHERE condition; ``` 例如,在名为 `student` 的表上创建一个简单的视图: ```sql CREATE VIEW student_view AS SELECT * FROM student; ``` 如果需要更复杂的逻辑,可以指定多个表之间的连接条件以及筛选字段。比如,创建一个包含学生姓名 (`sname`)、课程名称 (`cname`) 和成绩 (`grade`) 的视图: ```sql CREATE VIEW student_view (sname, cname, grade) AS SELECT s.sname, c.cname, sc.grade FROM student s JOIN course c ON s.sno = sc.sno JOIN score sc ON c.cno = sc.cno; ``` --- #### 查询视图数据 一旦视图被创建成功,就可以像操作普通表一样对其进行查询。以下是通过视图获取特定学生成绩的例子: ```sql SELECT * FROM student_view WHERE sname = '张三'; ``` 此查询会返回所有属于 “张三” 学生的相关记录及其关联的成绩信息[^2]。 --- #### 删除视图 若不再需要某个视图,则可通过以下命令将其删除: ```sql DROP VIEW IF EXISTS student_view; ``` 注意这里的 `IF EXISTS` 是为了避免因试图移除不存在的对象而导致错误发生。 --- #### 修改视图结构 当原有视图无法满足新的业务需求时,可利用 `ALTER VIEW` 来调整它的定义而不必先删掉它再重建新版本: 假设我们希望更改之前建立的那个复杂视图使其只显示三个核心要素&mdash;&mdash;即学生的全名(`sname`)、所学科目称呼(`cname`)还有分数等级(`grade`)&mdash;&mdash;那么执行如下SQL脚本即可完成更新动作: ```sql ALTER VIEW student_view (sname, cname, grade) AS SELECT s.sname, c.cname, sc.grade FROM student s JOIN course c USING(sno) JOIN score sc USING(cno); ``` 这里采用了稍微不同的写法(`USING()`),简化了原表达式的冗长部分同时保持功能不变. --- #### 更新视图中的基础表格数据 值得注意的是,虽然可以直接向某些类型的视图插入或者修改数据,但这取决于底层实际物理存储的设计模式;并不是所有的视图都支持这样的操作。对于那些允许DML(Data Manipulation Language)活动的视图来说,任何针对它们所做的变更最终都会反映回原始的数据源上去。 --- ### 总结 以上介绍了如何基于MySQL数据库管理系统构建并管理基本到高级别的视图对象。这些技术能够帮助开发者封装复杂的查询逻辑从而提高应用程序开发效率的同时也增强了系统的安全性和灵活性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值