引言
视图是一种虚拟表,和普通表的使用是一样的,视图的一大特点就是“临时性”,是通过表动态生成的数据,只保存SQL逻辑,不保存查询结果。
视图在实际生产中主要有两种应用场景:
1、多个地方用到同样的查询结果;
2、该查询使用的SQL比较复杂。
下面,我们来总结一下这个在开发中经常会用到的知识点。
一、视图的优势
首先,视图并不能提高SQL的性能,它的作用在于更好的组织数据。优势有以下几点:
1、重用SQL语句。
2、简化复杂的SQL操作,隐藏一部分SQL细节。
3、保护数据,提高安全性。
二、视图的创建
视图的创建和表一样,也用到了 CREATE 关键字。
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]
忽略可选部分,则:
CREATE 视图名 AS 查询语句
查询语句可以是一个普通表,或者是其他视图。
CREATE OR REPLACE VIEW limit_emp AS
SELECT emp_id 员工编号,emp_name 姓名,salary 工资,dept_id 部门编号
FROMemp ;
查看和使用视图的方式和普通表完全一样:
SELECT * FROM limit_emp;
三、查看已创建的视图
创建好视图之后,如何查看已创建的视图呢?如果使用Navicat 或 SQLyog,可以直接在左侧的 “表文件夹”下方的“视图文件夹”查看:
如果希望使用SQL来查看,因为MySQL认为视图也是一种表,所以可以使用如下语句:
SHOW TABLES;
如果想仅查询出视图,那么可以执行:
SHOW TABLE STATUS WHERE COMMENT = 'view';
或者,直接查看指定名称的视图:
SHOW CREATE VIEW limit_emp;
四、视图的修改
视图的修改可有两种方式:
1、不确定是否已经存在该视图,可创建并替换,CREATE OR REPLACE VIEW:
CREATE OR REPLACE VIEW limit_emp
AS
SELECT * FROM emp
2、确定已经存在了该视图,直接更新 ALTER VIEW:
ALTER VIEW limit_emp
AS
SELECT * FROM emp
五、更新视图数据
视图中的数据是允许修改的,如果对视图执行 INSERT 、UPDATE 、DELETE 不仅对视图本身有效果,其背后的表也是会有影响的。但在实际生产中,往往会严格控制视图的更新操作,且会将视图设置为只读模式,即只用视图来简化查询,避免通过视图来对原表进行修改。
虽然视图可以更新,但是如果创建视图的语句中包含了以下这些关键字,那么同样无法执行更新:
1、分组函数、DISTINCT、GROUP BY 子句、HAVING、UNION。
2、常量视图
3、SELECT 语句中包含子查询
4、JOIN 子句
5、FROM 一个不能更新的视图
6、WHERE 子句的子查询引用了 FROM 子句中的表
六、视图的删除
DROP VIEW 视图名, 视图名, ...;
七、视图和表的比较
创建语法关键字 | 物理空间占用 | 使用 | |
表 | CREATE TABLE | 占用 | 增删改查 |
视图 | CREATE VIEW | 不占用 | 一般只做查询 |