MySQL数据库之视图

目录

  • 视图
    • 1、视图定义
    • 1、为什么需要视图
    • 3、视图的作用优点
      • 作用:
      • 优点:
    • 4、创建视图
    • 5、视图使用规则
      • 1)视图的嵌套:
      • 2)视图排序的覆盖
    • 6、修改视图
      • 多表连接视图:复杂视图
    • 7、 删除视图
    • 8:MySQL数据库中的视图保存:

视图

1、视图定义

视图通过以定制的方式显示来自一个或多个表的数据
视图是一种数据库对象,用户可以像查询普通表一样查询视图
视图内其实没有存储任何数据,它只是对表的一个查询
视图的定义保存在数据字典内,创建视图所基于对表称为“基表”

1、为什么需要视图

例如经常要对emp和dept表进行连接查询,每次都要做表的连接,写同样的一串语句,同时由于工资列队数据比较敏感,对外要求不可见;使用子查询,每次做表的连接写的语句过长,把查询语句做成视图,下次查询视图就好了;
对这样的问题就可以通过视图来解决。

3、视图的作用优点

作用:

控制安全
保存查询数据

优点:

提供了灵活一致级别安全性。
隐藏了数据的复杂性
简化了用户的SQL指令
通过重命名列,从另一个角度提供数据

4、创建视图

CREATE [OR REPLACE] VIEW 视图名[(alias[, alias]...)]--为视图字段指定别名AS subquery[WITH READ ONLY];

举例说明:创建视图, emp_V1, 包括10号部门的所有雇员信息.

mysql> create view emp_v1 as  //创建视图emp_v1-> select * from emp-> where deptno=10;
Query OK, 0 rows affected (0.00 sec)mysql> select * from emp_v1;
+-------+-----------+-----------+------+------------+-------+------+--------+
| empno | ename     | job       | mgr  | hiredate   | sai   | comm | deptno |
+-------+-----------+-----------+------+------------+-------+------+--------+
|  1007 | 张飞      | 经理      | 1009 | 2001-09-01 | 24500 | NULL |     10 |
|  1009 | 曾阿牛    | 董事长    | NULL | 2001-11-17 | 50000 | NULL |     10 |
|  1014 | 黄盖      | 文员      | 1007 | 2002-01-23 | 13000 | NULL |     10 |
+-------+-----------+-----------+------+------------+-------+------+--------+
3 rows in set (0.00 sec)

5、视图使用规则

  1. 视图必须有唯一命名
  2. 在mysql中视图的数量没有限制
  3. 创建视图必须从管理员那里获得必要的权限
  4. 视图支持嵌套,也就是说可以利用其他视图检索出来的数据创建新的视图
  5. 在视图中可以使用OREDR BY,但是如果视图内已经使用该排序子句,则视图的ORDER BY将覆盖前面的 ORDER BY。
  6. 视图不能索引,也不能关联触发器或默认值。
  7. 视图可以和表同时使用

1)视图的嵌套:

4 . 视图支持嵌套,也就是说可以利用其他视图检索出来的数据创建新的视图
可以在创建视图emp_v2中进行嵌套emp_v1;

mysql> create view emp_v1 as-> select * from emp-> where deptno=10;
Query OK, 0 rows affected (0.00 sec)mysql> select * from emp_v1;
+-------+-----------+-----------+------+------------+-------+------+--------+
| empno | ename     | job       | mgr  | hiredate   | sai   | comm | deptno |
+-------+-----------+-----------+------+------------+-------+------+--------+
|  1007 | 张飞      | 经理      | 1009 | 2001-09-01 | 24500 | NULL |     10 |
|  1009 | 曾阿牛    | 董事长    | NULL | 2001-11-17 | 50000 | NULL |     10 |
|  1014 | 黄盖      | 文员      | 1007 | 2002-01-23 | 13000 | NULL |     10 |
+-------+-----------+-----------+------+------------+-------+------+--------+
3 rows in set (0.00 sec)mysql> create view emp_v2 as //创建视图emp_v2嵌套emp_v1-> select * from emp_v1-> where job='文员';
Query OK, 0 rows affected (0.00 sec)mysql> select * from emp_v2-> ;
+-------+--------+--------+------+------------+-------+------+--------+
| empno | ename  | job    | mgr  | hiredate   | sai   | comm | deptno |
+-------+--------+--------+------+------------+-------+------+--------+
|  1014 | 黄盖   | 文员   | 1007 | 2002-01-23 | 13000 | NULL |     10 |
+-------+--------+--------+------+------------+-------+------+--------+
1 row in set (0.00 sec)

2)视图排序的覆盖

5 . 在视图中可以使用OREDR BY,但是如果视图内已经使用该排序子句,则视图的ORDER BY将覆盖前面的 ORDER BY。
下面举例说明,新的视图排序会覆盖原来的视图排序

