mysql基础——视图

文章目录

mysql视图

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图

简单来说就是:

我们可以把视图当成一个表来进行查询,但这个表也不完全是我们之前理解的那个表一样。

视图这个表是从基表出来的, 它的变化会影响基表的变化!

接下来, 我们将针对于mysql的视图做一个讲解!

创建视图

首先,我们先来了解视图是如何创建的,展示一下视图究竟是什么:

sql 复制代码
# 视图的创建sql语句:
create view 视图名 as select语句;

由该sql语句我们可以发现,所谓的视图其实就是:

我们使用select从基表中选取指定的内容,然后形成一个视图!

sql 复制代码
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语句查询!

删除视图

有了创建视图,我们也可以尝试删除视图!

sql 复制代码
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来进行删除的!

我们需要使用:

sql 复制代码
drop view 视图名

这样子才能成功删除!

view与table的不同

上述我们已经理解了如何创建和删除一个视图,也看见了视图是什么东西。

但是,目前来看,我们还是不知道为什么要有视图这个东西,这个和table看着也没啥区别。

接下来,我们将深入地去了解,视图究竟是什么东西!

我们尝试着对视图进行一些修改操作:

sql 复制代码
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: 0

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)

这看似是没有什么问题,然而我们再去查询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语句进行展示了!感兴趣地可以自行尝试一下!

相关推荐
q***58192 小时前
【HTML+CSS】使用HTML与后端技术连接数据库
css·数据库·html
Ctrl+S 之后3 小时前
分布式数据库高可用架构设计与动态一致性优化实践经验分享
数据库·经验分享·分布式
沐浴露z4 小时前
详解 MySQL 自适应哈希
数据库·mysql·哈希算法
小五Z4 小时前
MySQL--事务
数据库·mysql
小许学java4 小时前
MySQL存储过程
数据库·mysql·存储过程
Elias不吃糖6 小时前
MYSQL指令合集
数据库·mysql
!chen8 小时前
解决 Oracle 监听外网 IP
数据库·tcp/ip·oracle
LBuffer8 小时前
破解入门学习笔记题四十六
数据库·笔记·学习
chase。8 小时前
关于 nvidia-smi: no devices were found 解决方案
服务器·数据库·postgresql