MySQL视图


视图概述

视图(View)是一种虚拟存在的表。 视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图就是一条SELECT语句执行后返回的结果集。 所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

视图相对于普通的表的优势:

  • 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
  • 安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。
  • 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

基础语法

在MySQL中,视图的创建、修改和删除都涉及到特定的SQL语法。下面是每种操作的详细语法和示例:

1.创建视图

创建视图使用 CREATE VIEW 语句。基本语法如下:

CREATE VIEW 视图名称 AS
SELECT 选择的列
FROM 表名
WHERE 条件;

示例:

CREATE VIEW employee_view AS
SELECT id, name, dept_id
FROM employees
WHERE dept_id = 1;

这个视图 employee_view 显示了 employees 表中所有 dept_id 为1的员工。

2.修改视图

要修改视图,你可以先删除原有视图,然后重新创建一个新的视图。MySQL不直接支持修改视图的语法,但可以使用 CREATE OR REPLACE VIEW 来更新视图。语法如下:

CREATE OR REPLACE VIEW 视图名称 AS
SELECT 选择的列
FROM 表名
WHERE 条件;

示例:

CREATE OR REPLACE VIEW employee_view AS
SELECT id, name, dept_id, salary
FROM employees
WHERE dept_id = 1;

这个语句将更新 employee_view 视图,添加了 salary 列。

3.删除视图

删除视图使用 DROP VIEW 语句。基本语法如下:

DROP VIEW 视图名称;

示例:

DROP VIEW employee_view;

这个语句将删除 employee_view 视图。

4.视图的其他操作

查看视图结构:

SHOW CREATE VIEW 视图名称;

示例:

SHOW CREATE VIEW employee_view;

列出所有视图:

SHOW FULL TABLES IN 数据库名 WHERE Table_type = 'VIEW';

示例:

SHOW FULL TABLES IN my_database WHERE Table_type = 'VIEW';

这些语法和示例涵盖了MySQL中视图的基本创建、修改和删除操作。通过这些操作,你可以管理和使用视图来简化数据操作和查询。

MySQL视图案例:

1.创建表

首先,我们需要创建两个基本的表:employees(员工) 和 departments(部门)。

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    dept_id INT
);

CREATE TABLE departments (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

然后,我们需要插入一些数据:

INSERT INTO employees (id, name, dept_id) VALUES
(1, 'John', 1),
(2, 'Lily', 1),
(3, 'Jack', 2),
(4, 'Jacob', 2),
(5, 'Diana', 3);

INSERT INTO departments (id, name) VALUES
(1, 'Sales'),
(2, 'Marketing'),
(3, 'Engineering');

2.创建视图

现在我们要创建一个视图employees_dept_view,它将展示每个员工和其所在部门的信息:

CREATE VIEW employees_dept_view AS
SELECT e.id, e.name, d.name AS dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.id;

3.查询视图

创建视图后,我们可以像查询普通表一样查询它:

SELECT * FROM employees_dept_view;

这将返回所有员工的ID、姓名和部门名称。

4.更新视图

使用CREATE OR REPLACE VIEW 修改视图,将内连接查询,修改左外连接查询;

CREATE OR REPLACE VIEW  employees_dept_view  AS
SELECT e.id, e.name, d.name AS dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.id;

5.删除视图

如果你不再需要这个视图,可以删除它:

DROP VIEW employees_dept_view;

这就是创建和使用MySQL视图的一个完整案例。视图在很多场景下非常有用,例如简化复杂的查询、提供数据的封装以及安全访问数据的手段。

视图特点:

  • MySQL 视图是一个虚拟的表,它由一个 SQL 查询定义,并且不存储实际的数据;
  • 视图的定义保存在数据字典内,创建视图所基于的表称为“基表”;
  • 删除视图不会影响到“基表”,删除或修改“基表”会影响到视图;
  • 视图的数据来自于查询执行的结果,并且可以像表一样被查询、更新和删除;
  • 视图提供了一种简化复杂查询的方法,并且可以用来限制用户对数据库中特定数据的访问;
  • 在视图中插入数据,都是基于“基表”的插入条件,会将数据添加到“基表”中的;
  • 在视图中修改、删除数据,也都是基于“基表”的插入条件,也会将数据修改、删除作用到“基表”中的。

视图的使用规则:

  • 视图必须有唯一命名;
  • 在mysql中视图的数量没有限制;
  • 创建视图必须从管理员那里获得必要的权限;
  • 视图支持嵌套,也就是说可以利用其他视图检索出来的数据创建新的视图;
  • 在视图中可以使用order by,但是如果视图内已经使用该排序子句,则视图的ORDER BY将覆盖前面的ORDER BY;
  • 视图不能索引,也不能关联触发器或默认值;
  • 视图可以和表同时使用。