面试题答案
一键面试1. 简化复杂查询
在实际应用中,可能经常需要执行一些复杂的多表联合查询。视图可以将这些复杂查询封装起来,使得后续使用时就像查询一张简单的表一样。
例如,有三张表students
(学生表,包含student_id
, name
等字段),scores
(成绩表,包含student_id
, course_id
, score
等字段),courses
(课程表,包含course_id
, course_name
等字段)。要查询每个学生及其对应的所有课程成绩和课程名,这是一个三表联合查询,直接写会比较复杂:
SELECT s.name, c.course_name, sc.score
FROM students s
JOIN scores sc ON s.student_id = sc.student_id
JOIN courses c ON sc.course_id = c.course_id;
如果将这个查询创建为视图,后续使用就会很方便:
CREATE VIEW student_course_scores AS
SELECT s.name, c.course_name, sc.score
FROM students s
JOIN scores sc ON s.student_id = sc.student_id
JOIN courses c ON sc.course_id = c.course_id;
之后查询视图就如同查询普通表:
SELECT * FROM student_course_scores;
2. 提供数据安全保护
通过视图,可以限制用户只能看到部分数据,而不是整个表的数据,从而增强数据安全性。
假设employees
表包含employee_id
, name
, salary
, department
等字段,公司只想让普通员工看到其他员工的姓名和部门,而看不到薪资。可以创建如下视图:
CREATE VIEW employee_basic_info AS
SELECT name, department
FROM employees;
普通员工查询视图时,就看不到薪资信息:
SELECT * FROM employee_basic_info;
3. 逻辑数据独立性
当底层表结构发生变化时,只要视图的逻辑不变,基于视图的应用程序不需要修改。
例如,原来products
表有product_id
, product_name
, price
字段,现在新增了description
字段。如果应用程序一直是基于视图操作数据,只要视图的定义不变(例如视图原来只查询product_id
和product_name
),应用程序无需修改。假设原来的视图:
CREATE VIEW product_simple_view AS
SELECT product_id, product_name
FROM products;
即使表结构变化,查询视图的方式依旧:
SELECT * FROM product_simple_view;