MYSQL 视图(增删查改&6种不可更新的视图类型)

视图

视图是一种虚拟存在的表,并且是动态生成的,只保存了SQL逻辑,不保存查询结果

  • 虚拟表、和普通表一样使用
  • 临时性:临时组建的表格,
  • 可以重复利用

应用场景: 1)多个地方用到同样的查询结果;2)该查询结果使用的SQL语句较复杂。

视图和表的区别

语法是否实际占用物理空间使用
视图create view基本没有,(只保存SQL逻辑,没有保留数据)增删改查,一般不能增删改
create table占用,保存了实际的数据增删改查

视图创建和使用

#创建视图
create view 视图名
As 
<查询语句>#使用视图
select * from  视图名

#例子:查询姓张的老师名和课程
create view V1 
AS
Select t_name, c_name
from teacher t
inner join course c on t.t_id=c.t_id

select * from V1 Where t_name like '张%';;

在‘rsViews’标签下,生成了V1的视图。
在这里插入图片描述

视图修改

#视图的修改
#方式一: 
create or repace view 视图名
as 
<查询语句>;

#方式二
alter view 视图名
as 
<查询语句>;

删除视图

#删除视图
drop view 视图名1,视图名2……;

查看视图

  • 方法一:
#方法一
DESC 视图名;

在这里插入图片描述

  • 方法二:
#方法二
show create view 视图名;

在这里插入图片描述

更新视图

更新视图里面的数据,视图的更新实际上是对基本表增加或者删除记录,一般情况下都不建议对视图进行操作

#插入
insert into 视图名 values(...);

#修改:将名字BBB改成AAA
update 视图名 set last_name='AAA' where last_name='BBB';

#删除
delete from 视图名 where last_name='BBB';

下面通过实例过程说明:

1. 查看基本表格&创建视图

  • 原表格test包含order_id,customer_id 和product_id三列
  • 创建视图V1,视图重复引用了order_id,并命名为c1,c2
  • 创建视图V2,只包含一列order_id, 命名c1
#创建视图
create view v1 as 
select order_id as c1, order_id as c2 from test 
create view v2 as 
select order_id as c1 from test  
#查看视图
select * from v1
select * from v2
testv1v2
在这里插入图片描述在这里插入图片描述在这里插入图片描述

2. Insert插入语句

#向视图V1插入新数据:报错
insert into v1 values(100,200)
#向视图v2插入新数据:成功
insert into v2 values(100);

#重新查看原表格:增加新的数据行order_id=100,其他列NULL 
select * from test
#视图V1、V2也同时更新。

结果展示:
- V1报错,不可以插入数据
- V2数据插入成功
- 同时,原来的表格test也被修改插入新数据。增加了最后一行order_id=100的新数据行。这时返回去看两个视图内容,也是同步增加了100的数据行。

test视图V1 (引用重复列)报错,表示表格不可以被插入视图V2插入成功
在这里插入图片描述在这里插入图片描述在这里插入图片描述

3. Update更新语句

在视图V1中,将c1=1更新为999, 结果原表格以及两个视图都是修改为999

#数据更新
update v1 set c1=999 where c1=1;

#结果查看
select * from test
select * from v1
select * from v2

结果展示:

  • 虽然修改的是视图V1中的c1, 但是c1和c2都是引用同一列order_id。
  • 使用Update更新时,实际上是对原本表格test的order_id列进行更新,因此最后V1的c1、c2列都同步更新为999
testv1v2
在这里插入图片描述在这里插入图片描述在这里插入图片描述

4. Delete删除语句

同上,delete也试着删除一行,看看对三个视图表格的影响。

#删除视图中c1=10的数据
delete from v1 where c1=10;

#结果查看
select * from test
select * from v1
select * from v2

结果展示:

  • 三个表格test、v1、v2中10 已被删除
  • 可见 delete和insert的效果类似,无论是更新还是删除都是作用在原本的基础表格上,再最后改变视图的数据内容。

在这里插入图片描述

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

不可更新的视图类型

视图的可更新性和视图中查询的定义有关系,以下6种类型的视图不可更新:

  1. 包含:分组函数,distinct,group by, having, union, union all
  2. 常量视图:看下面例子, myv2 不能更新
