MySQL的视图

为什么要用视图

  • 运营部需要经常关注最新的报价:不能给一大堆的id 和SQL
  • 查看全公司的职员资料,但是不能暴露敏感数据,比如工资情况
  • 经常查询的一部分数据,抽象了有时非常复杂的查询细节

数据表设计

SELECT trp.prodtypeid,tap.prodname,tab.`brdname`,tam.`mdlname`,taft.`typename`,taf.`faultsubject`,tar.`repair`,trp.`costlabour`,trp.`costmaterial` FROM `tbl_repair_prices` trp 
LEFT JOIN `tbl_attr_product` tap ON tap.prodtypeid=trp.prodtypeid 
LEFT JOIN `tbl_attr_brand` tab ON tab.brdid=trp.brdid 
LEFT JOIN `tbl_attr_model` tam ON tam.mdlid=trp.mdlid
LEFT JOIN `tbl_attr_faults_type` taft ON taft.`typeid`=trp.`faulttypeid`
LEFT JOIN `tbl_attr_faults` taf ON taf.`faultid`=trp.`faultid`
LEFT JOIN `tbl_attr_repair` tar ON tar.`rid`=trp.`rid`

职工信息表

CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
age TINYINT,
sex TINYINT,
salary DECIMAL(7,2),
department VARCHAR(50)
)

视图

视图(view) 其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在 通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上

  • 简单性:某些数据项需要经常获取
  • 安全性:不希望遍历工资字段
  • 可维护性:抽象了有时非常复杂的查询细节

创建和执行视图

CREATE VIEW test.v AS SELECT * FROM t;

报价表视图

CREATE VIEW tbl_repair_prices_view AS SELECT trp.prodtypeid,tap.prodname,tab.`brdname`,tam.`mdlname`,taft.`typename`,taf.`faultsubject`,tar.`repair`,trp.`costlabour`,trp.`costmaterial` FROM `tbl_repair_prices` trp 
LEFT JOIN `tbl_attr_product` tap ON tap.prodtypeid=trp.prodtypeid 
LEFT JOIN `tbl_attr_brand` tab ON tab.brdid=trp.brdid 
LEFT JOIN `tbl_attr_model` tam ON tam.mdlid=trp.mdlid
LEFT JOIN `tbl_attr_faults_type` taft ON taft.`typeid`=trp.`faulttypeid`
LEFT JOIN `tbl_attr_faults` taf ON taf.`faultid`=trp.`faultid`
LEFT JOIN `tbl_attr_repair` tar ON tar.`rid`=trp.`rid`

DESC `tbl_repair_prices_view`

定制视图结果

  • 查询字段
  • 覆盖默认排序
  • 各种函数

查询条件

使用可选参数 column_list传入列名

CREATE VIEW tbl_repair_prices_view (`产品名`,`品牌名`,`机型名`,`故障类别`,`故障信息`,`维修方案`,`a`,`b`) AS SELECT tap.prodname,tab.`brdname`,tam.`mdlname`,taft.`typename`,taf.`faultsubject`,tar.`repair`,trp.`costlabour`,trp.`costmaterial` FROM `tbl_repair_prices` trp 
LEFT JOIN `tbl_attr_product` tap ON tap.prodtypeid=trp.prodtypeid 
LEFT JOIN `tbl_attr_brand` tab ON tab.brdid=trp.brdid 
LEFT JOIN `tbl_attr_model` tam ON tam.mdlid=trp.mdlid
LEFT JOIN `tbl_attr_faults_type` taft ON taft.`typeid`=trp.`faulttypeid`
LEFT JOIN `tbl_attr_faults` taf ON taf.`faultid`=trp.`faultid`
LEFT JOIN `tbl_attr_repair` tar ON tar.`rid`=trp.`rid`

修改视图

ALTER VIEW tbl_repair_prices_view (`产品名`,`品牌名`,`机型名`,`故障类别`,`故障信息`,`repair`,`a`,`b`) AS SELECT tap.prodname,tab.`brdname`,tam.`mdlname`,taft.`typename`,taf.`faultsubject`,tar.`repair`,trp.`costlabour`,trp.`costmaterial` FROM `tbl_repair_prices` trp 
LEFT JOIN `tbl_attr_product` tap ON tap.prodtypeid=trp.prodtypeid 
LEFT JOIN `tbl_attr_brand` tab ON tab.brdid=trp.brdid 
LEFT JOIN `tbl_attr_model` tam ON tam.mdlid=trp.mdlid
LEFT JOIN `tbl_attr_faults_type` taft ON taft.`typeid`=trp.`faulttypeid`
LEFT JOIN `tbl_attr_faults` taf ON taf.`faultid`=trp.`faultid`
LEFT JOIN `tbl_attr_repair` tar ON tar.`rid`=trp.`rid`

删除视图

drop view `tbl_repair_prices_view`