1、准备工作

在MySQL数据库中创建两张表balance(余额表)和customer(客户表)并插入数据。

create table customer(
id int(10) primary key,
name char(20) not null,
role char(20) not null,
phone char(20) not null,
sex char(10) not null,
address char(50) not null
)ENGINE=InnoDB DEFAULT CHARSET=utf8; #外键为customerId
create table balance(
id int(10) primary key,
customerId int(10) not null,
balance DECIMAL(10,2),
foreign key(customerId) references customer(id) )ENGINE=InnoDB DEFAULT CHARSET=utf8;

向客户表和余额表中各插入3条数据。

insert into customer values(0001,"xiaoming",'vip1','12566666','male','江宁区888号');
insert into customer values(0002,"xiaohong",'vip10','15209336760','male','建邺区888号');
insert into customer values(0003,"xiaocui",'vip11','15309336760','female','新街口888号'); insert into balance values(1,0001,900.55);
insert into balance values(2,0002,900.55);
insert into balance values(3,0003,10000);

2、视图简介

视图可以简单理解成虚拟表,它和数据库中真实存在数据表不同,视图中的数据是基于真实表查询得到的。视图和真实表一样具备相似的结构。真实表的更新,查询,删除等操作,视图也支持。那么为什么需要视图呢?

a、提升真实表的安全性:视图是虚拟的,可以只授予用户视图的权限而不授予真实表的权限,起到保护真实表的作用。

b、定制化展示数据:基于同样的实际表,可以通过不同的视图来向不同需求的用户定制化展示数据。

c、简化数据操作:适用于查询语句比较复杂使用频率较高的场景,可以通过视图来实现。

......

需要说明一点的是:视图相关的操作需要用户具备相应的权限。以下操作使用root用户,默认用户具备操作权限。

创建视图语法

create view <视图名称>  as <select语句>;

修改视图语法

修改视图名称可以先删除,再用相同的语句创建。

#更新视图结构
alter view <视图名称> as <select语句>;
#更新视图数据相当于更新实际表,不适用基于多表创建的视图
update ....

注意:部分视图的数据是无法更新,也就是无法使用update,insert等语句更新,比如:

a、select语句包含多个表

b、视图中包含having子句

c、试图中包含distinct关键字

......

删除视图语法

drop view <视图名称>

3、视图的操作

基于单表创建视图

mysql> create view  bal_view
-> as
-> select * from balance;
Query OK, 0 rows affected (0.22 sec)

创建完成后,查看bal_view的结构和记录。可以发现通过视图查询到数据和通过真实表查询得到的结果完全一样。

#查询bal_view的结构
mysql> desc bal_view;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| id | int(10) | NO | | NULL | |
| customerId | int(10) | NO | | NULL | |
| balance | decimal(10,2) | YES | | NULL | |
+------------+---------------+------+-----+---------+-------+
3 rows in set (0.07 sec)
#查询bal_view中的记录
mysql> select * from bal_view;
+----+------------+----------+
| id | customerId | balance |
+----+------------+----------+
| 1 | 1 | 900.55 |
| 2 | 2 | 900.55 |
| 3 | 3 | 10000.00 |
+----+------------+----------+
3 rows in set (0.01 sec)

通过创建视图的语句不难得出结论:当真实表中的数据发生改变时,视图中的数据也会随之改变。那么当视图中的数据发生改变时,真实表中的数据会变化吗?来实验一下,修改id=1的客户balance为2000。

mysql> update bal_view set balance=2000 where id=1;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0

来看一下真实表balance中的数据。

mysql> select  * from bal_view where id=1;
+----+------------+---------+
| id | customerId | balance |
+----+------------+---------+
| 1 | 1 | 2000.00 |
+----+------------+---------+
1 row in set (0.03 sec)

结论:视图表中的数据发生变化时,真实表中的数据也会随之改变。

基于多表创建视图

创建视图cus_bal,共两个字段客户名称和余额。

mysql> create view cus_bal
-> (cname,bal)
-> as
-> select customer.name,balance.balance from customer ,balance
-> where customer.id=balance.customerId;
Query OK, 0 rows affected (0.05 sec)
#查看cus_bal中的数据
mysql> select * from cus_bal;
+----------+----------+
| cname | bal |
+----------+----------+
| xiaoming | 2000.00 |
| xiaohong | 900.55 |
| xiaocui | 10000.00 |
+----------+----------+
3 rows in set (0.28 sec)

修改视图

将cus_bal视图中的cname改成cusname。

mysql> alter view  cus_bal
-> (cusname,bal)
-> as
-> select customer.name,balance.balance from customer ,balance
-> where customer.id=balance.customerId;
Query OK, 0 rows affected (0.06 sec)
#查看修改后视图结构。
mysql> desc cus_bal;
+---------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| cusname | char(20) | NO | | NULL | |
| bal | decimal(10,2) | YES | | NULL | |
+---------+---------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

修改基于多表创建的视图

mysql> insert into cus_bal(cusname,bal) values ("ee",11);
ERROR 1393 (HY000): Can not modify more than one base table through a join view 'rms.cus_bal'

