【MYSQL】视图
【MYSQL】视图
- 一、视图的概念
- 1.1 视图的概念
- 1.2 为什么要用视图
- 二、创建视图
- 2.1 创建单表查询视图
- 2.2 创建多表联合视图
- 2.3 基于视图创建视图
- 三、查询视图
- 3.1 查看数据库的表对象、视图对象
- 3.2 查看视图的结构
- 3.3 查看视图的详细定义信息
- 3.4 展示视图的详细内容
- 四、修改视图
- 4.1 修改基表数据
- 4. 2 修改视图数据
- 五、删除视图
- 六、视图的总结
- 6.1 优点
- 6.2 缺点
一、视图的概念
1.1 视图的概念
在MySQL中,视图(View)是一种虚拟表,其内容由SQL查询定义。视图并不实际存储数据,而是基于一个或多个基础表(或视图)的查询结果动态生成数据。视图可以看作是一个保存了特定查询的“窗口”,通过这个窗口可以查看或操作数据,而无需直接操作底层的物理表。
1.2 为什么要用视图
视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。比如,公司发工资,我们通过查询就只能看到自己的工资,不能看到全部人的工资。
视图的应用场景有很多,这里只是列举一个,最后,总结出视图的优点。
二、创建视图
语法:
CREATE [OR REPLACE] VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
OR REPLACE(可选):如果视图已经存在,OR REPLACE选项会替换掉旧的视图定义。如果没有这个选项,尝试创建已存在的视图会报错。
事先创建好两个表student和student_score,方便接下来的演示。
student表:
student_score表:
2.1 创建单表查询视图
举例:
CREATE view student_name_sex
as select name,sex from student;
结果:
2.2 创建多表联合视图
举例:
注意:
create view student_name_course_score_sex as
select name,sex,course,score from student s,
student_score sc where s.name=sc.name;
当我们多表创建视图的时候会出现这个错误,这是因为两个表中包含相同的字段名,此时查询时未明确指定字段所属的表,就会导致该错误。
修改:
create view student_name_course_score_sex as
select s.name,sex,course,score from student s,
student_score sc where s.name=sc.name;
2.3 基于视图创建视图
举例:
create view student_name_course_score as
SELECT name,course,score from
student_name_course_score_sex;
结果:
三、查询视图
3.1 查看数据库的表对象、视图对象
SHOW TABLES;
3.2 查看视图的结构
DESC / DESCRIBE 视图名称;
3.3 查看视图的详细定义信息
SHOW CREATE VIEW 视图名称;
3.4 展示视图的详细内容
SELECT * FROM 视图名称;
四、修改视图
4.1 修改基表数据
这里我们看到视图显示的数据:张三的java成绩是99,我们将张三Java成绩改为9分,看下视图的成绩会不会发生变化。
修改基表数据会影响视图的数据!!!
4. 2 修改视图数据
这里我们已经将基表:张三的java成绩改为9分,接下来,我们将视图的张三Java成绩改为99,看能否对基表产生影响。
视图:
基表:
修改视图数据会对基表数据产生影响!!!
注意:
- 修改真实表会影响视图,修改视图同样也会影响真实表
以下视图不可更新:
- 创建视图时使⽤聚合函数的视图
- 创建视图时使⽤ DISTINCT
- 创建视图时使⽤ GROUP BY 以及 HAVING ⼦句
- 创建视图时使⽤ UNION 或 UNION ALL
- 查询列表中使⽤⼦查询
- 在FROM⼦句中引⽤不可更新视图
例子:
值得注意的是:虽然可以更新视图数据,但总的来说,视图作为 虚拟表 ,主要用于 方便查询 ,不建议更新视图的数据。对视图数据的更改,都是通过对实际数据表里数据的操作来完成的。
五、删除视图
语法:
DROP VIEW IF EXISTS 视图名称;
drop view student_name_course_score_2;
谨慎删除!!!
六、视图的总结
6.1 优点
- 简化复杂查询
视图可以封装复杂的SQL查询逻辑,使得用户可以通过简单的SELECT语句访问数据,而无需每次都编写复杂的查询语句。
举例:通过视图可以隐藏多表连接、分组统计等复杂操作,使得查询更加直观。
- 提高数据安全性
视图可以限制用户对某些数据的访问权限,用户只能通过视图访问数据,而无法直接访问底层表,从而实现数据的安全性和隔离。
举例:通过视图隐藏敏感字段(如薪资信息),只展示允许访问的数据。
- 逻辑独立性
视图提供了一种逻辑上的抽象,使得应用程序与底层数据表的结构解耦。即使底层表的结构发生变化(如字段名更改、表结构调整等),只要视图的定义仍然有效,应用程序代码无需修改。
举例:如果底层表的字段名被修改,只需调整视图的定义,而无需修改所有依赖该表的应用程序代码。
- 重用SQL逻辑
视图可以将常用的查询逻辑保存起来,避免重复编写相同的SQL语句,减少代码量并提高代码的可维护性。
举例:多个应用程序或模块可以共享同一个视图,而不必各自实现相同的查询逻辑。
- 动态数据展示
视图是动态的,其内容会随着底层表数据的变化而实时更新。这意味着视图始终反映最新的数据状态,无需手动维护数据的一致性。
举例:基于视图的报表可以实时反映最新的业务数据。
- 简化多表查询
视图可以将多个表的数据整合在一起,隐藏复杂的JOIN操作,使得查询更加直观和简单。 举例:通过视图将订单表和订单明细表整合,简化查询逻辑。
6.2 缺点
如果我们在实际数据表的基础上创建了视图,那么,如果实际数据表的结构变更了,我们就需要及时对相关的视图进行相应的维护。 特别是嵌套的视图(就是在视图的基础上创建视图),维护会变得比较复杂, 可读性不好 ,容易变成系统的潜在隐患。因为创建视图的 SQL 查询可能会对字段重命名,也可能包含复杂的逻辑,这些都会增加维护的成本。