创建视图()
下面的视图将返回位于书柜顶层(#)书架中价格最贵的前本图书的名称该示例使用了Microsoft SQL Server语法(它支持在视图中使用ORDER BY子句)
CREATE VIEW vwTopbooksOnthShelf
AS
SELECT TOP
loc_position_left AS position
bk_title AS title
bk_id
FROM location INNER JOIN books
ON locationfk_bk_loc = booksbk_id
WHERE loc_shelf =
ORDER BY bk_price DESC;
运行视图中的SELECT语句将返回数据的一个子集它只有个列限制为最顶部的条记录并且按照BK_PRICE列排序(尽管通过该视图无法访问BK_PRICE列)
SELECT * FROM vwTopbooksOnthShelf;
position title bk_id
Wiley Pathways: Introduction to Database Management
SQL Bible
SQL Functions: Programmers Reference
( row(s) affected)
使用视图抽取数据不仅可以隐藏底层数据模型的复杂性使数据对用户更加友好而且还可以拒绝访问未通过视图暴露出来的行和列从而为数据访问提供一种安全机制例如如果想让用户能够查询位于第个书架中价格最贵的前本图书但是又不洩漏图书的实际价格那么上面例子中的视图可以实现这样的功能即使BK_PRICE列存在于底层的表中只有查询该视图(vwTopbooksOnthShelf视图)权限的用户也永远无法看到图书的价格或是查询出价格排名第位的图书
试一试用视图包装复杂性
下面将构造一个相对比较复杂的查询其中包含了多个JOIN语句和一个GROUP BY子句以查找用指定搜索标志例如SQL标记的图书并将其按照出版年份进行分组将该查询包装到一个视图中然后观察如何使用视图向用户隐藏底层的复杂性该示例使用Microsoft SQLServer创建但在本书介绍的其他RDBMS中无须任何修改也能正常运行
() 连接到RDBMS打开New Query窗口
() 在查询窗口中输入下面的代码并单击Execute按钮
CREATE VIEW vwOneComplexView
AS
SELECT bk_title AS title
bk_published_year AS pub_year
locloc_shelf
FROM books bk INNER JOIN books_authors ba
ON bkbk_id = babk_id
INNER JOIN authors au
ON baau_id = auau_id
INNER JOIN location loc
ON bkbk_id = locfk_bk_loc
INNER JOIN search_books sb
ON sbbk_id = bkbk_id
INNER JOIN searchTags st
ON sttag_id = sbtag_id
WHERE locloc_shelf =
AND sttag_value IN (SQL)
GROUP BY
bk_published_year
bk_title
bk_price
loc_shelf
() 确认该命令是否执行成功以及是否确实创建了vwOneComplexView视图
() 从查询窗口中删除代码输入下面的代码执行一个新的查询
SELECT * FROM vwOneComplexView
ORDER BY title;
title pub_year loc_shelf
Microsoft SQL Server Weekend Crash Course
SQL Bible
SQL Functions: Programmers Reference
Wiley Pathways: Introduction to Database Management
( row(s) affected)
示例说明
该视图使用INNER JOIN语法连接了个表另外它强加了两个限制一是仅搜索标记为SQL的图书二是仅搜索位于顶层书架(第个书架)中的图书同时按照BOOKS表的BK_PUBLISHED_YEAR列(以及其他个列)进行分组通过将这些复杂性包装在一个视图中就可以简化业务用户需要运行的查询并同时实施某些业务和安全规则如果对该视图仅有SELECT权限那么用户就不可能查询到视图指定搜索条件之外的图书记录只有以SQL标记并且位于第个书架中的图书才会出现在视图的结果集中用户可以使用ORDER BY子句对视图的结果进行排序只需要通过视图暴露的别名就可以引用视图在上面对该视图的查询中使用了ORDER BY子句按照TITLE列对查询视图的结果进行了排序该ORDER BY子句将覆盖在定义视图的语法中GROUP BY子句产生的默认顺序
返回目录SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
数据仓库与数据挖掘培训视频教程