文本目录:
对于这个视图这个概念呢,是非常简单的一个知识点,简单来说就是为了在我们的查询的时候,不允许让人查询到一些特殊的字段,并且可以使我们的联合查询这个语句呢变得简单一些,我们的来看视图如何使用、如何创造、有何作用。
❄️一、什么是视图:
**视图是⼀个虚拟的表,****它是基于⼀个或多个基本表或其他视图的查询结果集。**视图本身不存储数据,而是通过执行查询来动态生成数据。用户可以像操作普通表一样使用视图进行查询、更新和管理。视图本身并不占用物理存储空间,它仅仅是一个查询的逻辑表示,物理上它依赖于基础表中的数据。
这个时候我们呢,可以使用 视图来解决这个问题。
❄️二、创建视图:
语法:
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,这个对于视图呢我们就到这里就结束了,对于这个呢 视图 是非常简单的一个知识了,我们在下一篇博客中介绍有关与 索引 的知识,让我们尽情期待吧!!!拜拜~~~