视图
视图的定义:
视图是虚拟表或逻辑表,它被定义为具有连接的SQL,select查询语句,因为数据库视图与数据库表类似,它由行和列组成,因此可以根据数据库查询数据,其内容由查询定义。但是,视图并不在数据库中以存储数据集形式存在,行和列数据来自由定义视图的查询所用的表,并且在引用视图时动态生成,简单的来说视图是由其定义结果组成的表。
视图的优点:
1,数据库视图允许简化复杂查询,通过数据库视图,您只需使用简单的SQL语句,而不是使用具有多个连接的复杂的SQL语句。
2,安全性,一般时这样做的,创建一个视图,定义好该视图所操作的数据,之后将用户权限与视图绑定,这样的方式是使用到一个特性:grant语句可以针对视图进行授予权限。
视图的缺点:
1,性能:从数据库视图查询数据可能会很慢,特别是如果视图是基于其他视图创建的。
2,表依赖关系:将根据数据库的基础表创建一个视图,每当更改与其相关联的表结构时,都必须更改试图。
创建视图:
create view 视图名称 as SQL语句
#两张有关系的表 mysql> select * from course; +-----+--------+------------+ | cid | cname | teacher_id | +-----+--------+------------+ | 1 | 生物 | 1 | | 2 | 物理 | 2 | | 3 | 体育 | 3 | | 4 | 美术 | 2 | +-----+--------+------------+ rows in set (0.00 sec) mysql> select * from teacher; +-----+-----------------+ | tid | tname | +-----+-----------------+ | 1 | 张磊老师 | | 2 | 李平老师 | | 3 | 刘海燕老师 | | 4 | 朱云海老师 | | 5 | 李杰老师 | +-----+-----------------+ rows in set (0.00 sec) #查询李平老师教授的课程名 mysql> select cname from course where teacher_id = (select tid from teacher where tname='李平老师'); +--------+ | cname | +--------+ | 物理 | | 美术 | +--------+ rows in set (0.00 sec) #子查询出临时表,作为teacher_id等判断依据 select tid from teacher where tname='李平老师'
视图的创建:
create view teacher_view as select tid from teacher where tname='李平老师'; #于是查询李平老师教授的课程名的sql可以改写为 mysql> select cname from course where teacher_id = (select tid from teacher_view); +--------+ | cname | +--------+ | 物理 | | 美术 | +--------+ rows in set (0.00 sec)
使用视图:
往物理表中插入一条数据,查看视图,发现视图表也会跟着更新。
insert into course values(5,'地理',2);
更新一下数据,发现视图的数据也会跟着更新:
update course set cname = '历史';
不能修改视图的数据:
mysql> create view tt as select * from course left join teacher on teacher.tid = course.teacher_id; Query OK, 0 rows affected (0.02 sec) mysql> select * from tt; +-----+--------+------------+------+-----------------+ | cid | cname | teacher_id | tid | tname | +-----+--------+------------+------+-----------------+ | 1 | 王五 | 1 | 1 | 张磊老师 | | 2 | 王五 | 2 | 2 | 丽萍老师 | | 4 | 王五 | 2 | 2 | 丽萍老师 | | 5 | 王五 | 2 | 2 | 丽萍老师 | | 6 | 王五 | 2 | 2 | 丽萍老师 | | 3 | 王五 | 3 | 3 | 王海燕老师 | +-----+--------+------------+------+-----------------+ 6 rows in set (0.01 sec) mysql> insert into tt values(7,'哈哈',2,4,'张三丰老师'); ERROR 1471 (HY000): The target table tt of the INSERT is not insertable-into
修改视图:
alter view 视图名称 as SQL语句
mysql> alter view teacher_view as select * from course where cid>3; Query OK, 0 rows affected (0.04 sec) mysql> select * from teacher_view; +-----+-------+------------+ | cid | cname | teacher_id | +-----+-------+------------+ | 4 | xxx | 2 | | 5 | yyy | 2 | +-----+-------+------------+ rows in set (0.00 sec)
删除视图:
drop view 视图名称