MySQL-视图 (ಥ_ಥ)

文本目录:

❄️一、什么是视图:

❄️二、创建视图:

❄️三、使用视图:

❄️四、修改数据:

1、注意事项:

❄️五、删除视图:

❄️六、视图的优点:

❄️总结:


对于这个视图这个概念呢,是非常简单的一个知识点,简单来说就是为了在我们的查询的时候,不允许让人查询到一些特殊的字段,并且可以使我们的联合查询这个语句呢变得简单一些,我们的来看视图如何使用、如何创造、有何作用。

❄️一、什么是视图:

**视图是⼀个虚拟的表,****它是基于⼀个或多个基本表或其他视图的查询结果集。**视图本身不存储数据,而是通过执行查询来动态生成数据。用户可以像操作普通表一样使用视图进行查询、更新和管理。视图本身并不占用物理存储空间,它仅仅是一个查询的逻辑表示,物理上它依赖于基础表中的数据。

这个时候我们呢,可以使用 视图来解决这个问题。


❄️二、创建视图:

语法:

CREATE VIEW view_name [(column_list)] AS select_statement

我们来举一个示例:

查询学生的信息和考试成绩。

学生ID、学生姓名、班级ID、班级姓名、课程和所对应的成绩

我们来看使用 SQL 语句来查询这个信息:

这个呢就是 SQL 语句的查询上面要求的信息了,但是如果我们的每一个使用者在查询的时候呢都需要去编写 这么麻烦的SQL 语句的话呢,这就很麻烦了,这时候我们就可以使用视图来把这个语句封装到 视图中,来便于查询。

这里我们要注意当我们创建 视图的时候呢,对于上面SQL中有 3个 name 这样就会使我们的 视图创建的时候呢,会使 字段名 重复,而报错,所以呢这里我们的SQL语句要进行更改一下,使其添加一个别名。

java 复制代码
create view v_student as (
select 
st.student_id,
st.`name` as student_name,
cls.class_id,
cls.`name` as class_name,
co.course_id,
co.`name` as course_name,
sc.score
from student st,class cls,course co,score sc
where st.class_id = cls.class_id
and st.student_id = sc.student_id
and sc.course_id = co.course_id
order by st.student_id
);

当然,如果不想要注意对于SQL语句的编写的话,我们也可以在创建 视图的时候呢,进行指定列这个时候呢,我们就不需要在 SQL 语句中起别名进行区分了。

java 复制代码
create view v_student_v1 (
id,name,class_id,class_name,course_id,course_name,score 
)as (
select 
st.student_id,
st.`name`,
cls.class_id,
cls.`name`,
co.course_id,
co.`name`,
sc.score
from student st,class cls,course co,score sc
where st.class_id = cls.class_id
and st.student_id = sc.student_id
and sc.course_id = co.course_id
);

这些呢就是我们的创建视图的方法了。


❄️三、使用视图:

我们在上面已经创建了,两个视图了,接下来我们来看看对于这个 视图 如何使用。

我们由上面创建的 视图来进行 查询操作:

同样对于我们另一个 视图多的查询也是这样编写的。

OK,这个就是我们对于 视图的基本使用了。


❄️四、修改数据:

修改真实表:

我们来看看对于我们真实表的数据之后呢,对于我们的视图里面的数据会不会进行更改:

我们可以看到,我们把其 score 的成绩进行了更改,那么我们来看看这样的情况下对于 视图有没有影响:

我们可以看到对于 在真实表中的成绩呢,在视图中同样会被影响。


修改视图:

我们已经知道了对于更改 真实表的数据,那么我们的视图会被影响,那么接下来我们来看看如果修改 视图的数据后,对于真实表会不会有影响:

我们可以看到对于我们修改了,视图中的数据,在真实表中对应的数据也进行了更改。

但是我们来看一个情况:

我们可以看到在这个 视图 中如果修改成绩的话呢就会进行报错,这是为什么呢?

问题出在了我们在创建 视图的时候了,我们来对比一下两个视图:

我们可以看到 对于v_student 这个视图在创建的时候呢,我们有 order by 这个 SQL 语句,但是对于 v_student_v1 这个视图呢就没有这个SQL语句,问题就出现在了这里。

所以对于我们的修改数据的时候呢,我们有一些注意事项:

1、注意事项:

1)、修改真实表会影响视图,修改视图同样会影响真实表。

2)、以下的视图不可修改:

a、创建视图时使用聚合函数的视图

b、创建视图时使用 DISTINCT

c、创建视图的时候使用了 GROUP BY 和 HAVING 子句

d、创建视图的时候使用了 UNION 和 UNION ALL

e、查询列表中使用了子查询

f、在 FROM 子句中引用不可更新视图


❄️五、删除视图:

语法:

drop view view_name;

这个方法呢就非常简单了,和我们的的删除表是一样的,我们来演示一遍:

这个呢就是我们已经把 v_student 这个视图删除了。


❄️六、视图的优点:

1. 简单性:视图可以将复杂的查询封装成一个简单的查询。例如,针对一个复杂的多表连接查询,可以创建一个视图,用户只需查询视图而无需了解底层的复杂逻辑。

2. 安全性:通过视图,可以隐藏表中的敏感数据。例如,一个系统的用户表中,可以创建一个不包含密码列视图,普通用户只能访问这个视图,而不能访问原始表。

3. 逻辑数据独立性:视图提供了⼀种逻辑数据独立性,即使底层表结构发生变化,只需修改视图定义,而无需修改依赖视图的应用程序。使用到应用程序与数据库的解耦

4. 重命名列:视图允许用户重命名列名,以增强数据可读性。


❄️总结:

OK,这个对于视图呢我们就到这里就结束了,对于这个呢 视图 是非常简单的一个知识了,我们在下一篇博客中介绍有关与 索引 的知识,让我们尽情期待吧!!!拜拜~~~

相关推荐
建投数据42 分钟前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi2 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀2 小时前
Redis梳理
数据库·redis·缓存
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天2 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺3 小时前
分布式系统架构:服务容错
数据库·架构
独行soc4 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain4 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship4 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站4 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle