mysql的视图

# 转载请联系

假如你在管理着学生系统,有两张这样的表。

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张视图,这样数据库就太多表了,太复杂了。

  • 说在后面

视图的确有很多优点,但是因为性能差这一个致命缺点,所以现在用的特别少。

原文地址:https://www.cnblogs.com/chichung/p/9598812.html