这个什么视图的概念,看了半天没看懂干啥的,操作了一番才发现视图的功能强大,什么是视图呢?有一些数据是基于当前数据库的数据产生的,比如通过当前表中的进价和售价数据生成的利润及利润率,我们可以用ALTER ADD和UPDATE将这些处理生成的数据直接写入到表中,当数据量非常巨大的时,会占据磁盘大量的空间,明明可以通过查询获得数据,现在却要占用资源,但是不写入数据库,每次需要数据的时候都要写SELECT语句去查询,如果语句结构复杂,就很容易出错。是这样的,如果需要二次数据,就会出现上面的缺陷,而视图就可以解决上述的问题。
上面说的有点啰嗦哈。。。简单说来就是视图解决了数据存储和重复SELECT查询的问题,因为视图通过存储SELECT语句来达到存储二次数据的目的。
当然我的认识可能不太充分,有疏漏的地方可以评论提醒我哈。
1.视图-VIEW
1.1 视图的优点
上面已经作过介绍了,这里我就不再重复讲解了。一是视图无需保存数据,节省存储设备的容量;二是视图可以保存频繁使用的SELECT语句,提高效率。
1.2 视图的创建和使用
SELECT product_type,count(*) from sale group by product_type; DROP VIEW product_type_count; CREATE VIEW product_type_count (product_type,cnt_product) AS SELECT product_type,count(*) from sale group by product_type; #括号中是视图的列名 select product_type,cnt_product from product_type_count;
这里最后一条SQL语句其实执行了两条的SQL语句,如果有多重视图的情况存在,即有视图是基于视图生成的,这时候以这个视图为表查询的时候,要执行两条以上的SQL语句。但是这种多重视图会降低SQL的性能,尽量使用单一试图。
1.3 视图的限制
第一个限制就是AS后面跟着的SELECT不能用ORDER BY的限制。SELECT查询表的时候,是没有限制的,只要语法正确就可以查询,但是在CREATE VIEW的时候AS后面跟的SELECT语句不能跟着ORDER BY语句,因为视图和表一样,数据行都是没有顺序的,ORDER只是对查询结果排序,所以语法不通,但是这种语句可以在MySQL中执行,因为各类RDBMS并不都是基于标准的SQL,会有特异性。
DROP VIEW product_type_count; CREATE VIEW product_type_count (product_type,cnt_product) AS SELECT product_type,count(*) from sale group by product_type ORDER BY product_type; select product_type,cnt_product from product_type_count;
第二个限制就是表和视图的数据更新上,视图是基于表的SELECT语句,所以表数据进行更新的时候,视图会跟着一起更新,但是反过来呢?这里比较好理解,如果表和视图的列属性或数据性质一致就可以,但是这种情况视图只是记录表的一次数据,不会处理记录二次数据,意义并不大,所以视图最好不要做数据更新,下面的实例是正向更新
insert into sale ( product_name, product_type, sale_price, purchase_price, regist_date) values ( '椰汁', '酒水', '111', '20', '2021-03-01'); select product_type,cnt_product from product_type_count;