一、MySQL 创建视图

CREATE VIEW <视图名称> [(<列名1>, <列名2>, ...)]
AS
[WITH CHECK OPTION];
关键参数说明:
`<视图名称>`:表示视图的唯一名称,用于标识当前创建的 MySQL 视图对象。
`(<列名1>, <列名2>, ...)`:这是可选部分,用来为视图中的字段指定自定义列名。需要注意的是,这里的列名数量必须与`SELECT`语句返回的列数完全一致。如果省略该部分,视图默认使用`SELECT`结果中的原始列名。
`
**`WITH CHECK OPTION`**:这是一个可选配置,用于保证通过视图执行的插入或更新操作,必须满足视图定义中 `SELECT` 语句的 `WHERE` 条件,从而确保数据的一致性与有效性。
创建视图的限制:
1. 用户必须具备 `CREATE VIEW` 权限,同时还需要拥有访问和操作底层基础表所需的相关权限。
2. `SELECT` 语句中不能:
引用系统变量(如 `@@variable`)或用户自定义变量(如 `@variable`)。
包含 `FROM` 子句中的子查询。
引用预处理语句的参数。
3. MySQL 视图不能基于临时表(TEMPORARY TABLE)来创建。
4. 视图定义中可以包含 `ORDER BY`,但如果在查询该视图时又使用了新的 `ORDER BY`,那么视图内部原有的排序规则会被外部排序覆盖。
二、MySQL 创建视图实例
假设存在表 `tb_students_info`,表中的示例数据如下:
| id | name | dept_id | age | sex | height | login_date |
|---|---|---|---|---|---|---|
| 1 | Dany | 1 | 25 | F | 160 | 2015-09-10 |
| 2 | Green | 3 | 23 | F | 158 | 2016-10-22 |
1. 基于单表创建视图(保留原列名)
CREATE VIEW view_students_info AS SELECT * FROM tb_students_info;
该视图 `view_students_info` 中的所有字段都与源表 `tb_students_info` 保持一致,适合快速封装单表查询结果。
2. 基于单表创建视图(自定义列名)**
CREATE VIEW v_students_info (s_id, s_name, d_id, s_age, s_sex, s_height, s_date) AS SELECT id, name, dept_id, age, sex, height, login_date FROM tb_students_info;
该视图 `v_students_info` 对列名进行了重新定义,在实际开发中更便于理解字段含义,同时也有助于提升 SQL 查询的可读性。
3. 基于多表创建视图
CREATE VIEW v_students_departments (s_id, s_name, s_age, dept_name) AS SELECT s.id, s.name, s.age, d.dept_name FROM tb_students_info s INNER JOIN tb_departments d ON s.dept_id = d.dept_id;
这个 MySQL 视图将学生信息与部门名称进行关联,能够有效简化多表连接查询,特别适合频繁使用联表查询的业务场景。
三、查询视图
视图创建完成后,可以像查询普通数据表一样,直接使用 `SELECT` 语句进行视图查询。
查询视图全部内容
SELECT * FROM v_students_info;
按条件查询视图数据
SELECT s_name, s_age FROM v_students_info WHERE s_age > 22;
查看视图结构
可以使用 `DESCRIBE` 或其简写 `DESC` 命令来查看 MySQL 视图的字段定义和结构信息。
DESCRIBE v_students_info;
或者
DESC v_students_info;
执行后会显示视图中每个字段的列名(Field)、数据类型(Type)、是否允许为空(Null)等详细信息,便于检查视图结构是否符合预期。
四、视图的核心优点
1. 简化 SQL 操作:可以将复杂的多表关联查询封装到视图中,后续使用者只需要直接查询视图,无需反复编写复杂 SQL 语句。
2. 增强数据安全性:可以仅向用户开放视图,而不直接暴露底层基础表。通过视图还能限制用户只能访问特定行(如 `WHERE dept_id = 1`)或指定列,从而更好地保护敏感数据。
3. 提高逻辑数据独立性:当基础表的 schema 发生变化时,例如字段名调整,只需修改视图定义即可在一定程度上屏蔽底层变化,减少对依赖视图的应用程序造成影响。
