一, 视图的定义
视图是虚拟表或逻辑表, 它被定义为具有连接的 SQL SELECT 查询语句. 因为数据库视图与数据库表类似, 它由行和列组成, 因此可以根据数据库表查询数据. 其内容由查询定义.
但是, 视图并不在数据库中以存储的数据值集形式存在, 行和列数据来自由定义视图的查询所引用的表, 并且在引用视图时动态生成. 简单的来说视图是由其定义结果组成的表;
二, 视图的优缺点
优点:
1, 数据库视图允许简化复杂查询, 通过数据库视图, 您只需使用简单的 SQL 语句, 而不是使用具有多个连接的复杂的 SQL 语句.
2, 安全性. 一般是这样做的: 创建一个视图, 定义好该视图所操作的数据. 之后将用户权限与视图绑定. 这样的方式是使用到了一个特性: grant 语句可以针对视图进行授予权限.
缺点:
1, 性能: 从数据库视图查询数据可能会很慢, 特别是如果视图是基于其他视图创建的.
2, 表依赖关系: 将根据数据库的基础表创建一个视图. 每当更改与其相关联的表的结构时, 都必须更改视图.
三, 创建视图
语法:
CREATE VIEW 视图名称 AS SQL 语句
ex:
- # 两张有关系的表
- 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)
临时表创建为试图
四, 使用视图
- 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 | 王海燕老师 |
- +-----+--------+------------+------+-----------------+
- 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
- View Code
五, 修改视图
- # 语法: 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)
- View Code
七, 删除视图
- # 语法: DROP VIEW 视图名称
- DROP VIEW teacher_view
来源: http://www.bubuko.com/infodetail-2697637.html