SQL 基础教程
SQL 连接
SQL 高级教程
SQL 参考资料

SQL CREATE VIEW 语句

在本教程中,您将学习如何使用 SQL 创建、更新和删除视图。

创建视图以简化表访问

视图是一个虚拟表,其定义存储在数据库中。 但是,与表不同,视图实际上并不包含任何数据。 相反,它提供了一种在数据库中存储常用复杂查询的方法。 但是,您可以使用 SQL SELECT 语句 中的视图来访问数据,就像使用普通表或基表一样。

视图也可以用作一种安全机制,允许用户通过视图访问数据,而不是让他们直接访问整个基表。

语法

视图是使用 CREATE VIEW 语句创建的。

CREATE VIEW view_name AS select_statement;

为了清楚地理解这一点,让我们看看下面的 employeesdepartments 表。

+--------+--------------+--------+---------+
| emp_id | emp_name     | salary | dept_id |
+--------+--------------+--------+---------+
|      1 | Ethan Hunt   |   5000 |       4 |
|      2 | Tony Montana |   6500 |       1 |
|      3 | Sarah Connor |   8000 |       5 |
|      4 | Rick Deckard |   7200 |       3 |
|      5 | Martin Blank |   5600 |    NULL |
+--------+--------------+--------+---------+
+---------+------------------+
| dept_id | dept_name        |
+---------+------------------+
|       1 | Administration   |
|       2 | Customer Service |
|       3 | Finance          |
|       4 | Human Resources  |
|       5 | Sales            |
+---------+------------------+
表: employees 表: departments

假设您要检索员工的 id 和 name 以及他们的部门名称,那么您需要执行 left join 操作,如下所示:

SELECT t1.emp_id, t1.emp_name, t2.dept_name
FROM employees AS t1 LEFT JOIN departments AS t2
ON t1.dept_id = t2.dept_id;

执行上述查询后,您将获得如下输出:

+--------+--------------+-----------------+
| emp_id | emp_name     | dept_name       |
+--------+--------------+-----------------+
|      1 | Ethan Hunt   | Human Resources |
|      2 | Tony Montana | Administration  |
|      3 | Sarah Connor | Sales           |
|      4 | Rick Deckard | Finance         |
|      5 | Martin Blank | NULL            |
+--------+--------------+-----------------+

但是,每当您想要访问此记录时,您都需要再次键入整个查询。 如果你经常执行这样的操作,它会变得非常不方便和烦人。

在这种情况下,您可以创建一个视图以使查询结果更易于访问,如下所示:

CREATE VIEW emp_dept_view AS
SELECT t1.emp_id, t1.emp_name, t2.dept_name
FROM employees AS t1 LEFT JOIN departments AS t2
ON t1.dept_id = t2.dept_id;

现在您可以使用视图 emp_dept_view 访问相同的记录,如下所示:

SELECT * FROM emp_dept_view;

正如您所见,您可以通过视图节省多少时间和精力。

提示:视图始终显示最新数据! 每次查询视图时,数据库引擎都会执行与视图关联的 SQL 查询并重新创建数据。

注意: 在 MySQL 中,您还可以在视图定义中指定 ORDER BY 子句。 但是,在 SQL Sever 中,视图定义不能包含 ORDER BY 子句,除非在 SELECT 语句的选择列表中还有 TOP 子句。


替换现有视图

在 MySQL 中,如果要更新或替换现有视图,可以删除该视图并创建一个新视图,或者只使用 CREATE VIEW 语句中的 OR REPLACE 子句,如下所示:

CREATE OR REPLACE VIEW view_name AS select_statement;

注意: CREATE VIEW 语句中使用 OR REPLACE 子句时,如果视图不存在则创建新视图,否则替换现有视图。

以下 SQL 语句将通过向现有视图 emp_dept_view 添加新列 salary 来替换或更改其定义。

-- MySQL 数据库的语法 
CREATE OR REPLACE VIEW emp_dept_view AS
SELECT t1.emp_id, t1.emp_name, t1.salary, t2.dept_name
FROM employees AS t1 LEFT JOIN departments AS t2
ON t1.dept_id = t2.dept_id;

更新视图后,如果执行以下语句:

SELECT * FROM emp_dept_view ORDER BY emp_id;

您将在结果输出中看到另一列 salary,如下所示:

+--------+--------------+--------+-----------------+
| emp_id | emp_name     | salary | dept_name       |
+--------+--------------+--------+-----------------+
|      1 | Ethan Hunt   |   5000 | Human Resources |
|      2 | Tony Montana |   6500 | Administration  |
|      3 | Sarah Connor |   8000 | Sales           |
|      4 | Rick Deckard |   7200 | Finance         |
|      5 | Martin Blank |   5600 | NULL            |
+--------+--------------+--------+-----------------+

注意: SQL Server 不支持 OR REPLACE 子句,因此要替换视图,您可以简单地删除该视图并从拉伸创建一个新视图。


通过视图更新数据

理论上,除了 SELECT 语句之外,您还可以对视图执行 INSERT, UPDATE, and DELETE。 但是,并非所有视图都是可更新的,即能够修改基础源表的数据。 可更新性有一些限制。

通常,如果视图包含以下任何内容,则它是不可更新的:

  • DISTINCT, GROUP BYHAVING 子句。
  • 聚合函数,例如 AVG(), COUNT(), SUM(), MIN(), MAX() 等。
  • UNION, UNION ALL, CROSSJOIN, EXCEPT or INTERSECT 运算符。
  • WHERE 子句中的子查询引用 FROM 子句中的表。

如果视图满足这些条件,您可以使用该视图修改源表。

以下语句将更新 emp_id 等于 1 的员工的 salary

UPDATE emp_dept_view SET salary = '6000' 
WHERE emp_id = 1;

注意:为了可插入性,视图必须包含基表中没有默认值的所有列。 同样,为了可更新性,视图中的每个可更新列都必须对应于源表中的可更新列。


删除视图

同样,如果您不再需要视图,可以使用 DROP VIEW 语句将其从数据库中删除,如以下语法所示:

DROP VIEW view_name;

以下命令将从数据库中删除视图 emp_dept_view

DROP VIEW emp_dept_view;
Advertisements