MySQL

MySQL 知识量:16 - 40 - 165

9.2 使用视图><

创建视图- 9.2.1 -

创建视图要注意以下几点:

  • 通过create view语句来创建视图。

  • 使用“show create view 视图名;”来查看创建视图的语句。

  • 使用“drop view 视图名;”来删除视图。

  • 更新视图时,可以使用先删除视图再创建视图的方法;也可以直接使用create or replace view语句,如果视图不存在就自动创建,如果视图已经存在就自动替换。

简化复杂的联结- 9.2.2 -

视图可以隐藏复杂的查询过程,通常涉及表的联结。例如查询所有学生的姓名和选择的课程名称,这涉及表student、表course和表lesson的三表联结。三个表的具体结构和内容可以参考“创建联结”

select s.name as sname,l.name as lname
from student as s,course as c,lesson as l
where s.id=c.id_student and l.id=c.id_lesson;

查询结果为:

+-------+---------+
| sname | lname   |
+-------+---------+
| Susan | Maths   |
| Jen   | Natural |
| Jame  | Maths   |
| Robot | Maths   |
| Toney | Maths   |
| Susan | English |
| Bob   | English |
| Robot | English |
| Jen   | English |
| Robot | Natural |
| Toney | Natural |
+-------+---------+

下面,对这个查询创建一个视图“xuanke”,SQL语句如下:

create view xuanke as
select s.name as sname,l.name as lname
from student as s,course as c,lesson as l
where s.id=c.id_student and l.id=c.id_lesson;

视图创建后,如果要查询所有选了课程“Maths”的学生,使用视图查询如下:

select * from xuanke where lname='Maths';

查询结果为:

+-------+-------+
| sname | lname |
+-------+-------+
| Susan | Maths |
| Jame  | Maths |
| Robot | Maths |
| Toney | Maths |
+-------+-------+

这与直接使用复杂联结加where子句的查询结果是一样的,因此,使用视图可以简化复杂的联结操作。

格式化查询的数据- 9.2.3 -

视图的另一项功能是重新格式化检索出的数据,例如使用concat创建学生的简介,通常做法是:

select concat(name,' is ',age,' years old.') from student;

查询结果为:

+---------------------------------------+
| concat(name,' is ',age,' years old.') |
+---------------------------------------+
| Susan is 11 years old.                |
| Jame is 12 years old.                 |
| Bob is 11 years old.                  |
| Robot is 10 years old.                |
| Jen is 11 years old.                  |
| Toney is 10 years old.                |
+---------------------------------------+

如果今后经常需要使用这个格式的结果,就可以创建一个视图。

create view introduce as
select concat(name,' is ',age,' years old.') from student;

这样今后如何要查询学生简介,直接搜索introduce就可以了。

过滤不想要的数据- 9.2.4 -

可以使用where子句,在创建视图的过程中对数据进行过滤,例如创建一个男孩信息视图和一个女孩信息视图:

create view boys as select * from student where sex='male';
create view girls as select * from student where sex='female';

创建完毕后,可以查看男孩和女孩视图情况。

select * from boys union select * from girls;

查询结果为:

+----+-------+-----+--------+
| id | name  | age | sex    |
+----+-------+-----+--------+
|  2 | Jame  |  12 | male   |
|  3 | Bob   |  11 | male   |
|  4 | Robot |  10 | male   |
|  6 | Toney |  10 | male   |
|  1 | Susan |  11 | female |
|  5 | Jen   |  11 | female |
+----+-------+-----+--------+

结合计算字段- 9.2.5 -

视图同样可以简化含有计算字段的表查询,例如创建一个视图“after10”:查询学生的姓名和10年后的年龄。

create view after10 as select name,age+10 as after10years from student;

建立视图后,要查询10年后年龄不超过20岁的学生,SQL语句如下:

select * from after10 where after10years<=20;

查询结果为:

+-------+--------------+
| name  | after10years |
+-------+--------------+
| Robot |           20 |
| Toney |           20 |
+-------+--------------+

更新视图- 9.2.6 -

简单的视图是可以更新的,也就是说,对视图的插入、更新、删除操作将实际改变视图的基表。复杂的视图是不可更新的,因为MySQL不能确定复杂视图的更新所指的基表具体是哪个表。

不可更新的视图一般是指在创建视图时包含以下内容:

  • 分组(group by和having)

  • 联结

  • 子查询

  • 并(union)

  • 聚集函数(min()、count()、sum()等)

  • distinct

  • 导出(计算)列

需要知道的是,视图一般用于数据的查询,而插入、更新、删除操作最好还是直接使用真正的基表。