MySQL——视图
视图即是虚拟表,也称为派生表,因为它们的内容都派生自其它表的查询结果
特点
优点:
1、简化操作:不用关心视图是怎么处理数据的,我们只需要知道如何使用这个结果集即可,视图相当于一个中间层;
2、安全:比如我们可以让用户有权去访问某个视图,但是不能访问原表,这样就可以起到保护原表中某些数据的作用。另外,权限是无法细致到某一个列的,通过视图,则很容易实现;
3、降低耦合:假如我们以后要修改原表的结构,那么我们可以通过修改视图的定义即可,而不用修改应用程序,对访问者是不会造成影响的,一般来说,这样代价会更小。
缺点:
性能:从数据库视图查询数据可能会很慢,特别是如果视图是基于其他视图创建的;
表依赖关系:将根据数据库的基础表创建一个视图。每当更改与其相关联的表的结构时,都必须更改视图。
算法类型
MERGE算法
将视图的sql语句和引用视图的sql语句合并在一起,最后一起执行。
注:使用如下SQL构造块,merge算法无法使用(聚集函数、DISTINCT、GROUP BY、HAVING、集合操作(在MySQL中只有UNION, UNION ALL,没有EXCEPT和INTERSECT)、子查询)
/** 定义两张表
seller_sku表包括以下字段:id(主键),seller_id(门店ID),sku_id(商品sku的id,对应goods_sku的id),amount(商品的库存)
goods_sku 表包括以下字段:id(主键),goods_name(sku的名称)
**/
#案例1 查询商品库存大于50的门店的商品所对应的成本
CREATE OR REPLACE VIEW amount_50_sku AS
SELECT
seller_id,
price,
sku_id,
amount,
(price*amount) AS sku_values
FROM
sellers_sku WHERE amount > 50
#方法A
SELECT * FROM amount_50_sku
#方法B
SELECT seller_id,price,sku_id,amount,(price*amount) AS sku_values FROM sellers_sku `在这里插入代码片`
TEMPTABLE算法(临时表算法)
将视图的结果集存放在临时表中,每次执行时从临时表中操作。
注:先执行视图的select语句,然后在执行外部查询Select语句。
/**
seller_sku表包括以下字段:id(主键),seller_id(门店ID),sku_id(商品sku的id,对应goods_sku的id),amount(商品的库存)
goods_sku 表包括以下字段:id(主键),goods_name(sku的名称)
**/
#案例2 显示每个商品各个门店库存的总和
#创建视图
CREATE OR REPLACE VIEW seller_sku_amount AS SELECT
sku_id,
SUM(amount) AS amount_total
FROM sellers_sku
GROUP BY sku_id
#使用视图查询
SELECT
seller_sku_amount.sku_id,
seller_sku_amount.amount_total,
goods_sku.*
FROM seller_sku_amount JOIN goods_sku ON goods_sku.`id` = seller_sku_amount.`sku_id`
#原生SQL查询
SELECT
sellers_sku.sku_id,
SUM(sellers_sku.amount) AS amount_total,
goods_sku.*
FROM sellers_sku
JOIN goods_sku ON sellers_sku.`sku_id` = goods_sku.`id`
GROUP BY sku_id
ORDER BY amount_total DESC
UNDEFINED算法
默认的视图类型,DBMS倾向于选择而不是必定选择MERGE,因为MERGE的效率更高,更重要的是临时表视图不能更新