Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

视图

定义

视图本质上是一个虚拟表,它可以由数据库中的一张表或者多张表组合而成,视图从结构上也包含行和列。

  • 可以对视图中的数据进行增加、删除、修改、查看等操作,也可以对视图的结构进行修改
  • 在数据库中,视图不会保存数据,数据真正保存在数据表中。当对视图中的数据进行增加、删除和修改操作时,数据表中的数据会相应地发生变化;反之亦然。对视图的增删改查操作与操作普通表一致

应用场景

视图的应用场景:

  • 数据安全: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]