MySQL之视图详解

华子目录

  • 什么是视图?
  • 创建视图
  • 查询
    • 查看创建视图语句
    • 查看视图数据
  • 修改视图结构
    • 方式1
    • 方式2
  • 删除视图
  • 在视图中插入数据
  • 视图的==with检查选项==
  • 视图的更新
  • 视图的作用和优点
  • 视图的使用规则
  • 案例

什么是视图?

  • 视图(view)是一种虚拟存在的表,视图中的数据并不在数据库中实际存在,视图中的数据来自定义视图时select查询的表,并且视图是动态生成的。
  • 通俗的讲:视图只保存了select的SQL逻辑,不保存查询结果。所以我们在创建视图时,主要工作就落在创建select查询语句上。
  • MySQL 视图是一个虚拟的表,它由一个 SQL 查询定义,并且不存储实际的数据。视图的数据来自于查询执行的结果,并且可以像表一样被查询、更新和删除。视图提供了一种简化复杂查询的方法,并且可以用来限制用户对数据库中特定数据的访问。
  • 视图的定义保存在数据字典内,创建视图所基于的表称为“基表”

创建视图

mysql> create [or replace] view 视图名[(字段列表)] as select语句 [with [cascaded/local] check option];

注:视图的字段列表写不写都无所谓

mysql> select * from stu;
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 101 | 小天   |  18 |    1001 |
| 102 | 小明   |  20 |    1003 |
| 103 | 小红   |  13 |    1002 |
+-----+--------+-----+---------+mysql> create or replace view view_stu as select id,name from stu where age>15;
Query OK, 0 rows affected (0.02 sec)mysql> show tables;
+-----------------+
| Tables_in_huazi |
+-----------------+
| account         |
| class           |
| department      |
| employee        |
| mytable         |
| stu             |
| view_employee   |
| view_stu        |
+-----------------+mysql> select * from view_stu;
+-----+--------+
| id  | name   |
+-----+--------+
| 101 | 小天   |
| 102 | 小明   |
+-----+--------+
mysql> select * from employee;
+------+-----------+-----------------+--------+-------+--------+
| id   | name      | job             | salary | bonus | job_id |
+------+-----------+-----------------+--------+-------+--------+
|  101 | 麦当      | 后端研发        |  25000 |  5000 |   1003 |
|  102 | 咕咚      | 网络运维        |  15000 |  3000 |   1003 |
|  103 | 迪亚      | 测试工程师      |  12000 |  2000 |   1003 |
|  104 | 米龙      | 后端开发        |  20000 |  3500 |   1003 |
|  105 | 极光      | 前端开发        |  15000 |  2500 |   1003 |
|  106 | 村长      | 人力资源        |  10000 |   500 |   1001 |
|  107 | 五条人    | 销售工程师      |  14000 |  7000 |   1002 |
|  108 | 皇帝      | 董事长          |  30000 | 10000 |   1004 |
+------+-----------+-----------------+--------+-------+--------+mysql> create or replace view view_employee(id,name,salary) as select * from employee where salary>15000;
ERROR 1353 (HY000): In definition of view, derived table or common table expression, SELECT list and column names list have different column counts
#报错原因:视图的字段列表和select的字段列表必须一致,否则就会报错mysql> create or replace view view_employee(id,name,salary) as select id,name,salary from employee where salary>15000;
Query OK, 0 rows affected (0.00 sec)mysql> show tables;
+-----------------+
| Tables_in_huazi |
+-----------------+
| account         |
| class           |
| department      |
| employee        |
| mytable         |
| stu             |
| view_employee   |
+-----------------+mysql> select * from view_employee;
+------+--------+--------+
| id   | name   | salary |
+------+--------+--------+
|  101 | 麦当   |  25000 |
|  104 | 米龙   |  20000 |
|  108 | 皇帝   |  30000 |
+------+--------+--------+

查询

查看创建视图语句

mysql> show create view 视图名\G;
mysql> show create view view_employee;
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View          | Create View| character_set_client | collation_connection |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| view_employee | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_employee` (`id`,`name`,`salary`) AS select `employee`.`id` AS `id`,`employee`.`name` AS `name`,`employee`.`salary` AS `salary` from `employee` where (`employee`.`salary` > 15000) | utf8mb4              | utf8mb4_0900_ai_ci   |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+mysql> show create view view_employee\G;
*************************** 1. row ***************************View: view_employeeCreate View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_employee` (`id`,`name`,`salary`) AS select `employee`.`id` AS `id`,`employee`.`name` AS `name`,`employee`.`salary` AS `salary` from `employee` where (`employee`.`salary` > 15000)
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci

