视图
定义
视图本质上是一个虚拟表,它可以由数据库中的一张表或者多张表组合而成,视图从结构上也包含行和列。
- 可以对视图中的数据进行增加、删除、修改、查看等操作,也可以对视图的结构进行修改
- 在数据库中,视图不会保存数据,数据真正保存在数据表中。当对视图中的数据进行增加、删除和修改操作时,数据表中的数据会相应地发生变化;反之亦然。对视图的增删改查操作与操作普通表一致
应用场景
视图的应用场景:
- 数据安全:MySQL根据权限将用户对数据的访问限制在某些数据的结果集上,而这些数据的结果集可以使用视图来实现。因此,可以根据权限将用户对数据的访问限制在某些视图上,而不必直接查询或操作数据表,这在一定程度上保障了数据表中数据的安全性
- 数据独立:视图创建完成后,视图的结构就被确定了,当数据表的结构发生变化时不会影响视图的结构。当数据表的字段名称发生变化时,只需要简单地修改视图的查询语句即可,而不会影响用户对数据的查询操作
- 适应灵活多变的需求:当业务系统的需求发生变化后,如果需要改动数据表的结构,则工作量相对较大,可以使用视图来减少改动的工作量
- 能够分解复杂的查询逻辑:数据库中如果存在复杂的查询逻辑,则可以将问题进行分解,创建多个视图获取数据,再将创建的多个视图结合起来,完成复杂的查询逻辑
创建或修改视图
语法格式:
# 创建或更新视图
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = user]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
# 修改视图
ALTER
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = user]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
语法格式说明:
- CREATE:新建视图
- REPLACE:替换已经存在的视图
- ALGORITHM:标识视图使用的算法
- UNDEFINED:MySQL自动选择算法
- MERGE:将引用视图的语句与视图定义进行合并
- TEMPTABLE:表示将视图的结果放置到临时表中,接下来使用临时表执行相应的SQL语句
- DEFINER:定义视图的用户
- SQL SECURITY:安全级别
- DEFINER:只有创建视图的用户才能访问视图
- NVOKER:具有相应权限的用户能够访问视图
- view_name:创建的视图名称
- column_list:视图中包含的字段名称列表
- select_statement:SELECT语句
- [WITH [CASCADED | LOCAL] CHECK OPTION]:保证在视图的权限范围内更新视图
示例:
CREATE TABLE users (
userid int primary key,
username varchar(50),
phonenum varchar(25),
address varchar(125)
);
CREATE TABLE salary (
salaryid int primary key,
count varchar(50),
userid int
);
insert users values (1, 'lisi', '18576485247', 'Shanghai'),(2, 'wangwu', '18576485256', 'Beijin');
insert salary values(1, '100', 1), (2, '200', 2);
# 默认情况下,创建的视图的字段名称和数据表的字段名称一样,也可以在创建视图时为视图指定字段名称
# create or replace:视图不存在时创建,视图存在时则更新
create or replace view view_users_salary (userid, username, count) as
select users.userid, users.username, salary.count from users join salary using (userid);
# 查看创建的视图
select * from view_users_salary;
# 使用alter更新视图
alter view users_salary (userid, username, phonenum, count) as
select users.userid, users.username, users.phonenum, salary.count from users join salary using (userid);
查看视图
查看视图:
# 查看当前数据库下的数据表和视图
# 注意:MySQL中不支持使用SHOW VIEWS语句查看视图
show tables;
# 查看视图的详细信息,主要是列信息
describe view_name;
desc view_name;
# 查看视图的统计信息
# Comment属性值为VIEW,说明查看的是视图
show table status like 'view_name';
# 查看视图的创建语句
SHOW CREATE VIEW 'view_name';
# MySQL会将视图信息存储到information_schema数据库下的views数据表
SELECT * FROM information_schema.views;
删除视图
删除视图:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]