一、创建视图
CREATE VIEW <视图名称> [(<列名1>, <列名2>, ...)]
AS <SELECT语句>
[WITH CHECK OPTION];
关键参数说明:
`<视图名称>`:视图的唯一标识符。
`(<列名1>, <列名2>, ...)`:可选。为视图的列指定自定义名称,数量必须与 `SELECT` 语句的列数一致。如果省略,视图将直接使用 `SELECT` 语句中的列名。
`<SELECT语句>`**:用于定义视图内容的查询语句。
`WITH CHECK OPTION`**:可选。确保通过视图对数据进行插入或修改时,这些操作必须符合视图定义中 `SELECT` 语句的 `WHERE` 条件。
创建视图的限制:
1. 用户需要拥有 `CREATE VIEW` 权限以及操作底层基础表的所有相关权限。
2. `SELECT` 语句中不能:
引用系统变量(如 `@@variable`)或用户自定义变量(如 `@variable`)。
包含 `FROM` 子句中的子查询。
引用预处理语句的参数。
3. 视图不能基于临时表(TEMPORARY TABLE)创建。
4. 视图定义中可以包含 `ORDER BY`,但如果从该视图查询时使用了自身的 `ORDER BY`,则视图中的排序会被覆盖。
二、创建视图的实例
假设存在表 `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` 的列名被重新定义,增强了可读性和安全性。
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;
这个视图将学生信息与部门名称关联起来,简化了复杂的表连接查询。
三、查询视图
视图创建后,可以像查询普通表一样使用 `SELECT` 语句。
查询视图全部内容
SELECT * FROM v_students_info;
带条件查询视图
SELECT s_name, s_age FROM v_students_info WHERE s_age > 22;
查看视图结构
可以使用 `DESCRIBE` 或其简写 `DESC` 来查看视图的字段定义。
DESCRIBE v_students_info;
或者
DESC v_students_info;
执行结果将显示视图的每个列名(Field)、数据类型(Type)、是否允许为空(Null)等信息。
四、视图的核心优点
1. 简化操作:将复杂的多表连接查询封装在视图中,使用者只需查询视图即可,无需编写复杂的 SQL。
2. 增强安全性:可以只将视图暴露给用户,而非底层基础表。通过视图限制用户只能访问特定的行(如 `WHERE dept_id = 1`) 或列,保护敏感数据。
3. 逻辑数据独立性:如果基础表的 schema 发生变化(如列名改变),只需修改视图的定义即可屏蔽这种变化,使依赖视图的应用程序不受影响。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程