查看视图数据

mysql> select * from 视图名;
mysql> select * from view_employee;
+------+--------+--------+
| id   | name   | salary |
+------+--------+--------+
|  101 | 麦当   |  25000 |
|  104 | 米龙   |  20000 |
|  108 | 皇帝   |  30000 |
+------+--------+--------+

修改视图结构

方式1

mysql> create [or replace] view 视图名[(字段列表)] as select语句 [with [cascaded/local] check option];
mysql> select * from view_employee;
+------+--------+--------+
| id   | name   | salary |
+------+--------+--------+
|  101 | 麦当   |  25000 |
|  104 | 米龙   |  20000 |
|  108 | 皇帝   |  30000 |
+------+--------+--------+mysql> create or replace view view_employee as select id,name from employee where salary>15000;
Query OK, 0 rows affected (0.00 sec)mysql> select * from view_employee;
+------+--------+
| id   | name   |
+------+--------+
|  101 | 麦当   |
|  104 | 米龙   |
|  108 | 皇帝   |
+------+--------+

注:视图的字段列表写不写都无所谓

方式2

mysql> alter view 视图名[(字段列表)] as select语句 [with [cascaded/local] check option];
mysql> select * from stu;
+-----+--------+-----+---------+
| id  | name   | age | classid |
+-----+--------+-----+---------+
| 101 | 小天   |  18 |    1001 |
| 102 | 小明   |  20 |    1003 |
| 103 | 小红   |  13 |    1002 |
+-----+--------+-----+---------+mysql> select * from view_stu;
+-----+--------+
| id  | name   |
+-----+--------+
| 101 | 小天   |
| 102 | 小明   |
+-----+--------+mysql> alter view view_stu as select id,name,age from stu where age>15;
Query OK, 0 rows affected (0.03 sec)mysql> select * from view_stu;
+-----+--------+-----+
| id  | name   | age |
+-----+--------+-----+
| 101 | 小天   |  18 |
| 102 | 小明   |  20 |
+-----+--------+-----+

注:视图的字段列表写不写都无所谓

删除视图

mysql> drop view [if exists] 视图名;
mysql> show tables;
+-----------------+
| Tables_in_huazi |
+-----------------+
| account         |
| class           |
| department      |
| employee        |
| mytable         |
| stu             |
| view_employee   |
| view_stu        |
+-----------------+mysql> drop view if exists view_stu;
Query OK, 0 rows affected (0.00 sec)mysql> show tables;
+-----------------+
| Tables_in_huazi |
+-----------------+
| account         |
| class           |
| department      |
| employee        |
| mytable         |
| stu             |
| view_employee   |
+-----------------+

在视图中插入数据

在这里插入图片描述
注:在视图中插入数据,都是基于基表的插入条件

mysql> create view view_account as select id,name from account where money>=2000;
Query OK, 0 rows affected (0.01 sec)mysql> show tables;
+-----------------+
| Tables_in_huazi |
+-----------------+
| account         |
| class           |
| department      |
| employee        |
| mytable         |
| stu             |
| view_account    |
| view_employee   |
+-----------------+mysql> select * from view_account;
+----+--------+
| id | name   |
+----+--------+
|  1 | 张三   |
|  2 | 李四   |
+----+--------+mysql> insert into view_account values-> (3,'小明');
Query OK, 1 row affected (0.01 sec)mysql> select * from view_account;
+----+--------+
| id | name   |
+----+--------+
|  1 | 张三   |
|  2 | 李四   |
+----+--------+mysql> select * from account;
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | 张三   |  2000 |
|  2 | 李四   |  2000 |
|  3 | 小明   |  NULL |
+----+--------+-------+
mysql> select * from account;
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | 张三   |  2000 |
|  2 | 李四   |  2000 |
+----+--------+-------+#将主表中的money字段修改约束条件为not null
mysql> alter table account modify money int not null;
Query OK, 0 rows affected (0.06 sec)mysql> show create table account\G;
*************************** 1. row ***************************Table: account
Create Table: CREATE TABLE `account` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(10) NOT NULL,`money` int NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='账户表'mysql> select * from view_account;
+----+--------+
| id | name   |
+----+--------+
|  1 | 张三   |
|  2 | 李四   |
+----+--------+#插入失败的原因:主表中的money字段是not null
mysql> insert int view_account values-> (3,'小明');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'int view_account values
(3,'小明')' at line 1

