mysql视图是基于查询结果集的虚拟表,本身不存储实际数据,数据来源于基表,创建视图可以让复杂查询逻辑复用更方便,也能对数据访问做权限控制。

mysql视图创建的基本语法
mysql中创建视图使用CREATE VIEW语句,基础语法格式如下:
-- 基础创建语法
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS
select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
各参数含义说明:
- OR REPLACE:可选参数,如果视图已经存在,会替换原有视图,不存在则新建。
- ALGORITHM:可选参数,指定视图的处理算法,UNDEFINED由mysql自动选择,MERGE会将视图查询和基表查询合并,TEMPTABLE会先将视图结果存到临时表再处理。
- view_name:视图的名称,需要符合mysql标识符命名规则,不能与已有表或视图重名。
- column_list:可选参数,指定视图的列名,如果省略则使用查询语句中的列名。
- select_statement:查询语句,用于定义视图的数据来源,不能包含
TEMPORARY表、不能引用用户变量。 - WITH CHECK OPTION:可选参数,用于限制通过视图修改数据时,修改结果必须符合视图的查询条件。
基础视图创建示例
我们先创建一张测试用的用户表,然后基于这张表创建简单视图:
-- 创建测试用户表
CREATE TABLE user_info (
id INT PRIMARY KEY AUTO_INCREMENT,
user_name VARCHAR(50) NOT NULL,
age INT,
email VARCHAR(100),
status TINYINT DEFAULT 1
);
-- 插入测试数据
INSERT INTO user_info (user_name, age, email, status) VALUES
('张三', 25, 'zhangsan@ipipp.com', 1),
('李四', 30, 'lisi@ipipp.com', 1),
('王五', 22, 'wangwu@ipipp.com', 0);
-- 创建查询所有正常状态用户的视图
CREATE VIEW normal_user_view
AS
SELECT id, user_name, age, email FROM user_info WHERE status = 1;
创建完成后,我们可以像查询普通表一样查询这个视图:
-- 查询视图数据 SELECT * FROM normal_user_view;
带自定义列名的视图创建
如果希望视图的列名和基表列名不同,可以在创建时指定列名列表:
-- 创建带自定义列名的视图,将user_name改为name,age改为user_age CREATE VIEW user_basic_view (user_id, name, user_age) AS SELECT id, user_name, age FROM user_info WHERE status = 1;
带WITH CHECK OPTION的视图创建
当需要通过视图修改基表数据时,添加WITH CHECK OPTION可以避免修改后数据不符合视图的筛选条件:
-- 创建带检查选项的视图,只能查询年龄大于20的正常用户 CREATE VIEW adult_normal_user_view AS SELECT id, user_name, age FROM user_info WHERE status = 1 AND age > 20 WITH CHECK OPTION;
此时如果尝试通过视图插入年龄小于20的用户,或者将已有用户的年龄修改为小于20,都会执行失败:
-- 以下插入语句会报错,因为年龄18不符合视图的筛选条件
INSERT INTO adult_normal_user_view (user_name, age, status) VALUES ('赵六', 18, 1);
视图创建的注意事项
- 视图的查询语句中不能包含
ORDER BY子句,除非同时使用了LIMIT子句。 - 视图定义中引用的基表如果被删除,视图会变成无效状态,查询时会报错。
- 不能基于临时表创建视图,也不能在视图的查询中使用用户自定义变量。
- 如果视图的查询语句中包含聚合函数、DISTINCT、GROUP BY、HAVING等子句,视图算法会被自动设置为TEMPTABLE,此时不能对视图进行更新操作。
- 创建视图需要有对应的权限,包括
CREATE VIEW权限,以及查询语句中涉及表的SELECT权限。
mysql视图create_view数据库修改时间:2026-06-10 09:42:25