加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL数据库视图的用处是什么

发布时间:2023-06-09 14:03:24 所属栏目:MySql教程 来源:
导读:这篇文章主要讲解了“MySQL数据库视图的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL数据库视图的作用是什么”吧!
这篇文章主要讲解了“MySQL数据库视图的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL数据库视图的作用是什么”吧!
 
1 视图的介绍与作用
 
视图的介绍:
 
视图 view 是一个虚拟表,非真实存在,其 本质是根据SQL语句获取动态的数据集,并为其命名, 用户使用时只需要使用视图名称即可获取结果集,并可以将其当作表来使用。
 
数据库中只存放了视图的定义,而并没有存放视图中的数据。 数据还存在于原来的数据表中。
 
使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此, 视图中的数据是依赖于原来表中数据的。 当表的数据发生改变,视图中的数据也会随之改变。
 
视图的作用:
 
简化代码, 我们可以把重复使用的查询封装成视图重复使用,同时可以 使复杂的查询易于理解;
 
更加安全, 比如,如果有一张表中有很多数据,很多信息不希望被其他人看到,这时就可以使用到视图,对不同的用户使用不同的视图。
 
2 视图的创建
 
创建视图的语法如下:
 
create [or replace] [algorithm = {undefined | merge | temptable}]
 
view view_name [(column_list)]
 
as select_statement
 
[with [cascaded | local] check option]
 
参数说明:
 
algorithm: 表示视图选择的算法,可选;
 
view_name: 创建的视图名称;
 
column_list: 指定视图中各个属性的名词,默认情况下与SELECT语句中查询的属性相同;
 
select_statement: 表示一个完整的查询语句,将查询记录导入视图中;
 
[with [cascaded | local] check option]: 表示更新视图时要保证该视图在权限范围之内。
 
3 视图的修改
 
修改视图是指修改数据库中已存在的表的定义。当基本表中的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间的一致。
 
语法格式:
 
alter view 视图名 as select语句;
 
4 视图的更新
 
并不是所有的视图都可以更新。可以在UPDATE、DELETE或INSERT等语句中使用视图,以更新基本表的内容。对于可更新的视图,在视图中的行和基本表中的行之间必须具有一对一的关系,如果视图包含下述结构中的任何一种,则该视图不可更新:
 
聚合函数(SUM()、MIN()、MAX()等);
 
DISTINCT;
 
HAVING;
 
UNION或者UNION ALL;
 
位于选择列表中的子查询;
 
JOIN;
 
FROM子句中的不可更新视图;
 
WHERE子句中的子查询,引用FROM子句中的表;
 
仅使用文字值(在该情况下,没有要更新的基本表)。
 
注意:
 
视图中虽然可以更新数据,但是有很多限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。
 
当真实表中修改了某个存在视图中的字段时,视图需要更新,否则该视图就会变成无效视图!
 
5 视图的重命名与删除
 
重命名视图:
 
rename table 视图名 to 新视图名;
 
删除视图:
 
drop view if exists 视图名;
 
删除视图时,只删除了视图的定义,而并不会删除真实表中的数据
 
如果想同时删除多个视图,则使用下面的语法格式:
 
drop view if exists 视图名1, 视图名2, 视图名3...;
 
6 视图的练习
 
6.1 数据准备
 
在进行练习时可以先根据下面代码创建用于练习的两个基本表:
 
create table college(
 
    cno   int         null,
 
    cname varchar(20) null);
 
create table student(
 
    sid     int         null,
 
    name    varchar(20) null,
 
    gender  varchar(20) null,
 
    age     int         null,
 
    birth   date        null,
 
    address varchar(20) null,
 
    score   double      null);
 
6.2 查询平均分最高的学校名称
 
结合之前学过的知识可以 尝试使用子查询和连接查询 来实现,参考代码如下:
 
SELECT cname
 
FROM (SELECT cname, rank() over (order by avg_score desc ) item
 
      FROM (SELECT cname, avg(score) avg_score
 
            FROM student
 
                     JOIN college ON sid = cno
 
            GROUP BY cname) t) tt
 
WHERE item = 1;
 
在上述代码中,先将student 与 college两表关联,将关联的查询作为子表,并根据子表进行平均数的排序,平均数序号为1的平均分数最高,再以此为子表进行子查询,查询出了平均分最高的学校。具体结果如下:
 
这种方式虽然能够解决问题,但是相对复杂,不容易看懂,为了简化代码,我们可以将每一个子查询创建为一个视图
 
视图解决方式代码:
 
-- 1 视图一,连接两表并计算平均数
 
CREATE VIEW t_view AS
 
SELECT cname, avg(score) avg_score
 
FROM student
 
         JOIN college ON sid = cno
 
GROUP BY cname;
 
-- 2 视图二,利用视图一对平均分数进行排序标号
 
CREATE VIEW tt_view AS
 
SELECT cname, rank() over (order by avg_score desc ) item
 
FROM (t_view);
 
-- 3 利用视图查询
 
SELECT cname
 
FROM (tt_view)
 
WHERE item = 1;
 
在创建完视图后,如果想要查询平均分前三名学校,则方便很多,创建好的视图可以直接使用!
 
参考代码及结果:
 
SELECT cnameFROM (tt_view)WHERE item = 1
 
   OR item = 2
 
   OR item = 3;
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!