#常量视图
create or replace view myv2
as 
select 'john' name;

select * from  myv2;

在这里插入图片描述

  1. select 中包含子查询
create or replace view myv3
as 
select (select MAX(salary) from employees) 最高工资;
select * from  myv3;
  1. join
  2. from一个不能更新的视图
  3. where子句的子查询引用了from子句中的表
  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 这个错误的原因可能是因为你的 MySQL 安装在 Docker 容器内,而 MHA 试图在宿主机上执行 MySQL 命令,导致找不到 mysqlbinlog 命令。 解决方法是在 MHA 配置文件中指定 MySQL 的执行路径,将其指向 Docker 容器内的 MySQL 安装目录。具体来说,你需要在 MHA 配置文件中的 [mysql_variables] 部分加入如下内容: ``` mysql_basedir=&quot;/path/to/mysql/install/directory&quot; mysql_bindir=&quot;/path/to/mysql/install/directory/bin&quot; ``` 替换 &quot;/path/to/mysql/install/directory&quot; 为 Docker 容器内 MySQL 安装目录的路径即可。 希望这些信息对你有帮助! ### 回答2: 在使用MySQL MHA搭建时遇到mysqlbinlog命令找不到的问题,可能是因为MySQL未安装或者环境变量配置不正确。 首先,你需要确认MySQL是否在Docker容器内正确安装。可以通过以下命令查看容器内是否已经安装了MySQL: docker exec -it [容器名] bash mysql -V 如果没有安装,你需要在Docker容器内安装MySQL。可以使用以下命令安装MySQL: apt-get update apt-get install mysql-server 如果MySQL已正确安装,但仍然提示mysqlbinlog命令找不到,那可能是因为环境变量配置不正确。我们可以通过以下步骤来解决这个问题: 1.首先,使用docker exec命令进入到正在运行的MySQL容器内: docker exec -it [容器名] bash 2.然后,查找mysqlbinlog的路径: find / -name mysqlbinlog 3.找到mysqlbinlog的路径后,将路径添加到环境变量中: export PATH=$PATH:[mysqlbinlog的路径] 4.保存并退出容器内的bash界面。 5.重新进入MySQL容器,在bash界面中尝试运行mysqlbinlog命令,确保已经可以找到该命令: docker exec -it [容器名] bash mysqlbinlog 通过这些步骤,您应该能够解决mysqlbinlog命令找不到的问题,并正常使用MySQL MHA搭建。如果问题仍然存在,请检查MySQL容器内的环境变量配置是否正确,并确认所使用的MySQL版本是否支持mysqlbinlog命令。 ### 回答3: 在搭建MHA(MySQL高可用性解决方案)时,如果在docker容器内报出mysqlbinlog命令找不到的错误,可能是由于相关的MySQL client程序未正确安装或未正确配置环境变量所致。 首先,我们需要确认是否在docker容器内正确安装了MySQL client程序。可以使用以下命令验证是否已安装: ``` docker exec -it &lt;container_id&gt; mysql --version ``` 如果返回了正确的版本号,则说明MySQL client已正确安装。如果未安装,需要先在docker容器内安装MySQL客户端程序。 另外,当我们在docker容器内执行命令时,需要确认`mysqlbinlog`命令在可执行路径中。可以使用以下命令搜索该命令: ``` docker exec -it &lt;container_id&gt; find / -name mysqlbinlog ``` 找到`mysqlbinlog`的路径后,可以尝试直接运行该命令,验证是否能正常执行。 如果无法找到`mysqlbinlog`命令,可能是由于环境变量配置不正确导致的。可以使用以下命令查看环境变量配置情况: ``` docker exec -it &lt;container_id&gt; env ``` 确保`PATH`环境变量中包含了`mysqlbinlog`命令所在的路径。 如果以上步骤都没有解决问题,还可以尝试重新安装MySQL client程序或在docker容器内重新构建MySQL镜像。 总之,通过正确安装并配置MySQL client程序,以及在环境变量中正确设置`mysqlbinlog`命令所在的路径,应该可以解决mysqlbinlog命令找不到的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值