Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 创建数据库 » 使用数据库对象

 

使用常规视图

浏览数据时,查询对一个或多个数据库对象进行操作,并产生一个结果集。与基表类似,查询的结果集具有列和行。视图为特定的查询指定一个名称,并在数据库系统表中保存定义。

假设您经常需要列出每个部门的雇员数。您可以使用以下语句得到该列表:

SELECT DepartmentID, COUNT(*)
FROM Employees
GROUP BY DepartmentID;

您可以使用 Sybase Central 或 Interactive SQL 创建包含此语句结果的视图。

常规视图 SELECT 语句的限制

对可用作常规视图的 SELECT 语句有一些限制。特别是您不能在 SELECT 查询中使用 ORDER BY 子句。关系表的一个特性是行或列的顺序没有特殊意义,而使用 ORDER BY 子句将在视图的行上强加顺序。可以在视图定义中使用 GROUP BY 子句、子查询和连接。

要规划一个视图,可以调整 SELECT 查询本身,直到其以所需格式提供完全符合需要的结果。调整好 SELECT 语句之后,即可在查询前面添加一个短语来创建视图:

CREATE VIEW view-name AS query;
更新常规视图

如果定义视图的查询说明是可更新的,则可以使用 UPDATE、INSERT 或 DELETE 语句对视图进行更新。如果在视图的查询说明中其定义包括以下内容中的任何一个,则将视图视为固有不可更新

  • UNION 子句

  • DISTINCT 子句

  • GROUP BY 子句

  • FIRST 或 TOP 子句

  • 集合函数

  • 当 ansi_update_constraints 选项设置为 'Strict' 或 'Cursor' 时,FROM 子句中有多个表。请参见ansi_update_constraints 选项 [兼容性]

  • 当 ansi_update_constraints 选项设置为 'Strict' 或 'Cursor' 时,存在 ORDER BY 子句。请参见ansi_update_constraints 选项 [兼容性]

  • 所有 select-list 项都不是基表列

复制常规视图

在 Sybase Central 中,您可以在数据库之间复制视图。若要执行此操作,请在 Sybase Central 的右窗格中选择视图,然后将其拖到另一个已连接数据库的 [视图] 文件夹中。这样即会创建一个新视图,原始视图的定义会复制到其中。请注意,只有视图定义会复制到新视图中,其它视图属性(例如权限)不会随之复制。

使用 WITH CHECK OPTION 选项

WITH CHECK OPTION 子句可用于控制在通过视图更新基表或在其中插入内容时所更改的数据。以下示例对此进行说明。

执行以下语句以创建带有 WITH CHECK OPTION 子句的 SalesEmployees 视图。

CREATE VIEW SalesEmployees AS
   SELECT EmployeeID, GivenName, Surname, DepartmentID
   FROM Employees
   WHERE DepartmentID = 200
   WITH CHECK OPTION;

选择查看此视图的内容,如下所示:

SELECT * FROM SalesEmployees;
EmployeeID GivenName Surname DepartmentID
129 Philip Chin 200
195 Marc Dill 200
299 Rollin Overbey 200
467 James Klobucher 200
... ... ... ...

接下来,尝试将 Philip Chin 的 DepartmentID 更新为 400:

UPDATE SalesEmployees
SET DepartmentID = 400 
WHERE EmployeeID = 129;

由于指定了 WITH CHECK OPTION,数据库服务器会计算更新操作是否违反视图定义中的规则(在本例中,为 WHERE 子句中的表达式)。该语句将失败(DepartmentID 必须为 200),数据库服务器将返回错误:"在基本表 'Employees' 中插入/更新时 WITH CHECK OPTION 违规。"

如果未在视图定义中指定 WITH CHECK OPTION,更新操作则会继续,用新值修改 Employees 表,进而使 Philip Chin 从视图中消失。

如果创建一个引用 SalesEmployees 视图的视图(例如 View2),那么即使在定义 View2 时未使用 WITH CHECK OPTION 子句,在 View2 上所做的任何更新或插入只要导致 SalesEmployees 上的 WITH CHECK OPTION 条件失败就都会被拒绝。

另请参见

常规视图状态
创建常规视图
变更常规视图
删除常规视图
启用和禁用常规视图
浏览常规视图中的数据
查看系统表数据