MySQL[笔记][视图]
发布日期:2021-05-19 18:19:23 浏览次数:21 分类:精选文章

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

MySQL 视图(View)详细指南

MySQL 视图是一种非常强大的工具,可以用于提高数据查询效率,统一数据访问入口。本文将详细介绍视图的创建、修改、删除以及实际应用案例。

什么是视图?

视图是基于现有表的逻辑视结果集的对象。与普通表不同,视图并不在物理存储中保存数据,而是通过执行存储的 SQL 语句来生成数据。因此,视图可以被视为是一种动态的、基于查询逻辑的虚拟表。

以下是视图的几个典型用途:

  • 复杂查询的一致性:当多个地方需要使用相同的复杂查询时,通过创建视图可以减少代码重复。
  • 简化查询:对于复杂的跨表查询,可以通过创建视图来简化 SQL 语句,使其更易于理解和维护。
  • 灵活性:视图允许对数据的动态过滤和聚合,适合支持多种业务需求的场景。

  • 一、创建视图

    通过以下步骤可以创建视图:

  • 基本语法

    CREATE VIEW view_name AS SELECT ... FROM table_name;

    例如,可以创建一个包含部分数据的视图:

    CREATE VIEW departments_viewer AS SELECT department_id, department_name FROM departments;
  • 使用具体案例

    案例 1:查询包含’я’的员工信息

    CREATE VIEW employees_viewer AS SELECT last_name, department_name, job_title FROM employees
    JOIN departments ON departments.department_id = employees.department_id
    WHERE last_name LIKE '%亚';
  • 查询指定部门的平均工资

    CREATE VIEW salary_avg_viewer AS SELECT AVG(salary) average_salary FROM employees
    GROUP BY department_id;
  • 结合多个表的复杂查询

    CREATE VIEW customers_order_viewer AS SELECT customer_name, order_amount, order_date FROM customers
    JOIN orders ON customers.customer_id = orders.customer_id
    WHERE order_amount > 1000;

  • 二、修改视图

    当需要修改现有视图时,可以使用以下方法:

  • 替换整个视图

    CREATE OR REPLACE VIEW view_name AS SELECT ... FROM table_name;

    例如:

    CREATE OR REPLACE VIEW salary_avg_viewer AS SELECT AVG(salary) FROM employees GROUP BY department_id;
  • 仅修改部分字段

    ALTER VIEW view_name AS SELECT ... FROM table_name;

    例如:

    ALTER VIEW departments_viewer AS SELECT department_name, number_of_employees FROM departments;
  • 删除视图

    DROP VIEW view_name;

    例如:

    DROP VIEW departments_viewer;

  • 三、查看视图信息

    可以通过以下方式查看视图的详细信息:

  • 使用 DESC 命令

    DESC view_name;
  • 查看视图的创建语句

    SHOW CREATE VIEW view_name;

  • 四、视图的实际应用

    以下是视图在实际项目中的几种常见应用场景:

    案例 1:查询特定电话区码的员工信息

    创建视图 emp_v1 以查询电话号码以“011”开头的员工信息:

    CREATE OR REPLACE VIEW emp_v1 AS SELECT last_name, salary, email FROM employees
    WHERE phone_number LIKE '011%';

    案例 2:查询部门的最高工资

    创建视图 dept_salary_v2 以计算每个部门的最高工资:

    CREATE OR REPLACE VIEW dept_salary_v2 AS SELECT MAX(salary) AS max_salary, department_id FROM employees
    GROUP BY department_id HAVING max_salary > 12000;

    案例 3:更新视图中的数据

    आप可以通过以下方式对视图中的数据进行插入、修改和删除操作:

  • 插入新数据

    INSERT INTO emp_v1 VALUES('张飞', 'ZF@QQ.COM', 100000);
  • 更新数据

    UPDATE emp_v1 SET last_name = '张无忌' WHERE last_name = '张飞';
  • 删除数据

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

  • 五、注意事项

  • 不允许更新的视图: 如果视图包含以下关键字,则不能对其进行更新操作:

    • GROUP BYDISTINCTHAVINGUNION 等聚合函数
    • 约束条件中的子查询
    • 使用 JOIN keyword 时引用了一个不能更新的表

    例如:

    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);
  • 常量视图: 如果需要频繁查询某个固定值,可以通过视图实现:

    CREATE OR REPLACE VIEW const_view AS SELECT 'جارð' AS name;

  • 六、实战示例:书籍管理系统

    假设有一个名为 book 的表,包含以下字段:

    • bid(主键)
    • bname (书名)
    • price(价格)
    • btypeid (类型 ID,外键指向 bookType 表)
  • 插入一行数据并提交事务

    SET autocommit = 0;
    INSERT INTO book(bid, bname, price, btypeid) VALUES(1, '小李飞刀', 100, 1);
    COMMIT;
  • 创建一个查询价格大于100的书名和类型的视图

    CREATE VIEW myv1 AS SELECT bname, btype_name FROM book b
    INNER JOIN bookType t ON b.btypeid = t.id WHERE price > 100;
  • 修改视图以支持价格范围查询

    CREATE OR REPLACE VIEW myv2 AS SELECT bname, price FROM book WHERE price BETWEEN 90 AND 120;
  • 删除视图

    DROP VIEW myv1;

  • 通过本文的步骤和示例,你可以方便地掌握MySQL视图的使用方法,并将其成功应用于实际项目中。

    上一篇:MySQL[笔记][事务、TCL]
    下一篇:MySQL[笔记][存储过程]

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2025年04月26日 03时05分00秒