mysql 高级之视图

试图  是一个虚拟的表  是由查询结果组成的表

作用一:
     提高了重用性,就像一个函数。如果要 频繁获取user的name和goods的name。就应该使用以下sql语言。示例:
         select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id;
    但有了视图就不一样了,创建视图other。示例
         create view other as select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id;
    创建好视图后,就可以这样获取user的name和goods的name。示例:
         select * from other;
    以上sql语句,就能获取user的name和goods的name了。
作用二:
     对数据库重构,却不影响程序的运行。假如因为某种需求,需要将user拆房表usera和表userb,该两张表的结构如下:
        测试表:usera有id,name,age字段
        测试表:userb有id,name,sex字段
    这时如果php端使用sql语句:select * from user;那就会提示该表不存在,这时该如何解决呢。解决方案:创建视图。以下sql语句创建视图:
         create view user as select a.name,a.age,b.sex from usera as a, userb as b where a.name=b.name;
        以上假设name都是唯一的。此时php端使用sql语句:select * from user;就不会报错什么的。这就实现了更改数据库结构,不更改脚本程序的功能了。
作用三:
     提高了安全性能。可以对不同的用户,设定不同的视图。例如:某用户只能获取user表的name和age数据,不能获取sex数据。则可以这样创建视图。示例如下:
         create view other as select a.name, a.age from user as a;
    这样的话,使用sql语句:select * from other; 最多就只能获取name和age的数据,其他的数据就获取不了了。
作用四:
     让数据更加清晰。想要什么样的数据,就创建什么样的视图。经过以上三条作用的解析,这条作用应该很容易理解了吧


CREATE VIEW v1 AS SELECT * FROM tb_item;  将一个表的全部 创建为试图


CREATE VIEW v2 (name,age) AS SELECT t.sell_point,t.title FROM tb_item t; 将一个表的 两个字段 创建对应的不同字段名称的试图


CREATE VIEW v4 AS SELECT
TI.sell_point,
TI.title,
TI.image,
TC.`name`,
TC.id
FROM
tb_item TI
LEFT JOIN tb_item_cat TC ON TI.cid = TC.id
WHERE
TC.id < 10;

 将两张表的内容设置为试图


CREATE OR REPLACE VIEW v1 AS SELECT * FROM tb_item;  将一个表的全部 创建为试图 如果存在该试图 则替换该试图



试图的机制

替换式    实际还是用sql再次查询表格    (默认)试图的内容 跟表中的内容是一致的 修改试图后  真实表也会修改

具化式   将试图查询结果  转化成一个临时的表 无法执行更新操作

MySQL 更倾向于 替换式

with check option  更新 试图不能插入或更新与试图限制条件不符合的记录

试图不可更新部分

    只要数据不是直接来源于基表 就不能修改

HIBERNATE 使用  视图   修改逆向生成的hbm.XML文件 修改成(把复合主键改成主键,把key-property属性改成property属性):

你可能感兴趣的:(mysql 高级之视图)