mysql基础——视图
文章目录
- mysql视图
- 创建视图
- 删除视图
- view与table的不同
- 视图的理解
- 视图的使用注意事项
mysql视图
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图
简单来说就是:
我们可以把视图当成一个表来进行查询,但这个表也不完全是我们之前理解的那个表一样。
视图这个表是从基表出来的, 它的变化会影响基表的变化!
接下来, 我们将针对于mysql的视图做一个讲解!
创建视图
首先,我们先来了解视图是如何创建的,展示一下视图究竟是什么:
# 视图的创建sql语句:
create view 视图名 as select语句;
由该sql语句我们可以发现,所谓的视图其实就是:
我们使用select从基表中选取指定的内容,然后形成一个视图!
mysql> select * from EMP;
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1983-01-12 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)mysql> create view EJD as select ENAME, JOB, DEPTNO from EMP;
Query OK, 0 rows affected (0.01 sec)mysql> select * from EJD;
+--------+-----------+--------+
| ENAME | JOB | DEPTNO |
+--------+-----------+--------+
| SMITH | CLERK | 20 |
| ALLEN | SALESMAN | 30 |
| WARD | SALESMAN | 30 |
| JONES | MANAGER | 20 |
| MARTIN | SALESMAN | 30 |
| BLAKE | MANAGER | 30 |
| CLARK | MANAGER | 10 |
| SCOTT | ANALYST | 20 |
| KING | PRESIDENT | 10 |
| TURNER | SALESMAN | 30 |
| ADAMS | CLERK | 20 |
| JAMES | CLERK | 30 |
| FORD | ANALYST | 20 |
| MILLER | CLERK | 10 |
+--------+-----------+--------+
14 rows in set (0.00 sec)
由此可见,我们前面的说法是基本正确的!
创建视图,我们确实是可以当作成创建了一个新的表!也可正常使用select语句查询!
删除视图
有了创建视图,我们也可以尝试删除视图!
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| DEPT |
| EJD |
| EMP |
| SALGRADE |
| ar |
| articles |
| db |
| exam_result |
| marks |
| msg |
| my |
| students |
| t1 |
+----------------+
13 rows in set (0.00 sec)mysql> drop table EJD;
ERROR 1051 (42S02): Unknown table 'test.EJD'
mysql> drop view EJD;
Query OK, 0 rows affected (0.01 sec)
虽然我们可以通过语句show tables查询出来创建的视图!
但是,当我们要进行删除的时候,我们是不能把视图当成table来进行删除的!
我们需要使用:
drop view 视图名
这样子才能成功删除!
view与table的不同
上述我们已经理解了如何创建和删除一个视图,也看见了视图是什么东西。
但是,目前来看,我们还是不知道为什么要有视图这个东西,这个和table看着也没啥区别。
接下来,我们将深入地去了解,视图究竟是什么东西!
我们尝试着对视图进行一些修改操作:
mysql> select * from EJD;
+--------+-----------+--------+
| ENAME | JOB | DEPTNO |
+--------+-----------+--------+
| SMITH | CLERK | 20 |
| ALLEN | SALESMAN | 30 |
| WARD | SALESMAN | 30 |
| JONES | MANAGER | 20 |
| MARTIN | SALESMAN | 30 |
| BLAKE | MANAGER | 30 |
| CLARK | MANAGER | 10 |
| SCOTT | ANALYST | 20 |
| KING | PRESIDENT | 10 |
| TURNER | SALESMAN | 30 |
| ADAMS | CLERK | 20 |
| JAMES | CLERK | 30 |
| FORD | ANALYST | 20 |
| MILLER | CLERK | 10 |
+--------+-----------+--------+
14 rows in set (0.00 sec)mysql> update EJD set ENAME='smith' where ENAME='SMITH';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from EJD;
+--------+-----------+--------+
| ENAME | JOB | DEPTNO |
+--------+-----------+--------+
| smith | CLERK | 20 |
| ALLEN | SALESMAN | 30 |
| WARD | SALESMAN | 30 |
| JONES | MANAGER | 20 |
| MARTIN | SALESMAN | 30 |
| BLAKE | MANAGER | 30 |
| CLARK | MANAGER | 10 |
| SCOTT | ANALYST | 20 |
| KING | PRESIDENT | 10 |
| TURNER | SALESMAN | 30 |
| ADAMS | CLERK | 20 |
| JAMES | CLERK | 30 |
| FORD | ANALYST | 20 |
| MILLER | CLERK | 10 |
+--------+-----------+--------+
14 rows in set (0.00 sec)
这看似是没有什么问题,然而我们再去查询EMP表:

我们可以很明显地发现:如果我们对从EMP表中创建的视图进行修改了,EMP表也被修改!
这就证实了我们之前说的结论:视图的修改会影响基表!
反过来也是一样的:如果我们在原表中插入一个新的数据,视图也是进行更新的!

视图的理解
所以视图并不是我们在mysql中理解到的常规意义上的表,它更像是基表的一个便捷查询!
比如说有些表中的某些字段,我们可能需要经常拿出来使用,但是我们又不想写那么长的sql的时候,我们就可以考虑创建这么一个视图!
是基于一下亮点考量的:
1.确实是不用写那么长的sql语句
2.mysql会自动管理视图的变化!我们不用担心增删改的影响!
视图就像一个保存好的、复杂的SQL查询的“快捷方式”或“别名”:
优点:简化查询、增强安全、实现逻辑独立
本质:它不存储数据(物化视图除外),只是一个查询定义
操作:对视图的查询就是实时执行其定义。对视图的更新(在允许的情况下)会最终作用到基表上
我们用一张图就能特别清晰地展现视图地特点:

视图的使用注意事项
当然,视图还是有一些注意事项是需要我们去了解的:
1.与表一样,必须唯一命名(不能出现同名视图或表名)
2.创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响(创建视图必然会影响单表结构复杂性,因为需要涉及到视图与基表之间的关联)
特别是从视图中创建视图,这会极大影响mysql的查询效率!
3.视图不能添加索引,也不能有关联的触发器或者默认值
因为视图本身就不是真实的表!没办法查询数据的!无法添加索引,也没有默认值!
4.视图可以提高安全性,必须具有足够的访问权限
可以只给其他人提供视图的某种权限,这样子可以在一定程度上保障隐私数据的安全性
5.order by可以用在视图中,但是如果从该视图检索数据 select 中也含有order by ,那么该视图中的order by
甚至在mysql下:创建视图的order by都被直接忽略了!


但是有一个例外,就是配合limit使用的时候:

因为此时,mysql需要确定排序后,再来选取显示的行数!这点了解即可!
6.视图可以和表一起使用
这点的意思就是告诉我们:视图虽然是个虚拟的表,但是可以普通的表一起使用:
包括我们之前所学的笛卡尔积、内外连接、复合查询等…
这里我们就不再使用sql语句进行展示了!感兴趣地可以自行尝试一下!
