在 SQL Server 中,视图是基于 SQL 查询的虚拟表。它们不存储数据本身,而是保存了一个 SQL 查询,这个查询作为视图的定义。当你访问视图时,SQL Server 动态地执行这个查询并返回结果。视图可以包含来自一个或多个表的数据,可以用于简化复杂的 SQL 查询、保护数据以及确保数据的一致性。
假设我们有以下两个数据表:
| EmployeeID | FirstName | LastName | Position | DepartmentID |
|---|---|---|---|---|
| 1 | John | Doe | Manager | 1 |
| 2 | Jane | Smith | Developer | 2 |
| 3 | Emily | Clark | Designer | 2 |
| DepartmentID | DepartmentName |
|---|---|
| 1 | Human Resources |
| 2 | Engineering |
脚本与数据
SQL-- 创建Departments表
CREATE TABLE Departments (
DepartmentID INT PRIMARY KEY,
DepartmentName VARCHAR(100)
);
-- 插入Departments表数据
INSERT INTO Departments (DepartmentID, DepartmentName)
VALUES (1, 'Human Resources'),
(2, 'Engineering');
-- 创建Employees表
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(100),
LastName VARCHAR(100),
Position VARCHAR(100),
DepartmentID INT,
FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID)
);
-- 插入Employees表数据
INSERT INTO Employees (EmployeeID, FirstName, LastName, Position, DepartmentID)
VALUES (1, 'John', 'Doe', 'Manager', 1),
(2, 'Jane', 'Smith', 'Developer', 2),
(3, 'Emily', 'Clark', 'Designer', 2);
创建一个视图,它展示了员工的全名和他们所在的部门名称。
SQLCREATE VIEW vw_EmployeeDetails AS
SELECT
e.EmployeeID,
(e.FirstName + ' ' + e.LastName) AS FullName,
d.DepartmentName
FROM Employees e
JOIN Departments d ON e.DepartmentID = d.DepartmentID;
GO
查询刚刚创建的 vw_EmployeeDetails 视图。
SQLSELECT *
FROM vw_EmployeeDetails;
这个查询将返回如下结果:
| EmployeeID | FullName | DepartmentName |
|---|---|---|
| 1 | John Doe | Human Resources |
| 2 | Jane Smith | Engineering |
| 3 | Emily Clark | Engineering |

更新视图以添加额外的列,例如员工的职位。
SQLALTER VIEW vw_EmployeeDetails AS
SELECT
e.EmployeeID,
(e.FirstName + ' ' + e.LastName) AS FullName,
e.Position,
d.DepartmentName
FROM Employees e
JOIN Departments d ON e.DepartmentID = d.DepartmentID;
GO
虽然视图本身不存储数据,但在某些情况下,你可以通过视图更新基础表的数据。这通常需要视图是可更新的,即它必须满足一定的条件。
SQLUPDATE vw_EmployeeDetails
SET Position = 'Senior Developer'
WHERE EmployeeID = 2;
这将更新 Employees 表中 EmployeeID 为 2 的记录,将其职位改为 'Senior Developer'。
创建一个视图,它展示了每个部门的员工数量。
SQLCREATE VIEW vw_DepartmentEmployeeCount AS
SELECT
d.DepartmentName,
COUNT(e.EmployeeID) AS EmployeeCount
FROM Departments d
LEFT JOIN Employees e ON d.DepartmentID = e.DepartmentID
GROUP BY d.DepartmentName;
GO
查询这个视图:
SQLSELECT *
FROM vw_DepartmentEmployeeCount;
结果可能如下:
| DepartmentName | EmployeeCount |
|---|---|
| Human Resources | 1 |
| Engineering | 2 |

视图是 SQL Server 中一个强大的特性,它可以帮助管理复杂的查询、提升安全性和数据抽象。合理使用视图可以大大提升数据库的可维护性和可用性。在设计视图时,要确保它们的逻辑清晰且性能高效,以便用户可以像使用普通表一样轻松地使用它们。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!