mysql视图案例_MySQL视图(下)

MySQL视图(下)

视图数据操作:虽然我们说视图可以称之为select语句的别名,但实际上,它和别名并不一样,因为视图是可以进行数据写操作的,只不过有很多限制而已。

新增数据

在这里,新增数据就是指通过视图直接对基表进行数据的新增操作。

限制 1:多表视图不能进行新增数据。

执行如下 SQL 语句,进行测试:

-- 查询视图 my_v3 结构

desc my_v3;

-- 多表视图新增数据

insert into my_v3 values(7,'Gates','boy',2,170,'PM3.5','A315');

598339b01d833f4973fd7551c698b7be.png

限制 2:可以向单表视图新增数据,但视图中包含的字段必须有基表中所有不能为空的字段。

执行如下 SQL 语句,进行测试:

-- 查询 student 表结构

desc student;

-- 创建视图 my_v4

create view my_v4 as

select id,name,age,c_id from student;

-- 单表视图新增数据

insert into my_v4 values(7,'Gates',25,2);

8ad8e2f896a858c0f4354ad2b2ba7f77.png

如上图所示,在我们新建的视图my_v4中,没有包含不能为空的字段gender,因此在我们向my_v4中新增数据的时候,报错。其实,这也很好理解,试想,在 MySQL 尝试将视图中新增的数据(一条记录)插入到基表的时候,忽然发现一个本不能为null的字段的值为默认值null,自然就会报错啦!反之,如果单表视图中包含了基表中的全部非空字段,自然可以插入成功。执行如下 SQL 语句,进行测试:

-- 查询 class 表数据

select * from class;

-- 创建视图 my_v5

create view my_v5 as

select * from class;

-- 单表视图新增数据

insert into my_v5 values(2,'PM2016','A315');

-- 查询 class 表数据

select * from class;

8d778681b8127a43f31ece31fe0b78a9.png

如上图所示,显然我们通过单表视图向基表中插入数据成功啦!

删除数据

与新增数据类似,

多表视图不能删除数据;

单表视图可以删除数据。

执行如下 SQL 语句,进行测试:

-- 查询多表视图 my_v3

select * from my_v3;

-- 删除多表视图 my_v3 中记录

delete from my_v3 where id = 2;

-- 查询单表视图 my_v5

select * from my_v5;

-- 删除单表视图 my_v5 中记录

delete from my_v5 where id = 2;

-- 查询单表视图 my_v5

select * from my_v5;

25e7956ce5b5c44523c7aacafe2c45af.png

更新数据

理论上,无论多表视图还是单表视图,都可以进行数据的更新。

执行如下 SQL 语句,进行测试:

-- 查询单表视图 my_v5

select * from my_v5;

-- 更新单表视图 my_v5

update my_v5 set grade = 'PM2014' where id = 5;

-- 查询单表视图 my_v5

select * from my_v5;-- 查询单表视图 my_v5

select * from my_v5;

-- 更新单表视图 my_v5

update my_v5 set grade = 'PM2014' where id = 5;

-- 查询单表视图 my_v5

select * from my_v5;

d62bf75770215f551736f94d189d108e.png

此外,更新视图数据并不总是成功的,这是因为有 更新限制的存在。那么何为更新限制呢?

更新限制:with check option,如果创建视图的时候,设置了某个字段的限制,那么对视图进行更新操作的时候,系统就会进行验证,要保证更新之后,数据依然可以被查出来,否则不让更新。

执行如下 SQL 语句,进行测试:

-- 创建单表视图 my_v6

create view my_v6 as

select * from student where height > 170 with check option;

-- 查询单表视图 my_v6

select * from my_v6;

-- 更新单表视图 my_v6

update my_v6 set height = 165 where id = 6;

bf441d8b5c3f934b1817783271fecc77.png

如上图所示,在更新视图的时候,更新失败,这是因为其违反了我们设置的更新限制。那么,视图之外的数据,我们能不能修改呢?执行如下 SQL 语句,进行测试:

-- 查询单表视图 my_v6

select * from my_v6;

-- 更新单表视图 my_v6

update my_v6 set height = 188 where id = 4;

-- 查询单表视图 my_v6

select * from my_v6;

7dacb6352ca54dfd2218f3694657aecb.png

如上图所示,更新视图my_v6之外数据的时候,显示成功。但是,待我们重新查询视图my_v6数据的时候,发现并没有真正更新成功。这是为什么呢?原因就在于我们不能通过视图去操作视图之外的数据。举一个不太恰当的例子,我们不能用自己手去操作别人兜里的钱啊!

视图算法

