目录
[1. 视图规则和限制](#1. 视图规则和限制)
[2. 基本使用](#2. 基本使用)
[2.1 创建视图](#2.1 创建视图)
[2.2 修改视图](#2.2 修改视图)
[2.3 修改基表](#2.3 修改基表)
[2.4 删除视图](#2.4 删除视图)
视图是一个虚拟表,内容由查询定义。和真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。
1. 视图规则和限制
- 与表一样,必须唯一命名(不能出现同名视图或表名)
- 创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响
- 视图不能添加索引,也不能有关联的触发器或者默认值
- 视图可以提高安全性,必须具有足够的访问权限
- order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by,那么该视图中的 order by 将被覆盖
- 视图可以和表一起使用
2. 基本使用
2.1 创建视图
create view 视图名 as select语句;
例子:
sql
mysql> create view v_ename_dname as select ename,dname
-> from emp,dept where emp.deptno=dept.deptno;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+-----------------+
| Tables_in_scott |
+-----------------+
| dept |
| emp |
| salgrade |
| v_ename_dname | <--视图
+-----------------+
4 rows in set (0.00 sec)
mysql> select *from v_ename_dname order by dname;
+--------+------------+
| ename | dname |
+--------+------------+
| CLARK | ACCOUNTING |
| KING | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH | RESEARCH |
| JONES | RESEARCH |
| SCOTT | RESEARCH |
| ADAMS | RESEARCH |
| FORD | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| MARTIN | SALES |
| BLAKE | SALES |
| TURNER | SALES |
| JAMES | SALES |
+--------+------------+
14 rows in set (0.01 sec)
2.2 修改视图
修改了视图,对基表数据有影响
sql
mysql> select *from v_ename_dname order by dname;
+--------+------------+
| ename | dname |
+--------+------------+
| CLARK | ACCOUNTING | <--准备修改这个
| KING | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH | RESEARCH |
| JONES | RESEARCH |
| SCOTT | RESEARCH |
| ADAMS | RESEARCH |
| FORD | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| MARTIN | SALES |
| BLAKE | SALES |
| TURNER | SALES |
| JAMES | SALES |
+--------+------------+
14 rows in set (0.01 sec)
mysql> update v_ename_dname set ename='TEST' where ename='CLARK';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select *from v_ename_dname;
+--------+------------+
| ename | dname |
+--------+------------+
| SMITH | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| JONES | RESEARCH |
| MARTIN | SALES |
| BLAKE | SALES |
| TEST | ACCOUNTING | <--修改成功
| SCOTT | RESEARCH |
| KING | ACCOUNTING |
| TURNER | SALES |
| ADAMS | RESEARCH |
| JAMES | SALES |
| FORD | RESEARCH |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.00 sec)
mysql> select *from emp where ename='CLARK'; <--基表中找不到了
Empty set (0.00 sec)
mysql> select *from emp where ename='TEST'; <--被修改成 TEST 了
+--------+-------+---------+------+---------------------+---------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+--------+-------+---------+------+---------------------+---------+------+--------+
| 007782 | TEST | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450.00 | NULL | 10 |
+--------+-------+---------+------+---------------------+---------+------+--------+
1 row in set (0.00 sec)
2.3 修改基表
修改了基表,对视图有影响
sql
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> select *from emp where ename='JAMES';
+--------+-------+-------+------+---------------------+--------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+--------+-------+-------+------+---------------------+--------+------+--------+
| 007900 | JAMES | CLERK | 7698 | 1981-12-03 00:00:00 | 950.00 | NULL | 30 |
+--------+-------+-------+------+---------------------+--------+------+--------+
1 row in set (0.00 sec)
mysql> select *from v_ename_dname where ename='JAMES';
+-------+-------+
| ename | dname |
+-------+-------+
| JAMES | SALES |
+-------+-------+
1 row in set (0.00 sec)
mysql> update emp set deptno=10 where ename='JAMES';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select *from v_ename_dname where ename='JAMES';
+-------+------------+
| ename | dname |
+-------+------------+
| JAMES | ACCOUNTING | <--基表的修改,对视图产生影响
+-------+------------+
1 row in set (0.00 sec)
2.4 删除视图
drop view 视图名;
sql
mysql> show tables;
+-----------------+
| Tables_in_scott |
+-----------------+
| dept |
| emp |
| salgrade |
| v_ename_dname |
+-----------------+
4 rows in set (0.00 sec)
mysql> drop view v_ename_dname;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+-----------------+
| Tables_in_scott |
+-----------------+
| dept |
| emp |
| salgrade |
+-----------------+
3 rows in set (0.00 sec)