- 创建视图
DROP view IF EXISTS v_dept; create view v_dept as select deptno,dname from dept; CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
视图的作用:
- 使操作简单化,可以对经常使用的查询定义一个视图,使用户不必为同样的查询操作指定条件
视图用来隐藏复杂的业务逻辑,从join连接查询产生一个view。先使用 视图完成一定的逻辑,再在视图的基础上完成另外的逻辑。
通常,视图完成的逻辑都是相对比较基础的逻辑。
- 增加数据的安全性,通过视图,用户只能查询和修改指定的数据。
- 提高表的逻辑独立性,视图可以屏蔽原有表结构变化带来的影响。
总之,使用视图的大部分情况是为了保障数据安全性,提高查询效率
- 查看视图必须要有SHOW VIEW权限
- 查看视图基本信息
DESCRIBE view_name; DESC view_name;-- DESCRIBE一般都简写成 DESC -- 显示了视图的字段定义、字段的数据类型、是否为空、是否为主/外键、默认值和额外信息
- 查看视图的信息
SHOW TABLE STATUS LIKE 'view_name'; -- COMMENT的值为VIEW说明该表为视图,其他的信息为NULL说明这是一个虚表,如果是基表那么会基表的信息,这是基表和视图的区别
- 查看视图详细信息
SHOW CREATE VIEW view_name; -- 结果显示视图的名称、创建视图的语句等信息 -- 对VIEWS表的查询可以查看数据库中所有视图的详细信息 SELECT * FROM `information_schema`.`VIEWS`;
- 查询视图
select * from view_name; • 1
- 修改视图
-- CREATE OR REPLACE VIEW 语句修改视图 CREATE OR REPLACE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
-- ALTER VIEW 语句修改视图 ALTER OR REPLACE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] -- 该语句用于更改已有视图的定义 -- 其语法与CREATE VIEW类似。当视图不存在时创建,存在时进行修改 ALTER VIEW stu_class AS SELECT stuno FROM student; alter view v_emp as select empno,ename,job,deptno from emp; alter view v_emp(v1,v2,v3,v4) as select empno,ename,job,deptno from emp;
- 更新视图:
更新视图是指通过视图来插入、更新、删除表数据,因为视图是虚表,其中没有数据。
通过视图更新的时候都是转到基表进行更新,
如果对视图增加或者删除记录,实际上是对基表增加或删除记录!
UPDATE view_name SET stuname='xiaofang' WHERE stuno=2
select * from view_name;
INSERT INTO view_name VALUES(6,'haojie') select * from view_name; DELETE FROM view_name WHERE stuno=1
当视图中包含如下内容的时候:
(1)视图中包含基本中被定义为非空的列
(2)定义视图的SELECT语句后的字段列表中使用了数学表达式
(3)定义视图的SELECT语句后的字段列表中使用聚合函数
(4)定义视图的SELECT语句中使用了DISTINCT、UNION、TOP、GROUP BY 、HAVING子句
视图的更新操作将不能被执行
- 删除视图
DROP VIEW [IF EXISTS] view_name [, view_name] ... [RESTRICT | CASCADE] DROP VIEW view_name; DROP view IF EXISTS view_name; SHOW CREATE VIEW view_name;
视图的更新
mysql> select * from dept; +--------+-------+-----------+ | deptno | dname | loc | +--------+-------+-----------+ | 10 | bsc | puyang | | 11 | bts | xuchang | | 12 | 0521 | zhengzhou | +--------+-------+-----------+ 3 rows in set (0.01 sec) mysql> create view v_dept as select deptno,dname from dept; Query OK, 0 rows affected (0.00 sec) mysql> select * from v_dept; +--------+-------+ | deptno | dname | +--------+-------+ | 10 | bsc | | 11 | bts | | 12 | 0521 | +--------+-------+ 3 rows in set (0.23 sec) mysql> update v_dept set dname='MSC' where deptno=12;(更新视图) Query OK, 1 row affected (0.03 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from v_dept; +--------+-------+ | deptno | dname | +--------+-------+ | 10 | bsc | | 11 | bts | | 12 | MSC | +--------+-------+ 3 rows in set (0.00 sec) mysql> select * from dept;(基表对应的数据也更新) +--------+-------+-----------+ | deptno | dname | loc | +--------+-------+-----------+ | 10 | bsc | puyang | | 11 | bts | xuchang | | 12 | MSC | zhengzhou | +--------+-------+-----------+ 3 rows in set (0.00 sec) 删除视图的数据: mysql> delete from v_dept where deptno=10; Query OK, 1 row affected (0.00 sec) mysql> select * from v_dept; +--------+-------+ | deptno | dname | +--------+-------+ | 11 | bts | | 12 | MSC | +--------+-------+ 2 rows in set (0.00 sec) mysql> select * from dept;(基表对应的记录也被删除了) +--------+-------+-----------+ | deptno | dname | loc | +--------+-------+-----------+ | 11 | bts | xuchang | | 12 | MSC | zhengzhou | +--------+-------+-----------+ 2 rows in set (0.00 sec)
不可更新的视图
某些视图是可更新的。也就是说,可以在诸如UPDATE、DELETE或INSERT等语句中使用它们,以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。更具体地讲,如果视图包含下述结构中的任何一种,那么它就是不可更新的:
- 聚合函数(SUM(), MIN(), MAX(), COUNT()等)。
- DISTINCT
- GROUP BY
- HAVING
- UNION或UNION ALL
- 位于选择列表中的子查询
- Join
- FROM子句中的不可更新视图
- WHERE子句中的子查询,引用FROM子句中的表
- 仅引用文字值(在该情况下,没有要更新的基本表)。
- ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。
创建不可更新的视图:(使用临时表的算法) mysql> create algorithm=temptable view v_dept2 as select * from dept; Query OK, 0 rows affected (0.00 sec) mysql> show create view v_dept2\G *************************** 1. row *************************** View: v_dept2 Create View: CREATE ALGORITHM=TEMPTABLE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_dept2` AS select `dept`.`deptno` AS `deptno`,`dept`.`dname` AS `dname`,`dept`.`loc` AS `loc` from `dept` character_set_client: gbk collation_connection: gbk_chinese_ci 1 row in set (0.00 sec) 尝试更新视图,报错,(一定程度上保证了基表数据的安全性) mysql> update v_dept2 set loc='shanghai' where deptno=10; ERROR 1288 (HY000): The target table v_dept2 of the UPDATE is not updatable
关于视图的可插入性:insert
如果视图满足关于视图列的下述额外要求,可更新的视图也是可插入的:
- 不得有重复的视图列名称。
- 视图必须包含没有默认值的基表中的所有列。
- 视图列必须是简单的列引用而不是导出列。导出列不是简单的列引用,而是从表达式导出的。
下面给出了一些导出列示例:
- 3.14159
- col1 + 3
- UPPER(col2)
- col3 / col4
- (subquery)
混合了简单列引用和导出列的视图是不可插入的,但是,如果仅更新非导出列,视图是可更新的。