# 转载请联系
假如你在管理着学生系统,有两张这样的表。
mysql> select * from student; +-----+-----------+--------+-------+--------------+--------------------+ | id | name | gender | birth | department | address | +-----+-----------+--------+-------+--------------+--------------------+ | 901 | 张老大 | 男 | 1985 | 计算机系 | 北京市海淀区 | | 902 | 张老二 | 男 | 1986 | 中文系 | 北京市昌平区 | | 903 | 张三 | 女 | 1990 | 中文系 | 湖南省永州市 | | 904 | 李四 | 男 | 1990 | 英语系 | 辽宁省阜新市 | | 905 | 王五 | 女 | 1991 | 英语系 | 福建省厦门市 | | 906 | 王六 | 男 | 1988 | 计算机系 | 湖南省衡阳市 | +-----+-----------+--------+-------+--------------+--------------------+ 6 rows in set (0.00 sec) mysql> select * from score; +----+--------+-----------+-------+ | id | stu_id | c_name | grade | +----+--------+-----------+-------+ | 1 | 901 | 计算机 | 98 | | 2 | 901 | 英语 | 80 | | 3 | 902 | 计算机 | 65 | | 4 | 902 | 中文 | 88 | | 5 | 903 | 中文 | 95 | | 6 | 904 | 计算机 | 70 | | 7 | 904 | 英语 | 92 | | 8 | 905 | 英语 | 94 | | 9 | 906 | 计算机 | 90 | | 10 | 906 | 英语 | 85 | +----+--------+-----------+-------+ 10 rows in set (0.00 sec)
一张是学生信息表,一张是成绩表。由于要经常查看或处理某一个学生的全部信息,必须要把这两张表连接在一起。但是每一次查看或处理都要用SQL语句把两张表连接在一起,SQL语句又这么长,新建一个表包含这两个内容吧,又浪费空间。这时候视图就有用了。
- 视图是什么?
视图就是一个能够把复杂SQL语句的功能封装起来的一个虚表。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。
视图是对若干张基本表的引用,一张虚表,只查询语句执行结果的字段类型和约束,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);
方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性;
- 创建视图
create view 视图名称 as select语句 # 为了方便辨认,视图名称通常用v_开头
示例:
mysql> create view v_studentinfo as select student.*,c_name,grade from student inner join score on student.id=score.stu_id;
- 查看视图
mysql> select * from v_studentinfo; +-----+-----------+--------+-------+--------------+--------------------+-----------+-------+ | id | name | gender | birth | department | address | c_name | grade | +-----+-----------+--------+-------+--------------+--------------------+-----------+-------+ | 901 | 张老大 | 男 | 1985 | 计算机系 | 北京市海淀区 | 计算机 | 98 | | 901 | 张老大 | 男 | 1985 | 计算机系 | 北京市海淀区 | 英语 | 80 | | 902 | 张老二 | 男 | 1986 | 中文系 | 北京市昌平区 | 计算机 | 65 | | 902 | 张老二 | 男 | 1986 | 中文系 | 北京市昌平区 | 中文 | 88 | | 903 | 张三 | 女 | 1990 | 中文系 | 湖南省永州市 | 中文 | 95 | | 904 | 李四 | 男 | 1990 | 英语系 | 辽宁省阜新市 | 计算机 | 70 | | 904 | 李四 | 男 | 1990 | 英语系 | 辽宁省阜新市 | 英语 | 92 | | 905 | 王五 | 女 | 1991 | 英语系 | 福建省厦门市 | 英语 | 94 | | 906 | 王六 | 男 | 1988 | 计算机系 | 湖南省衡阳市 | 计算机 | 90 | | 906 | 王六 | 男 | 1988 | 计算机系 | 湖南省衡阳市 | 英语 | 85 | +-----+-----------+--------+-------+--------------+--------------------+-----------+-------+
- 删除视图
drop view 视图名称; drop view v_studentinfo;
- 视图的优点
1. 简化查询操作
对于复杂的查询,往往是有多个数据表进行关联查询而得到,对于这个复杂的查询结果保存为一个视图,便于下一次查询时简化查询操作。
2. 逻辑上的独立性,屏蔽了真实表结构更改带来的影响
视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。
3. 视图能够对机密数据提供一定安全保护
因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以将基表中重要的字段信息,可以不通过视图给用户。
- 视图的缺点
1. 性能差
对视图(select)的查询最终转换为对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,也会花费一定时间。
2. 额外增加数据库的复杂度
假如有50张基表,如果有特定需要,可能会新建50张视图,这样数据库就太多表了,太复杂了。
- 说在后面
视图的确有很多优点,但是因为性能差这一个致命缺点,所以现在用的特别少。