视图
本篇将开始介绍有关数据库中视图的相关知识点,其中主要包含视图的基本使用,视图规则和限制。
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据,视图的数据变化会影响到基表,基表的数据变化也会影响到视图。
文章目录
- 视图
- 视图的基本使用
- 视图创建
- 修改视图/基表
- 删除视图
- 视图规则和限制
视图的基本使用
视图创建
创建视图的语法如下:
create view 视图名 as select语句;
案例如下:
-- 创建view
mysql> create view myview as select ename, dname from emp, dept where emp.deptno = dept.deptno;
Query OK, 0 rows affected (0.01 sec)mysql> select * from myview;
+--------+------------+
| ename | dname |
+--------+------------+
| SMITH | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| JONES | RESEARCH |
| MARTIN | SALES |
| BLAKE | SALES |
| CLARK | ACCOUNTING |
| SCOTT | RESEARCH |
| KING | ACCOUNTING |
| TURNER | SALES |
| ADAMS | RESEARCH |
| JAMES | SALES |
| FORD | RESEARCH |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.00 sec)
视图的创建其实就只是创建了对应的表格形式,便于我们进行对某些特定的数据进行修改,如下:
当我们在存储数据库表的目录下查询创建出的视图的时候,我们发现,在InnoDB引擎下创建出的视图相比于其他的数据库表,只有表格式,没有对应的数据组织形式。
修改视图/基表
由上文所知,视图只是存储了表格式,并没有存储对应的数据组织形式,也就意味着读取数据仍然是从基表的数据组织中读出对应的数据。所以,修改视图的数据会影响基表的数据,修改基表的数据会影响视图的数据。
如下,修改视图:
mysql> select * from dept;
+--------+------------+----------+
| deptno | dname | loc |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
4 rows in set (0.00 sec)mysql> update myview set dname = 'sales' where dname = 'SALES';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from dept;
+--------+------------+----------+
| deptno | dname | loc |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | sales | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
4 rows in set (0.01 sec)
当修改表,如下:
mysql> select * from myview;
+--------+------------+
| ename | dname |
+--------+------------+
| SMITH | RESEARCH |
| ALLEN | sales |
| WARD | sales |
| JONES | RESEARCH |
| MARTIN | sales |
| BLAKE | sales |
| CLARK | ACCOUNTING |
| SCOTT | RESEARCH |
| KING | ACCOUNTING |
| TURNER | sales |
| ADAMS | RESEARCH |
| JAMES | sales |
| FORD | RESEARCH |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.00 sec)mysql> update dept set dname = 'SALES' where dname = 'sales';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from myview;
+--------+------------+
| ename | dname |
+--------+------------+
| SMITH | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| JONES | RESEARCH |
| MARTIN | SALES |
| BLAKE | SALES |
| CLARK | ACCOUNTING |
| SCOTT | RESEARCH |
| KING | ACCOUNTING |
| TURNER | SALES |
| ADAMS | RESEARCH |
| JAMES | SALES |
| FORD | RESEARCH |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.00 sec)
如上所示,修改视图其实和修改表是一样的,都是修改表中存储的数据。
删除视图
删除视图的语法:
drop view 视图名;
视图规则和限制
视图的也存在一些对应的规则和限制,如下:
- 与表一样,必须唯一命名(不能出现同名视图或者表名)
- 创建视图数目没有限制,但要考虑复杂查询创建对视图之后的性能影响
- 视图不能添加索引,也不能有关联的触发器或者默认值
- 视图可以提高安全性,必须具有足够的访问权限
- order by可以在视图中使用,但是如果从该视图检索数据时select中也含有order by,那么该视图的order by将会被覆盖
- 视图可以和表一起使用