MySQL 知识量:16 - 40 - 165
创建视图要注意以下几点:
通过create view语句来创建视图。
使用“show create view 视图名;”来查看创建视图的语句。
使用“drop view 视图名;”来删除视图。
更新视图时,可以使用先删除视图再创建视图的方法;也可以直接使用create or replace view语句,如果视图不存在就自动创建,如果视图已经存在就自动替换。
视图可以隐藏复杂的查询过程,通常涉及表的联结。例如查询所有学生的姓名和选择的课程名称,这涉及表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子句的查询结果是一样的,因此,使用视图可以简化复杂的联结操作。
视图的另一项功能是重新格式化检索出的数据,例如使用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就可以了。
可以使用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 | +----+-------+-----+--------+
视图同样可以简化含有计算字段的表查询,例如创建一个视图“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 | +-------+--------------+
简单的视图是可以更新的,也就是说,对视图的插入、更新、删除操作将实际改变视图的基表。复杂的视图是不可更新的,因为MySQL不能确定复杂视图的更新所指的基表具体是哪个表。
不可更新的视图一般是指在创建视图时包含以下内容:
分组(group by和having)
联结
子查询
并(union)
聚集函数(min()、count()、sum()等)
distinct
导出(计算)列
需要知道的是,视图一般用于数据的查询,而插入、更新、删除操作最好还是直接使用真正的基表。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6