SQL CREATE VIEW 语句
在本教程中,您将学习如何使用 SQL 创建、更新和删除视图。
创建视图以简化表访问
视图是一个虚拟表,其定义存储在数据库中。 但是,与表不同,视图实际上并不包含任何数据。 相反,它提供了一种在数据库中存储常用复杂查询的方法。 但是,您可以使用 SQL SELECT 语句 中的视图来访问数据,就像使用普通表或基表一样。
视图也可以用作一种安全机制,允许用户通过视图访问数据,而不是让他们直接访问整个基表。
语法
视图是使用 CREATE VIEW
语句创建的。
view_name
AS select_statement
;为了清楚地理解这一点,让我们看看下面的 employees 和 departments 表。
+--------+--------------+--------+---------+ | 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 中,如果要更新或替换现有视图,可以删除该视图并创建一个新视图,或者只使用 CREATE VIEW
语句中的 OR REPLACE
子句,如下所示:
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 BY
或HAVING
子句。- 聚合函数,例如
AVG()
,COUNT()
,SUM()
,MIN()
,MAX()
等。 UNION
,UNION ALL
,CROSSJOIN
,EXCEPT
orINTERSECT
运算符。WHERE
子句中的子查询引用FROM
子句中的表。
如果视图满足这些条件,您可以使用该视图修改源表。
以下语句将更新 emp_id 等于 1 的员工的 salary。
UPDATE emp_dept_view SET salary = '6000'
WHERE emp_id = 1;
注意:为了可插入性,视图必须包含基表中没有默认值的所有列。 同样,为了可更新性,视图中的每个可更新列都必须对应于源表中的可更新列。
删除视图
同样,如果您不再需要视图,可以使用 DROP VIEW
语句将其从数据库中删除,如以下语法所示:
以下命令将从数据库中删除视图 emp_dept_view。
DROP VIEW emp_dept_view;