本文共 2217 字,大约阅读时间需要 7 分钟。
在实际工作中,通过定义视图可以将复杂的查询逻辑隐藏起来,便于日常使用。MySQL支持CREATE VIEW语句,通过定义视图可以将复杂的查询逻辑隐藏起来,便于日常使用。以下是创建视图的关键点:
CREATE VIEW myv1 AS SELECT last_name, department_name, job_title FROM employees eJOIN departments d ON e.department_id = d.department_idJOIN jobs j ON j.job_id = e.job_id;
SELECT * FROM myv1 WHERE last_name LIKE '%a%';
CREATE VIEW myv2 AS SELECT AVG(salary) AS average_salary, department_id FROM employeesGROUP BY department_id;
SELECT myv2.average_salary, job_grades.grade_level FROM myv2JOIN job_grades ON myv2.average_salary BETWEEN job_grades.lowest_sal AND job_grades.highest_sal;
视图的修改可以通过以下两种方式实现:
CREATE OR REPLACE语句CREATE OR REPLACE VIEW myv3 AS SELECT * FROM myv2 ORDER BY average_salary LIMIT 1;
ALTER VIEW语句ALTER VIEW myv3 AS SELECT * FROM employees;
当不再需要视图时,可以通过以下语句删除:
DROP VIEW myv1, myv2, myv3;
可以通过以下语句查看视图的定义和创建细节:
DESC myv3; -- 查看视图字段信息SHOW CREATE VIEW myv3; -- 查看视图的创建语句
定义的视图可以像普通表一样进行插入、更新和删除操作,但需要注意以下限制条件。
INSERT INTO myv1 VALUES('张飞','zf@qq.com'); UPDATE myv1 SET last_name = '张无忌' WHERE last_name = '张飞';
DELETE FROM myv1 WHERE last_name = '张无忌';
以下类型的视图不允许更新:
包含DISTINCT、GROUP BY、HAVING、UNION或UNION ALL的视图
CREATE OR REPLACE VIEW myv1 AS SELECT MAX(salary) salary, department_id FROM employeesGROUP BY department_id;
更新失败原因:MAX函数返回的是聚合后的结果,视图不允许直接更新。
常量视图
CREATE OR REPLACE VIEW myv2 AS SELECT 'john' AS name;
更新失败原因:name字段是一个固定的常量。
包含子查询的视图
CREATE OR REPLACE VIEW myv3 AS SELECT department_id, (SELECT MAX(salary) FROM employees) AS highest_salary FROM departments;
更新失败原因:最高工资字段引用了子查询的结果。
包含JOIN操作的视图
CREATE OR REPLACE VIEW myv4 AS SELECT last_name, department_name FROM employees eJOIN departments d ON e.department_id = d.department_id;
更新失败原因:JOIN生成的视图通常无法直接更新原表中的数据。
从一个不能更新的视图中查询
CREATE OR REPLACE VIEW myv5 AS SELECT * FROM myv3;
更新失败原因:视图myv3本身不允许更新。
包含WHERE子句的子查询引用的视图
CREATE OR REPLACE VIEW myv6 AS SELECT last_name, email, salary FROM employeesWHERE employee_id IN (SELECT manager_id FROM employees WHERE manager_id IS NOT NULL);
更新失败原因:子查询引用了WHERE子句中的表,导致视图无法更新。
在实际项目中,以上类型的视图通常不允许直接更新操作,需要通过基表直接插入或更新,或者删除视图后重新定义。
转载地址:http://phtgz.baihongyu.com/