博客
关于我
MySQL学习笔记(十五)—— MySQL的视图
阅读量:733 次
发布时间:2019-03-21

本文共 2217 字,大约阅读时间需要 7 分钟。

视图的基础与应用

一、创建视图

在实际工作中,通过定义视图可以将复杂的查询逻辑隐藏起来,便于日常使用。MySQL支持CREATE VIEW语句,通过定义视图可以将复杂的查询逻辑隐藏起来,便于日常使用。以下是创建视图的关键点:

1. 查询姓名中包含'a'字符的员工信息

创建视图

CREATE VIEW myv1 AS SELECT last_name, department_name, job_title FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN jobs j ON j.job_id = e.job_id;

具体查询

SELECT * FROM myv1 WHERE last_name LIKE '%a%';

2. 查询各部门的平均工资级别

创建视图

CREATE VIEW myv2 AS SELECT AVG(salary) AS average_salary, department_id FROM employees
GROUP BY department_id;

查询特定部门的信息

SELECT myv2.average_salary, job_grades.grade_level FROM myv2
JOIN job_grades ON myv2.average_salary BETWEEN job_grades.lowest_sal AND job_grades.highest_sal;

二、视图的修改

视图的修改可以通过以下两种方式实现:

1. 使用CREATE OR REPLACE语句

CREATE OR REPLACE VIEW myv3 AS SELECT * FROM myv2 ORDER BY average_salary LIMIT 1;

2. 使用ALTER VIEW语句

ALTER VIEW myv3 AS SELECT * FROM employees;

三、删除视图

当不再需要视图时,可以通过以下语句删除:

DROP VIEW myv1, myv2, myv3;

四、查看视图

可以通过以下语句查看视图的定义和创建细节:

DESC myv3;  -- 查看视图字段信息
SHOW CREATE VIEW myv3; -- 查看视图的创建语句

五、视图的更新

定义的视图可以像普通表一样进行插入、更新和删除操作,但需要注意以下限制条件。

1. 插入操作

INSERT INTO myv1 VALUES('张飞','zf@qq.com');

2. 修改操作

UPDATE myv1 SET last_name = '张无忌' WHERE last_name = '张飞';

3. 删除操作

DELETE FROM myv1 WHERE last_name = '张无忌';

不允许更新的视图类型

以下类型的视图不允许更新:

  • 包含DISTINCTGROUP BYHAVINGUNIONUNION ALL的视图

    CREATE OR REPLACE VIEW myv1 AS SELECT MAX(salary) salary, department_id FROM employees
    GROUP 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 e
    JOIN 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 employees
    WHERE employee_id IN (SELECT manager_id FROM employees WHERE manager_id IS NOT NULL);

    更新失败原因:子查询引用了WHERE子句中的表,导致视图无法更新。

  • 在实际项目中,以上类型的视图通常不允许直接更新操作,需要通过基表直接插入或更新,或者删除视图后重新定义。

    转载地址:http://phtgz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现insertion sort插入排序算法(附完整源码)
    查看>>
    Objective-C实现integer partition整数分区算法(附完整源码)
    查看>>
    Objective-C实现integerPartition整数划分算法(附完整源码)
    查看>>
    Objective-C实现interpolation search插值搜索算法(附完整源码)
    查看>>
    Objective-C实现Interpolation search插值查找算法(附完整源码)
    查看>>
    Objective-C实现intersection交集算法(附完整源码)
    查看>>
    Objective-C实现intro sort内省排序算法(附完整源码)
    查看>>
    Objective-C实现inverse matrix逆矩阵算法(附完整源码)
    查看>>
    Objective-C实现inversions倒置算法(附完整源码)
    查看>>
    Objective-C实现isalpha函数功能(附完整源码)
    查看>>
    Objective-C实现islower函数功能(附完整源码)
    查看>>
    Objective-C实现isPowerOfTwo算法(附完整源码)
    查看>>
    Objective-C实现isupper函数功能(附完整源码)
    查看>>
    Objective-C实现ItemCF算法(附完整源码)
    查看>>
    Objective-C实现ItemCF算法(附完整源码)
    查看>>
    Objective-C实现iterating through submasks遍历子掩码算法(附完整源码)
    查看>>
    Objective-C实现iterative merge sort迭代归并排序算法(附完整源码)
    查看>>
    Objective-C实现jaccard similarity相似度无平方因子数算法(附完整源码)
    查看>>
    Objective-C实现Julia集算法(附完整源码)
    查看>>
    Objective-C实现k nearest neighbours k最近邻分类算法(附完整源码)
    查看>>