删除视图

删除视图cus_bal

drop view cus_bal;
mysql> drop view cus_bal;
Query OK, 0 rows affected (0.00 sec)

MySQL视图简介与操作的更多相关文章

  1. MySQL 视图的基础操作(五)

    1.为什么使用视图:     为了提高复杂SQL语句的复用性和表操作的安全性(例如:工资字段不想展示给所有能查看该查询结果的人),MySQL提供了视图特性.所谓视图,本质上是一种虚拟表,其内容与真实的 ...

  2. MySQL 视图简介

    概述 数据库中关于数据的查询有时非常复杂,例如表连接.子查询等,这种查询编写难度大,很容易出错.另外,在具体操作表时,有时候要求只能操作部分字段. 为了提高复杂 SQL 语句的复用性和表的操作的安全性 ...

  3. MySQL视图view/存储过程和函数的使用

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...

  4. MySQL视图更新

    昨天在写美团2019秋招笔试题的时候遇到了关于视图是否能更新的问题,突然感觉这个问题之前复习的时候重点关注过,但是却又想不全.今天特地搜了一些资料总结一下.本文主要说明视图的更新限制,如需关于视图的更 ...

  5. 数据库----ORACLE和MYSQL数据库简介

    一.什么是数据库? 数据库(Database---DB)按照组织.储存和管理数据的仓库.(理解以下三个概念)   数据(Data)用来描述事物的记录都可称数据,如文字音乐图像.   数据库系统(Dat ...

  6. mysql 视图 事务 索引

    为什么需要有视图 * 对于复杂的查询,往往是有多个数据表进行关联查询而得到,而这种语句往往比较复杂,也可能非常频繁的使用. 比如这样的SQL语句 select goods.name,goods_cat ...

  7. Mysql 视图 游标 触发器 存储过程 事务

    Mysql 视图 触发器 存储过程 游标 游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中 ...

  8. MySQL数据库定义与操作语言

    文章为作者原创,未经许可,禁止转载.    -Sun Yat-sen University 冯兴伟 实验1.1 数据库定义 (1)实验目的 理解和掌握数据库DDL语言,能够熟练地使用SQL DDL语句 ...

  9. Mysql视图的作用及其性能分析

    定义:视图是从一个或几个基本表导出的表,它与基本表不同,是一个虚表. 作用: 1.简化操作,不用进行多表查询. 2.当不同种类的用用户共享同一个数据库时,非常灵活,(用户以不同的 方式看待同一数据. ...

随机推荐

  1. MySQL中的replace语句

    一.背景 当使用replace语句更新access_apps表时,原有的mark列.remark列的信息丢失. CREATE TABLE `access_apps` (   `base` varcha ...

  2. java的Junit的用法(转发)

    初级https://blog.csdn.net/andycpp/article/details/1327147/ 中级https://blog.csdn.net/andycpp/article/det ...

  3. forwardPort.go

    packagemain import(     "encoding/json"     "flag"     "fmt"     " ...

  4. BZOJ_1408_[Noi2002]Robot_数学

    Description Input Output Sample Input 3 2 1 3 2 5 1 Sample Output 8 6 75 HINT 90号机器人有10个老师,加上它自己共11个 ...

  5. Linux文件系统选择

    通过综合使用多种标准文件系统Benchmarks对Ext3, Ext4, Reiserfs, XFS, JFS, Reiser4的性能测试对比,对不同应用选择合适的文件系统给出以下方案,供大家参考.文 ...

  6. ToB蓝海的台阶-PaaS,SaaS技术详解

    前言 随着大量SaaS公司进入市场,我们看到颠覆性的软件服务以各种方式进入企业流程-从营销工具到支付系统.随着SaaS帮助优化业务流程,实现更流畅和自动化的运营,风险投资公司首先潜入池中寻找最优秀和最 ...

  7. python --- 快速排序算法

    在快速排序中引入递归和分治的概念(关于递归和分治的概念会单独写一篇来进行介绍) 问的解决思路: 快速排序的基本思想本身就是分治法,通过分割,将无序序列分成两部分,其中前一部分的元素值都要小于后一部分的 ...

  8. Asp.NetCore轻松学-部署到 IIS 进行托管

    前言 经过一段时间的学习,终于来到了部署服务这个环节,.NetCore 的部署方式非常的灵活多样,但是其万变不离其宗,所有的 Asp.NetCore 程序都基于端口的侦听,在部署的时候仅需要配置侦听地 ...

  9. 《k8s-1.13版本源码分析》-源码调试

    源码分析系列文章已经开源到github,地址如下: github:https://github.com/farmer-hutao/k8s-source-code-analysis gitbook:ht ...

  10. 最快1天搭建短视频APP!阿里云短视频解决方案上线

    短视频行业的发展前景乐观是毋庸置疑的,整个短视频的市场规模一直在增长,网络数据显示2018年已经突破100亿大关,在2019年预测将超过200亿.那么,对于短视频从业者来讲,要持续推动业务的发展,必须 ...