mysql> create view emp_v3 as-> select * from emp_v1-> order by sai desc;
Query OK, 0 rows affected (0.00 sec)mysql> select * from emp_v3; //此处是降序的排序
+-------+-----------+-----------+------+------------+-------+------+--------+
| empno | ename     | job       | mgr  | hiredate   | sai   | comm | deptno |
+-------+-----------+-----------+------+------------+-------+------+--------+
|  1009 | 曾阿牛    | 董事长    | NULL | 2001-11-17 | 50000 | NULL |     10 |
|  1007 | 张飞      | 经理      | 1009 | 2001-09-01 | 24500 | NULL |     10 |
|  1014 | 黄盖      | 文员      | 1007 | 2002-01-23 | 13000 | NULL |     10 |
+-------+-----------+-----------+------+------------+-------+------+--------+
3 rows in set (0.00 sec)mysql> select * from emp_v3-> order by sai;           //这里覆盖之前升序排序
+-------+-----------+-----------+------+------------+-------+------+--------+
| empno | ename     | job       | mgr  | hiredate   | sai   | comm | deptno |
+-------+-----------+-----------+------+------------+-------+------+--------+
|  1014 | 黄盖      | 文员      | 1007 | 2002-01-23 | 13000 | NULL |     10 |
|  1007 | 张飞      | 经理      | 1009 | 2001-09-01 | 24500 | NULL |     10 |
|  1009 | 曾阿牛    | 董事长    | NULL | 2001-11-17 | 50000 | NULL |     10 |
+-------+-----------+-----------+------+------------+-------+------+--------+
3 rows in set (0.00 sec)

6、修改视图

修改视图可以有两种方法进行修改

使用CREATE OR REPLACE VIEW 语句修改EMP_V_10 视图. 为每个列指定列名.–CREATE OR REPLACE VIEW emp_v_10–(id, name, sal, dept_id)–AS SELECT id,name, –salary, dept_id–FROM employees–WHERE dept_id = 10;在CREATE VIEW 语句中字段与子查询中的字段必须一一对应,否则就别指定别名,或在子查询中指定别名使用ALTER VIEW 语句修改EMP_V_10 视图. 为每个列指定列名.–ALTER VIEW emp_v_10–(id, name, sal, dept_id)–AS SELECT id,name, –salary, dept_id–FROM employees–WHERE dept_id = 10;在CREATE VIEW 语句中字段与子查询中的字段必须一一对应,否则就别指定别名,或在子查询中指定别名

2)创建复杂视图
创建一个从两个表中查询数据,并进行分组计算的复杂视图.
在数据库中插入另一个表

mysql> select * from dept;
+--------+-----------+--------+
| deptno | dname     | lo     |
+--------+-----------+--------+
|     10 | 教研部    | 北京   |
|     20 | 学工部    | 上海   |
|     30 | 销售部    | 广州   |
|     40 | 财务部    | 武汉   |
+--------+-----------+--------+
4 rows in set (0.00 sec)

多表连接视图:复杂视图

多个表更体现出视图的优势
创建复杂视图将两个表连接起来

mysql> create view emp_v4 as-> select e.*,d.dname-> from dept d,-> (select deptno,count(1) from emp-> group by deptno-> having count(1)>=1) e-> where d.deptno=e.deptno;
Query OK, 0 rows affected (0.00 sec)mysql> select * from emp_v4;
+--------+----------+-----------+
| deptno | count(1) | dname     |
+--------+----------+-----------+
|     10 |        3 | 教研部    |
|     20 |        4 | 学工部    |
|     30 |        6 | 销售部    |
+--------+----------+-----------+
3 rows in set (0.00 sec)

7、 删除视图

   删掉视图不会导致数据的丢失,因为视图是基于数据库的表之上的一个查询定义.  DROP VIEW view_name;
mysql> drop view emp_v1;
Query OK, 0 rows affected (0.00 sec)mysql> drop view emp_v2;
Query OK, 0 rows affected (0.00 sec)

8:MySQL数据库中的视图保存:

MySQL视图保存在information_schema表里面

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db                 |
| db1                |
| gtid               |
| it                 |
| mysql              |
| performance_schema |
| sys                |
| test               |
| test2              |
+--------------------+
10 rows in set (0.00 sec)mysql> use information_schema

需要进入information_schema数据库进行查看视图

mysql> select * from VIEWS ->  where TABLE_NAME='emp_v1'\G;
*************************** 1. row ***************************TABLE_CATALOG: defTABLE_SCHEMA: db1TABLE_NAME: emp_v1VIEW_DEFINITION: select `db1`.`emp`.`empno` AS `empno`,`db1`.`emp`.`ename` AS `ename`,`db1`.`emp`.`job` AS `job`,`db1`.`emp`.`mgr` AS `mgr`,`db1`.`emp`.`hiredate` AS `hiredate`,`db1`.`emp`.`sai` AS `sai`,`db1`.`emp`.`comm` AS `comm`,`db1`.`emp`.`deptno` AS `deptno` from `db1`.`emp` where (`db1`.`emp`.`deptno` = 10)CHECK_OPTION: NONEIS_UPDATABLE: YESDEFINER: root@localhostSECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
1 row in set (0.00 sec)ERROR:
No query specifiedmysql>

