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语句进行展示了!感兴趣地可以自行尝试一下!

相关推荐
0xDevNull4 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花4 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸4 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain4 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希5 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神5 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员5 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java5 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿5 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴5 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存