视图
视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用。
使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可
但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便
不推荐使用
#两张有关系的表
mysql> select * from course;
+-----+--------+------------+
| cid | cname | teacher_id |
+-----+--------+------------+
| | 生物 | |
| | 物理 | |
| | 体育 | |
| | 美术 | |
+-----+--------+------------+
rows in set (0.00 sec) mysql> select * from teacher;
+-----+-----------------+
| tid | tname |
+-----+-----------------+
| | 大木木老师 |
| | 二木木老师 |
| | 三木木老师 |
| | 四木木木木老师 |
| | 五木木老师 |
+-----+-----------------+
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 视图名称 AS SQL语句
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) #!!!注意注意注意:
#. 使用视图以后就无需每次都重写子查询的sql,但是这么效率并不高,还不如我们写子查询的效率高 #. 而且有一个致命的问题:视图是存放到数据库里的,如果我们程序中的sql过分依赖于数据库中存放的视图,那么意味着,一旦sql需要修改且涉及到视图的部分,则必须去数据库中进行修改,而通常在公司中数据库有专门的DBA负责,你要想完成修改,必须付出大量的沟通成本DBA可能才会帮你完成修改,极其地不方便
二 、使用视图
强调:我们不应该修改视图中的记录,而且在涉及多个表的情况下是根本无法修改视图中的记录的
#修改视图,原始表也跟着改
mysql> select * from course;
+-----+--------+------------+
| cid | cname | teacher_id |
+-----+--------+------------+
| | 生物 | |
| | 物理 | |
| | 体育 | |
| | 美术 | |
+-----+--------+------------+
rows in set (0.00 sec) mysql> create view course_view as select * from course; #创建表course的视图
Query OK, rows affected (0.52 sec) mysql> select * from course_view;
+-----+--------+------------+
| cid | cname | teacher_id |
+-----+--------+------------+
| | 生物 | |
| | 物理 | |
| | 体育 | |
| | 美术 | |
+-----+--------+------------+
rows in set (0.00 sec) mysql> update course_view set cname='xxx'; #更新视图中的数据
Query OK, rows affected (0.04 sec)
Rows matched: Changed: Warnings: mysql> insert into course_view values(,'yyy',); #往视图中插入数据
Query OK, row affected (0.03 sec) mysql> select * from course; #发现原始表的记录也跟着修改了
+-----+-------+------------+
| cid | cname | teacher_id |
+-----+-------+------------+
| | xxx | |
| | xxx | |
| | xxx | |
| | xxx | |
| | yyy | |
+-----+-------+------------+
rows in set (0.00 sec)
三、修改视图
语法:ALTER VIEW 视图名称 AS SQL语句
mysql> alter view teacher_view as select * from course where cid>;
Query OK, rows affected (0.04 sec) mysql> select * from teacher_view;
+-----+-------+------------+
| cid | cname | teacher_id |
+-----+-------+------------+
| | xxx | |
| | yyy | |
+-----+-------+------------+
rows in set (0.00 sec)
四、 删除视图
语法:DROP VIEW 视图名称 DROP VIEW teacher_view
附:Mysql 基本用法
一、【Mysql 基本用法之视图】
二、【Mysql 基本用法之触发器】
三、【Mysql 基本用法之事务】
四、【Mysql 基本用法之存储过程】
五、【Mysql 基本用法之函数】
六、【Mysql 基本用法之流程控制】