视图的with检查选项

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

视图的更新

  • 要使视图可更新,视图数据的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可更新:
    在这里插入图片描述

视图的作用和优点

在这里插入图片描述
作用:

  • 控制安全
  • 保存查询数据

优点:

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

视图的使用规则

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

案例

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/508895.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab 写入格式化文本文件

目录 一、save函数 二、fprintf函数 matlab 写入文本文件可以使用save和fprintf函数 save输出结果: fprintf输出结果: 1.23, 2.34, 3.45 4.56, 5.67, 6.78 7.89, 8.90, 9.01 可以看出fprintf输出结果更加人性化,符合要求,下面分别介绍。 一、save函数 …

可让照片人物“开口说话”阿里图生视频模型EMO,高启强普法

3 月 1 日消息,阿里巴巴研究团队近日发布了一款名为“EMO(Emote Portrait Alive)”的 AI 框架,该框架号称可以用于“对口型”,只需要输入人物照片及音频,模型就能够让照片中的人物开口说出相关音频&#xf…

第105讲:Mycat垂直分表实战:从规划到解决问题的完整指南

文章目录 1.垂直分表的背景2.垂直分表案例实战2.1.垂直分表规划2.2.配置Mycat实现垂直分表2.3.重启Mycat2.4.在Mycat命令行中导入数据结构2.5.查看由Mycat分表后每个分片上存储的表2.6.Mycat垂直分表后可能遇到的问题2.7.垂直分表完成 1.垂直分表的背景 我们的商城系统数据库&…

熔断降级 spring事务

如果有事务处理,会先把事务的自动提交给关闭

泡软超时干腐竹方法

先拿一包商场买回来的干腐竹 然后 接一大碗温水 千万不要用很烫的水 盖上 让腐竹好好泡 5 分钟 泡 5 分钟后 捞出来即可

3、JavaWeb-Ajax/Axios-前端工程化-Element

P34 Ajax介绍 Ajax:Asynchroous JavaScript And XML,异步的JS和XML JS网页动作,XML一种标记语言,存储数据, 作用: 数据交换:通过Ajax给服务器发送请求, 并获取服务器响应的数据 异步交互&am…

072:vue+cesium 实现下雪效果

第072个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中实现下雪效果,这里使用着色器来实现实例特效。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共120行)着色代码实现心得:专栏目标示例效果

Python电能质量扰动信号分类(六)基于扰动信号特征提取的超强机器学习识别模型

目录 往期精彩内容: 前言 1 数据集和特征提取 1.1 数据集导入 1.2 扰动信号特征提取 2超强模型XGBoost——原理介绍 2.1 原理介绍 2.2 特征数据集制作 3 模型评估和对比 3.1 随机森林分类模型 3.2 支持向量机SVM分类模型 3.3 XGBoost分类模型 代码、数据…

Qt 简约美观的加载动画 第九季

这次和大家分享6个非常清爽的加载动画. &#x1f60a; 效果如下 &#x1f60a; 一共三个文件 , 可以直接编译运行的呢 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QGridLayout> int main(int argc, char *argv[]) …

css样式元素的相对定位,绝对定位,固定定位等元素定位运用技巧详解

文章目录 1.相对定位 relative2.绝对定位 absolute3.固定定位4.display 转换元素5.float浮动6.float产生内容塌陷问题7.overflow CSS样式学习宝典&#xff0c;关注点赞加收藏&#xff0c;防止迷路哦 在CSS中关于定位的内容是&#xff1a;position:relative | absolute | static…

Java进阶-测试方法

来学习一下软件测试相关的方法&#xff0c;了解一下黑盒测试和白盒测试&#xff0c;以及后面要用到的JUnit单元测试。JUnit单元测试也属于白盒测试&#xff0c;这次内容较少且相对简单。 一、软件测试方法 1、黑盒测试 不需要写代码&#xff0c;给输入值&#xff0c;看程序…

【Tomcat】The CATALINA_HOME environment variable is not defined correctly

文章目录 一、问题二、解决办法三、优化 一、问题 运行绿色版Tomcat时&#xff0c;单击apache-tomcat-9.0.27\bin\startup.bat时窗口一闪而过。 检查JAVA_HOME环境变量&#xff0c;可以发现并没有问题。 为了检查错误&#xff0c;将startup.bat程序使用文本编辑器打开&#x…