文章目录
- 视图的创建、嵌套及特性
- 创建视图
- 查询视图
- 视图的嵌套
- 常见的8个使用场景
- 场景一:仅提供需要的数据
- 场景二:对特定的用户仅开放特定的数据,达到保护敏感数据的目的,提升了数据安全性;
- 仅筛选需要的数据
- 场景四:简化复杂的操作
- 场景五:重新格式化出新的字段
- 场景六:使用计算表达式生成新的字段
- 场景七:屏蔽底层实现逻辑及频繁的变更
- 场景八:合并多个分离的子表
视图的创建、嵌套及特性
比如:查询学生信息时,同时查询出老师姓名:
SELECT
a.*, b.teacher_name
FROM student a
LEFT JOIN teacher b
ON a.teacher_id = b.teacher_id;
思考:如果有很多地方都需要按上面的逻辑查询,那LEFT JOIN的脚本就需要写
很多遍,有没有一种简写的方式?
我们可以使用视图实现:
使用建议:慎用视图!
复杂的关联、嵌套,导致执行计划不可控,查询性能低下;
创建视图
使用CREATE VIEW
关键字。语法如下:
CREATE VIEW 视图名
AS
SELECT子句;
比如,查询学生信息时,同时查询出老师姓名:
CREATE VIEW v_student
AS
SELECT
a.*, b.teacher_name
FROM student a
LEFT JOIN teacher b
ON a.teacher_id = b.teacher_id;
查询视图
与查询表一样,使用SELECT
子句。
比如,查询学生信息时,同时查询出老师姓名:
SELECT * FROM v_student;
SELECT student_id,student_name,teacher_id,teacher_name from v_student;
SELECT * FROM v_student WHERE teacher_id = 'T0003';
视图的嵌套
查询所有考试及格的学生信息:
CREATE VIEW v_student_nesting
AS
SELECT * FROM v_student
WHERE score >= 60;
常见的8个使用场景
场景一:仅提供需要的数据
比如:只想查询学生编号、学生姓名、分数三个字段的信息:
CREATE VIEW v_student1
AS
SELECT
a.student_id,a.student_name,a.score
FROM student a;
场景二:对特定的用户仅开放特定的数据,达到保护敏感数据的目的,提升了数据安全性;
比如:只想将学生编号、学生姓名、分数三个字段的信息暴露给用户u_read:
GRANT SELECT ON v_student1 TO u_read@localhost;
仅筛选需要的数据
比如:只查询成绩及格的学生信息:
CREATE VIEW v_student3
AS
SELECT * FROM student a
WHERE a.score >= 60;
场景四:简化复杂的操作
比如:在应用的多个地方,都需要查询学生信息时,同时查询出老师姓名:
CREATE VIEW v_student4
AS
SELECT a.*,b.teacher_name
FROM student a
LEFT JOIN teacher b
ON a.teacher_id = b.teacher_id;
SELECT * FROM v_student4;
场景五:重新格式化出新的字段
比如:查询学生出生日期,年月日单独一个字段展示:
CREATE VIEW v_student5
AS
SELECT a.student_id, a.student_name,
year(a.birth_day) birth_year,
month(a.birth_day) birth_month,
day(a.birth_day) birth_day
FROM student a;
场景六:使用计算表达式生成新的字段
比如:考试总分100分,查询所有学生做错的题目的分数:
CREATE VIEW v_student6
AS
SELECT
a.student_id, a.student_name, a.score,
100 - a.score as 'wrong_score' # 必须要对新产生的字段给出字
段名,否则可能会报错。
FROM student a;
场景七:屏蔽底层实现逻辑及频繁的变更
比如:考试总分100分,查询所有学生做错的题目的分数:
CREATE VIEW v_student7
AS
SELECT a.student_id,a.student_name, a.score,100 - a.score as 'wrong_score'
FROM student a;
场景八:合并多个分离的子表
比如:假如有3个学校,每个学校的学生数据在各自的表中,如何一次性查询所
有学生的信息:
CREATE VIEW v_student8
AS
SELECT * FROM student1
UNION ALL
SELECT * FROM student2
UNION ALL
SELECT * FROM student3;