当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/618148.html

相关文章:

  • win系统做网站wordpress侧边文本轮播图片
  • 免费微商城平台官网一直在做竞价的网站是不是不需要做seo
  • 输出纹波实测:ASP3605在不同输入与负载条件下的稳定性表现
  • RAG向量索引-HNSW Hierarchical Navigable Small World 介绍
  • 沈阳做网站的企业重庆房产网站建设
  • 让老版 IntelliJ IDEA 2020.1.4 支持 JDK 17 启动 springboot3 项目
  • 网站开发逻辑商丘网站建设求职简历
  • [Linux网络——Lesson1.初识计算机网络]
  • 电子电气架构全解析
  • 5G技术:推动数字经济的下一个革命性浪潮
  • 5G与AI赋能智能制造:未来生产的双重驱动力
  • 从工业互联网到智慧城市:5G与物联网的跨界融合
  • 5G NR PBCH与MIB技术介绍
  • 怎么查询网站的点击量招商网站建设全包
  • TCN‑Transformer‑GRU(单输入‑单输出)在 MATLAB 中的实现思路与完整示例代码
  • 重庆市建设工程信息网站诚信分东莞海天网站建设
  • 【Linux】文件操作篇(二):实战理解硬链接与软链接
  • 在RK3568开发板嵌入式开发中,配置NFS服务是实现与Ubuntu虚拟机之间文件共享的常用方法
  • 使用mysql报Communications link failure异常解决
  • 【Linux驱动开发】Linux USB驱动架构详解
  • Linux服务器配置ssh免密登陆多台服务器、服务器别名配置
  • 百度推广青岛公司网站在线优化
  • java学习3-redis集成
  • 【Linux】深入理解进程(四)(进程地址空间)
  • 数据结构1.0 面试题
  • 网站定制哪家快高档网站设计公司
  • 信创产品认证机构有哪些?信创检测报告和信创产品评估证书如何办理?
  • 官方网站建设计划书文山做网站yunling88
  • 数据分析笔记12:函数
  • 如何驯服AI编程