一 视图
视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用。
使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用
#两张有关系的表 mysql> select * from course; +-----+--------+------------+ | cid | cname | teacher_id | +-----+--------+------------+ | 1 | 生物 | 1 | | 2 | 体育 | 1 | | 3 | 物理 | 2 | | 4 | 语文 | 3 | | 5 | 数学 | 4 | | 6 | 英语 | 5 | | 7 | 地理 | 2 | +-----+--------+------------+ 7 rows in set (0.00 sec) mysql> select * from teacher; +-----+-----------+ | tid | tname | +-----+-----------+ | 1 | 张三 | | 2 | 李四 | | 3 | 王五 | | 4 | egon | | 5 | 张无忌 | +-----+-----------+ 5 rows in set (0.07 sec) # 查询张三教授的课程名 mysql> select cname from course where teacher_id =(select tid from teacher where tname='张三'); +--------+ | cname | +--------+ | 生物 | | 体育 | +--------+ 2 rows in set (0.00 sec) # 子查询出临时表,作为teacher_id等判断依据 select tid from teacher where tname='张三'
一 创建视图
# 语法:create view 视图名称 AS sql语句 mysql> create view teacher_view as select tid from teacher where tname = '张三'; Query OK, 0 rows affected (0.15 sec) # 于是查询张三教授的课程名的sql可以改写为 mysql> select cname from course where teacher_id = (select tid from teacher_view); +--------+ | cname | +--------+ | 生物 | | 体育 | +--------+ 注意注意注意: #1. 使用视图以后就无需每次都重写子查询的sql,但是这么效率并不高,还不如我们写子查询的效率高 #2. 而且有一个致命的问题:视图是存放到数据库里的,如果我们程序中的sql过分依赖于数据库中存放的视图, 那么意味着,一旦sql需要修改且涉及到视图的部分,则必须去数据库中进行修改,而通常在公司中数据库有专门的DBA负责, 你要想完成修改,必须付出大量的沟通成本DBA可能才会帮你完成修改,极其地不方便
二 使用视图
mysql> select * from course;
+-----+--------+------------+
| cid | cname | teacher_id |
+-----+--------+------------+
| 1 | 生物 | 1 |
| 2 | 体育 | 1 |
| 3 | 物理 | 2 |
| 4 | 语文 | 3 |
| 5 | 数学 | 4 |
| 6 | 英语 | 5 |
| 7 | 地理 | 2 |
+-----+--------+------------+
mysql> create view course_view as select * from course; Query OK, 0 rows affected (0.05 sec) mysql> select * from course_view; +-----+--------+------------+ | cid | cname | teacher_id | +-----+--------+------------+ | 1 | 生物 | 1 | | 2 | 体育 | 1 | | 3 | 物理 | 2 | | 4 | 语文 | 3 | | 5 | 数学 | 4 | | 6 | 英语 | 5 | | 7 | 地理 | 2 | +-----+--------+------------+ 7 rows in set (0.00 sec) mysql> update course_view set cname = '化学' where cname = '生物'; Query OK, 1 row affected (0.08 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> insert into course_view values(8,'历史',3); # 往视图里面插入数据 Query OK, 1 row affected (0.02 sec) mysql> select * from course; # 发现原始表的记录也跟着修改了 +-----+--------+------------+ | cid | cname | teacher_id | +-----+--------+------------+ | 1 | 化学 | 1 | | 2 | 体育 | 1 | | 3 | 物理 | 2 | | 4 | 语文 | 3 | | 5 | 数学 | 4 | | 6 | 英语 | 5 | | 7 | 地理 | 2 | | 8 | 历史 | 3 | +-----+--------+------------+ 8 rows in set (0.00 sec)
三 修改视图
语法: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 视图名称 DROP VIEW teacher_view