#语法:CREATE VIEW 视图名称 AS SQL语句
增加了一张表
mysql> create view course2teacher as select * from course inner join teacher on course.teacher_id=teacher.tid; Query OK, 0 rows affected (0.28 sec) mysql> show tables; +----------------+ | Tables_in_db2 | +----------------+ | class | | course | | course2teacher | | score | | student | | teacher | +----------------+ 6 rows in set (0.00 sec)
创建一张表 都会在mysql 指定数据库目录里面添加 表结构文件,表数据文件
而刚才用视图创建的course2teacher表只有表结构,没有表数据
因为他的数据来自于其他表,查询出来的
[root@mysql db2]# pwd /data/mysql/db2 [root@mysql db2]# ll 总用量 612 -rw-rw----. 1 mysql mysql 8594 11月 3 23:33 class.frm -rw-rw----. 1 mysql mysql 98304 11月 3 23:33 class.ibd -rw-rw----. 1 mysql mysql 906 11月 11 02:49 course2teacher.frm -rw-rw----. 1 mysql mysql 8632 11月 3 23:33 course.frm -rw-rw----. 1 mysql mysql 114688 11月 3 23:33 course.ibd -rw-rw----. 1 mysql mysql 61 11月 3 23:33 db.opt -rw-rw----. 1 mysql mysql 8668 11月 3 23:33 score.frm -rw-rw----. 1 mysql mysql 131072 11月 3 23:33 score.ibd -rw-rw----. 1 mysql mysql 8662 11月 3 23:33 student.frm -rw-rw----. 1 mysql mysql 114688 11月 3 23:33 student.ibd -rw-rw----. 1 mysql mysql 8590 11月 3 23:33 teacher.frm -rw-rw----. 1 mysql mysql 98304 11月 3 23:33 teacher.ibd
视图创建的虚拟表可以当做真正的表来用
mysql> select * from course2teacher; +-----+--------+------------+-----+-----------------+ | cid | cname | teacher_id | tid | tname | +-----+--------+------------+-----+-----------------+ | 1 | 生物 | 1 | 1 | 张磊老师 | | 2 | 物理 | 2 | 2 | 李平老师 | | 4 | 美术 | 2 | 2 | 李平老师 | | 3 | 体育 | 3 | 3 | 刘海燕老师 | +-----+--------+------------+-----+-----------------+ 4 rows in set (0.37 sec)
每次执行select * from course2teacher;语句 都会触发 select * from course inner join teacher on course.teacher_id=teacher.tid; 运行
把结果当做course2teacher这种虚拟表
不用重复写表
#!!!注意注意注意:
#1. 使用视图以后就无需每次都重写子查询的sql,但是这么效率并不高,还不如我们写子查询的效率高
#2. 而且有一个致命的问题:视图是存放到数据库里的,如果我们程序中的sql过分依赖于数据库中存放的视图,
那么意味着,一旦sql需要修改且涉及到视图的部分,则必须去数据库中进行修改。
视图是用来方便查的 ,视图不应该改
单表不用视图,
多表连接表查询时候才用到视图
我们不应该修改视图中的记录,而且在涉及多个表的情况下是根本无法修改视图中的记录的
删除视图
语法:DROP VIEW 视图名称 DROP VIEW course2teacher