MySQL 中的视图(View)
MySQL 中的视图(View)
ZhangCurryMySQL 中的视图(View)
MySQL 中的视图(View)
视图是一个虚拟表。它看起来和实际的表一样,有行有列,但其本身并不存储数据。视图的内容由查询(select 语句)定义。它基于一个或多个实际表(或其它视图)上的 SQL 查询结果。 你可以像使用普通表一样,对视图进行 SELECT 查询,甚至在某些条件下进行 INSERT、UPDATE、DELETE 操作。
使用视图主要有以下几个好处
1. 简化复杂查询:将复杂的、多表连接的查询定义为一个视图,之后只需简单的 SELECT * FROM view_name 即可,无需重复编写复杂的 SQL。
2. 增强数据安全性:可以只将视图暴露给用户,而不是底层的基础表。通过视图,可以限制用户只能访问特定的行(如:只看到本部门的数据)或列(如:隐藏薪资、手机号等敏感字段)。
3. 逻辑数据独立性:如果底层表的结构发生了变化(例如,增加了一个列,或拆分了一个表),只要修改视图的定义,就可以使依赖于该视图的应用程序无需修改,从而屏蔽变化。
4. 呈现不同视角的数据:可以为不同的用户或应用创建不同的视图,基于同一套基础数据呈现定制化的视角。
基本语法
1. 创建视图的一般形式
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
语法参数详解
1. CREATE VIEW
最基础的命令,表示要创建一个视图。
2. [OR REPLACE] (可选) 我们通常理解它是对视图的更改
3. [ALGORITHM] (可选)
定义视图的算法,MySQL 处理视图的方式:
UNDEFINED(默认):MySQL 自动选择算法
MERGE:将视图的查询与外部查询合并,效率较高
TEMPTABLE:先将视图结果存入临时表,再从临时表查询
4. view_name [(column_list)]
view_name:视图的名称
column_list(可选):为视图的列指定别名
5. AS select_statement
核心部分:定义视图内容的 SELECT 查询
可以是简单的单表查询,也可以是复杂的多表连接、子查询等
6. [WITH CHECK OPTION] (可选)
作用:确保通过视图修改的数据仍然满足视图的 WHERE 条件, 如:
CREATE VIEW user_view2 AS SELECT * FROM user WHERE name like ‘ja%’ WITH CHECK OPTION;
具体案例
这里用的user,score两个表,表结构请参阅前面章节
1. 创建基于单表的简单视图
不指定列名(使用查询结果的列名)
– 创建简单视图,模糊查询电话以138开头的用户数据
CREATE VIEW user_view AS SELECT
id,
name,
phone
FROM user
WHERE phone like ‘138%’;
–调用视图 select * from user_view; –查看视图结构 desc user_view;
结果图:
2. 创建指定列名的视图
其实就是要隐藏底层实体表的列名
CREATE VIEW user_view2 (user_id, user_name, user_phone) AS SELECT id, name, phone FROM user;
–调用视图
select * from user_view2;
–查看视图结构
desc user_view2;
结果图:
3. 数据安全
在实际应用中还有一种情况,就是,只让特定的程序员或特定的客户看特定的内容,而不是让他们看到实际的表。
CREATE VIEW user_info_view AS
SELECT
id,
name,
phone,
born
FROM user;
– 然后只授予用户访问此视图的权限,而不是整个 user 表
–调用视图
select * from user_info_view;
结果图:
4. 创建多表连接的复杂视图
创建一个视图(user_details),实现查找学生电话以138开头的第二学期的相关信息
CREATE VIEW user_details AS
SELECT
u.id,
u.name,
u.password AS pwd,
s.chinese
FROM user u
INNER JOIN score s ON u.id = s.uid
where s.term = 2 and u.phone like ‘138%’;
–调用视图
select * from user_details;
结果图:
5. 修改视图 使用 CREATE OR REPLACE
CREATE OR REPLACE(我们经常采用)如果不存在则创建, 如果已经存在,则替换它。;
– 方法1
CREATE OR REPLACE VIEW new_user_view AS
SELECT
id,
name,
phone,
born – 新增列
FROM user
WHERE id between 1 and 3;
–调用视图
select * from new_user_view;
结果图:
6. 修改视图 使用ALTER VIEW
ALTER VIEW (不怎么用).其实就使用它修改表结构一样
ALTER VIEW new_user_view AS
SELECT
id,
name,
phone,
email
FROM user
WHERE id between 3 and 5;
–调用视图
select * from new_user_view;
结果图:
7 查看视图
– 查看所有视图
SHOW FULL TABLES WHERE TABLE_TYPE = ‘VIEW’;
– 查看视图结构
DESCRIBE view_name;
– 查看视图的创建语句
SHOW CREATE VIEW view_name;
8 删除视图
DROP VIEW IF EXISTS view_name;
写在最后:
我们在项目中创建的视图,通常只用作数据的查询(select)。一个视图包含2-3个表部分字段的内容,有的会关联更多的表,取决于具体业务的复杂度。但通常会 使用权限配置来禁止程序员直接在视图上使用insert、update、delete等语句.视图的劣势是查询效率较低,偶尔不能及时反映底层实体表的真是数据变化。 所以使用视图时,通常是一些交互性较弱的数据。如果交互性强数据,必须直接从实体表中拿。
有时我们还会把视图的内容转换为JSON后放入memocache中(一个比redis更古老的内存数据库),并用一段代码按着特定规则、特定的时间段保持视图和memocache间数据同步。



