视图概述
视图是由数据库中的一个表或多个表导出的虚拟表,是一种虚拟存在的表,方便用户对数据的操作。
视图的概念
视图是一个虚拟表,是从数据库中一个或多个表中导出来的表,其内容由查询定义。同真实表一样,视图包含一系列带有名称的列和行数据。但是,数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。
视图的作用
1.简单。减少数据的操作,例如,有一张用户信息表,可以用视图只显示姓名、年龄、地址,而不显示用户的重要信息。
2.安全。视图的安全性可以防止未经授权用户查看特定的行或列,只能看到视图中的数据。
3.耦合。可以降低耦合,对数据表的重构,也相当于中间件。例如,有一张商品表和一张商品类别表,如果不创建视图,我们就要创建两个模型model;当我们用了视图后只需要创建一个模型model,这一个model就能解决。
创建操作
创建视图
- 语法
create view [视图名称] as [内容];
例如:
一张商品表我们只需要它其中的一部分字段。
原表:
CREATE TABLE `goods` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`displayorder` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
`uniacid` int(11) DEFAULT '0',
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '商品名称',
`category` int(11) DEFAULT NULL COMMENT '分类ID ',
`price` decimal(10,2) DEFAULT '0.00' COMMENT '商品原价',
`auctionprice_max` decimal(10,2) DEFAULT '0.00' COMMENT '最高竞拍价',
`auctionprice_min` decimal(10,2) DEFAULT '0.00' COMMENT '起拍价',
`up_price` decimal(10,2) DEFAULT '0.00' COMMENT '单次加价',
`goodsnum` int(11) NOT NULL DEFAULT '1',
`units` varchar(255) NOT NULL DEFAULT '件' COMMENT '单位',
`starttime` varchar(50) DEFAULT NULL COMMENT '起拍时间',
`endtime` varchar(50) NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '结束时间',
`thumb` varchar(255) DEFAULT '' COMMENT '缩略图',
`description` varchar(1000) DEFAULT NULL COMMENT '描述',
`content` text COMMENT '详情',
`createtime` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间',
`status` tinyint(3) NOT NULL DEFAULT '0' COMMENT '状态',
`deleted` tinyint(3) NOT NULL DEFAULT '0' COMMENT '是否已删除',
`goodsid` int(11) NOT NULL DEFAULT '0' COMMENT '商品ID',
`goodssn` varchar(50) DEFAULT NULL COMMENT '商品条码',
`upnum` int(11) DEFAULT NULL COMMENT '最高加价次数',
`merchid` int(11) DEFAULT '0',
`up_reward` decimal(10,2) DEFAULT '0.30' COMMENT '加价奖励',
`upper_reward` decimal(10,2) DEFAULT NULL COMMENT '成交后直推奖励',
`margin` tinyint(3) unsigned NOT NULL DEFAULT '50' COMMENT '押金比率',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
一般不创建视图的查询如下
select id,title,price from goods;
创建视图
create view view_goods as select id,title,price from goods;
查询视图(结果等同余select id,title,price from goods;的查找)
select * from view_goods;
注意
当我们创建视图的时候,如果select中有查询条件,并且是需要该条件实在视图中起作用,那么就必需加上校验。
例如:
create view view2_goods as select id,title,price from goods where id>10;
当我们向视图view2_goods中插入数据时,id小于等于10仍然会成立。因为我们并没有在创建视图的时候对条件进行校验。
修改后,再插入id小于等于10的数据就不会成功,修改如下
create view view2_goods as select id,title,price from goods where id>10 with check option;
向视图中插入数据和对普通表的插入是一样的。
insert into goods(id,title,price) values(11,'手机壳',12.5);
删除视图
- 语法
drop view [视图名称]
例如:
drop view view_goods;
适合的项目
oa,erp;电商
创建的什么视图不能进行新增或是修改
在创建视图时,包含了以下几条的都不能对创建的视图进行新增或是修改
1.有聚合函数
2.包含子查询
3.有JOIN的