一、视图的定义
视图是虚拟表或逻辑表,它被定义为具有连接的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 |
+-----+--------+------------+
4 rows in set (0.00 sec)
mysql> select * from teacher;
+-----+-----------------+
| tid | tname |
+-----+-----------------+
| 1 | 张磊老师 |
| 2 | 李平老师 |
| 3 | 刘海燕老师 |
| 4 | 朱云海老师 |
| 5 | 李杰老师 |
+-----+-----------------+
5 rows in set (0.00 sec)
#查询李平老师教授的课程名
mysql> select cname from course where teacher_id = (select tid from teacher where tname='李平老师');
+--------+
| cname |
+--------+
| 物理 |
| 美术 |
+--------+
2 rows in set (0.39 sec)
#子查询出临时表,作为teacher_id等判断依据
mysql> 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 |
+--------+
| 物理 |
| 美术 |
+--------+
2 rows in set (0.00 sec)
五、使用视图
# 往真实表中插入一条数据,查看一下视图,发现视图表也会跟着更新 insert into course(cname,teacher_id) values('张三丰',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.13 sec)
mysql> select * from tt;
+-----+--------+------------+------+-----------------+
| cid | cname | teacher_id | tid | tname |
+-----+--------+------------+------+-----------------+
| 1 | 王五 | 1 | 1 | 张磊老师 |
| 2 | 王五 | 2 | 2 | 李平老师 |
| 3 | 王五 | 3 | 3 | 刘海燕老师 |
| 4 | 王五 | 2 | 2 | 李平老师 |
| 5 | 王五 | 2 | 2 | 李平老师 |
+-----+--------+------------+------+-----------------+
5 rows in set (0.00 sec)
mysql> insert into tt values(6,'老王',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.43 sec) mysql> select * from teacher_view; +-----+--------+------------+ | cid | cname | teacher_id | +-----+--------+------------+ | 4 | 王五 | 2 | | 5 | 王五 | 2 | +-----+--------+------------+ 2 rows in set (0.07 sec)
七、删除视图
# 语法:DROP VIEW 视图名称 drop view teacher_view;