MySQL的视图定义、规则与视图作用、创建视图和修改视图,以及视图的保存相关推荐

  1. MySQL 进阶 视图 -- 视图介绍、视图CRUD语法、检查选项(CASCADED、LOCAL)、视图的更新、视图作用、视图案例

    文章目录 1. 视图 1.1 视图介绍 1.2 语法 1.2.1 创建视图 1.2.2 查询视图 1.2.3 修改视图 1.2.4 删除视图 1.2.5 插入数据说明 1.3 检查选项 1.3.1 C ...

  2. mysql修改视图定义_MySQL修改视图

    修改视图是指修改 MySQL 数据库中存在的视图,当基本表的某些字段发生变化时,可以通过修改视图来保持与基本表的一致性. 基本语法 可以使用 ALTER VIEW 语句来对已有的视图进行修改. 语法格 ...

  3. mysql 1356_MySQL视图定义者权限和错误1356

    背景 我有一个MySQL表G.devTest,看起来像这样:MySQL视图定义者权限和错误1356 +----+------+ | id | j | +----+------+ | 1 | 5 | | ...

  4. 创建mysql视图语法正确的是_MySQL创建视图的语法格式

    视图,具有简化查询语句.安全性和保证逻辑数据独立性等作用 创建视图的语法格式 视图中,包含SELECT查询的结果,因此,视图的创建基于SELECT语句,和已经存在的数据表,视图可以建立在一张表上,也可 ...

  5. oracle 隐藏视图定义,Oracle中视图(views)的含义

    很多时候在书本上也好在其他的一些学习博客里也好,有关数据库知识时经常看到视图,那么视图(views)到底是什么呢,有什么作用呢? 1.视图的定义 视图是存储在数据字典里的一条select语句. 通过创 ...

  6. MVC路由自定义及视图找寻规则

    这篇关于MVC路由及视图规则本来是昨天要发的,但是本人真的有点懒,终于今天忍无可忍了.初学MVC的时候比现在还菜一点(现在也很菜),想着会用就行,但是有时还是会好奇,为什么它能找到控制器?为什么控制器 ...

  7. 数据库--视图的基本概念以及作用

    视图(子查询):是从一个或多个表导出的虚拟的表,其内容由查询定义.具有普通表的结构,但是不实现数据存储. 对视图的修改:单表视图一般用于查询和修改,会改变基本表的数据, 多表视图一般用于查询,不会改变 ...

  8. 数据库视图的基本概念及作用

    一.视图简介 视图是从一个或几个基本表(或视图)中导出的虚拟的表.在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据.视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式.可以将视图看 ...

  9. oracle查看视图定义语句_oracle视图详解

    Oracle 视图详解 一. 视图的定义 视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的.视图只有逻辑定义.每次使用的时候,只是重新执行 ...

最新文章

  1. 利用抽象语法树检查Python中“未定义”的变量名
  2. 阿里云IoT百万资源,寻找极客合作伙伴
  3. circlegan_【源码解读】cycleGAN(二) :训练
  4. julia 编程语言_Julia编程语言中的变量
  5. win7系统任务管理器如何强制关闭程序
  6. Java 获取命令行输入数据(命令行输入,Scanner类)
  7. Namomo Spring Camp Div2 Week1 - 第二次打卡
  8. MAC 迅雷最新版无限重启BUG的解决方法
  9. pdca实施的流程图_(fmea七步法)过程流程图,FMEA,控制计划哪个在前哪个在后
  10. lammps数据后处理:Python Ovito 统计键长分布
  11. 怎么把java程序打包?java源代码打包方法
  12. 看完这篇 Linux 的基本操作你就会了!
  13. iOS 图片编辑——缩放剪切
  14. canvas_requestAnimationFrame帧率显示fps
  15. 计算机节能+关闭硬盘,优化三:CPU节能关闭_固态硬盘-中关村在线
  16. 双目相机标定Matlab
  17. html网易云音乐图片轮播效果,Vue之网易云音乐PC版轮播图的实现
  18. Games101-闫令琪 1-4讲 基础知识+变换 (笔记整理)
  19. 5.11 Go语言文本大数据处理(2):文件分割与入库
  20. 数据库系统发展的特点

热门文章

  1. 剑指 Offer 笔记: T58 - II. 左旋转字符串
  2. python安装虚拟环境没有activate_Python venv虚拟环境Activate的作用
  3. wpf 代码获取contextmenu_WPF 如何控制右键菜单ContextMenu的弹出
  4. 今日头条成功的核心技术秘诀是什么?深度解密个性化资讯推荐技术
  5. 【嵌入式学习-STM32F103-USART串口通信】
  6. HTML超链接的作用是什么,什么是超链接,有什么作用,如何创建超链接
  7. C语言案例教学设计论文,【教学设计论文】C语言中冒泡排序算法教学设计(共2525字)...
  8. 薄壁轴承摩擦力矩_等截面薄壁轴承常见三大问题分析
  9. 计算机专业职业理想作文400字,我的理想作文400字电竞职业选手
  10. H.266标准文本开放下载了