视图算法,即系统对视图以及外部查询视图的select语句的一种解析方式。视图算法有三种,分别为:

undefined:未定义(默认的),这不是一种实际使用的算法,而是一个“推卸责任”的算法。在未定义的情况下,告诉系统,视图没有定义算法,请自己选择。

temptable:临时表算法,系统先执行视图的select语句,后执行外部查询语句。

merge:合并算法,系统先将视图对应的select语句与外部查询视图的select语句进行合并,然后再执行。此算法比较高效,且在未定义算法的时候,经常会默认选择此算法。

对于视图的算法,我们需要在创建视图的时候指定,

基本语法:create + [algorithm = temptable/merge/undefined] + view + 视图名 + as + select语句;

执行如下 SQL 语句,进行测试:

-- 查看视图 my_v2 的默认算法

show create view my_v2;

-- 指定视图 my_v7 算法为 temptable

create algorithm = temptable view my_v7 as

select * from student;

-- 查看视图 my_v7 的指定算法

show create view my_v7;

d9061eaa6d13d44bf13468a4e26f67a5.png

如上图所示,我们指定了视图my_v7的算法为temptable,但是对于算法的选择,我们该如何判断呢?答案是:如果视图的select语句中包含一个查询子句(五子句,包括where、group by、order by 、having和limit),而且很有可能查询子句的顺序比外部的查询语句的顺序要靠后(五子句的顺序),那么一定要使用temptable算法,其他情况可以不用指定,默认即可。

至此,我们已经将视图的内容大致讲完了。有一点需要我们特别注意,那就是: 视图最重要的功能就是查询,其他如增、删、改的操作一般不会使用,也不建议通过视图来操作基表的数据。

温馨提示:符号[]括起来的内容,表示可选项;符号+,则表示连接的意思。

### 回答1: MySQL 视图的限制包括: 1. 视图不能使用临时表 2. 视图不能包含 ORDER BY 子句,除非同时使用了 TOP 或 LIMIT 子句 3. 视图不能包含 INTO OUTFILE 或 INTO DUMPFILE 子句 4. 视图不能被索引,也不能被视为基表 5. 视图不能修改基表的数据,除非使用了特定的 WITH CHECK OPTION 子句 下面是一个 MySQL 视图限制的实例: 假设有一个名为 `orders` 的表,包含以下字段:`order_id`、`customer_id`、`order_date` 和 `total_amount`。 我们可以创建一个名为 `orders_view` 的视图,它只包含 `customer_id` 和 `total_amount` 这两个字段,如下所示: ``` CREATE VIEW orders_view AS SELECT customer_id, total_amount FROM orders; ``` 然而,我们不能在这个视图中包含 ORDER BY 子句,否则会收到以下错误消息: ``` ERROR 1351 (HY000): View's SELECT contains a subquery in the FROM clause ``` 因此,我们应该在使用 ORDER BY 子句时,同时使用 TOP 或 LIMIT 子句来限制结果集的大小,如下所示: ``` CREATE VIEW orders_view AS SELECT customer_id, total_amount FROM orders ORDER BY total_amount DESC LIMIT 10; ``` 这样就可以避免上述错误。 ### 回答2: MySQL视图是虚拟的表,它是根据定义视图时指定的查询语句动态生成的,可以简化复杂的查询操作。然而,MySQL视图也有一些限制。 首先,MySQL视图不支持带有全局或本地临时表的查询。这意味着如果查询需要使用临时表,无法将其放在视图中进行处理。 其次,MySQL视图不能索引。因为视图是根据查询结果动态生成的,而不是实际存储数据,所以无法为视图创建索引。这可能会导致在对视图进行复杂查询时性能下降。 此外,MySQL视图还有许多使用限制。例如,视图不能引用临时表、不能使用存储函数、不能使用用户变量,并且定义视图的SELECT语句不能包含DISTINCT关键字。 下面是一个关于MySQL视图限制的示例: 假设有一个名为"employees"的表,包含员工的姓名、年龄和工资信息。我们希望创建一个名为"young_employees"的视图,只包含年龄小于30岁的员工信息。 创建视图的语句可以是: CREATE VIEW young_employees AS SELECT * FROM employees WHERE age < 30; 然而,如果我们尝试在这个视图上使用DISTINCT关键字进行查询,就会遇到限制: SELECT DISTINCT * FROM young_employees; 会报错,因为MySQL不允许在视图的查询中使用DISTINCT关键字。 综上所述,MySQL视图不支持临时表、无法索引、存在许多其他使用限制。在使用MySQL视图时,我们应该遵守这些限制并考虑它们可能带来的性能问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值