13.1 使用CREATE VIEW创建视图(2)
代码13-2 创建视图列出那些居住在有出版社的城市的作者。注意视图使用了列名au_city和pub_city。重命名这些列避免了两列从基础表继承相同的列名city
- CREATE VIEW cities
- (au_id, au_city, pub_id, pub_city)
- AS
- SELECT a.au_id, a.city, p.pub_id, p.city
- FROM authors a
- INNER JOIN publishers p
- ON a.city = p.city;
代码13-3 创建视图,按某一出版社图书的不同类型列出总收入(=价格×销量)。因为对数学表达式显式命名而不是让DBMS分配默认名,这个视图在以后会很容易查询
- CREATE VIEW revenues
- (Publisher, BookType, Revenue)
- AS
- SELECT pub_id, type, SUM(price * sales)
- FROM titles
- GROUP BY pub_id, type;
代码13-4 为使打印作者邮寄标签变得容易而创建视图。注意程序在SELECT子句中而不是CREATE VIEW子句中指定列名
- CREATE VIEW mailing_labels
- AS
- SELECT
- TRIM(au_fname || ' ' || au_lname)
- AS 'address1',
- TRIM(address)
- AS 'address2',
- TRIM(city) || ', ' || TRIM(state) ||
- ' ' || TRIM(zip)
- AS 'address3'
- FROM authors;
代码13-5 创建列出作者A02和A05的姓及两个人所写(或合写)图书的视图。注意这个语句使用了嵌套视图,它引用代码13-1创建的视图au_names。
- CREATE VIEW au_titles (LastName, Title)
- AS
- SELECT an.au_lname, t.title_name
- FROM title_authors ta
- INNER JOIN au_names an
- ON ta.au_id = an.au_id
- INNER JOIN titles t
- ON t.title_id = ta.title_id
- WHERE an.au_id in ('A02','A05');
'提示
不能创建临时视图。视图和临时表的持久性是不同的。视图存在于SQL语句的生存期,临时表存在于进程的生存期,参见11.10节。
标准SQL没有ALTER VIEW语句。如果在视图创建之后,基础表或视图发生了改变,就要删除并重建这个视图。然而,Microsoft SQL Server、Oracle、DB2、MySQL和PostgreSQL都支持非标准的ALTER VIEW语句。
在Microsoft Access中运行CREATE VIEW语句时,视图将作为一个查询对象出现在数据库窗口。为了运行代码13-4,将每个||变为+,参见5.4节的DBMS提示。为了运行代码13-5,输入:
- CREATE VIEW au_titles
- (LastName, Title)
- AS
- SELECT an.au_lname, t.title_name
- FROM au_names an
- INNER JOIN (titles t
- INNER JOIN title_authors ta
- ON t.title_id = ta.title_id)
- ON an.au_id = ta.au_id
- WHERE an.au_id IN ('A02','A05');
为了在Microsoft SQL Server中运行代码13-1至代码13-5,要删除每个语句的结束分号。另外,为了运行代码13-4,要将每一个||变为+,将每一个TRIM(x)变为LTRIM(RTRIM(x)),参见5.4节和5.7节中的DBMS提示。
为了在Oracle 8i和之前的版本运行代码13-2和代码13-5,要使用WHERE语法而不是JOIN语法。对于代码13-2输入:
- CREATE VIEW cities
- (au_id, au_city, pub_id, pub_city)
- AS
- SELECT a.au_id, a.city,
- p.pub_id, p.city
- FROM authors a, publishers p
- WHERE a.city = p.city;
对于代码13-5:
- CREATE VIEW au_titles
- (LastName, Title)
- AS
- SELECT an.au_lname, t.title_name
- FROM title_authors ta,
- au_names an, titles t
- WHERE ta.au_id = an.au_id
- AND t.title_id = ta.title_id
- AND an.au_id in ('A02','A05');
为了在DB2中运行代码13-4,应将所有TRIM(x)变为LTRIM(RTRIM(x)),参见5.7节的DBMS提示。
为了在MySQL中运行代码13-4,应使用CONCAT()函数而不是联接操作符||,参见5.4节的DBMS提示。MySQL 5.0和之后版本支持视图,之前版本不能运行本节的代码。(为了在之前版本隐藏数据,可使用MySQL的权限系统来限制列的访问。)
在Microsoft SQL Server、Oracle、DB2、MySQL和PostgreSQL中,创建视图时可以加入可选的WITH [CASCADED | LOCAL] CHECK OPTION子句。这个子句只用于可修改的视图,并确保只有能够被视图读取的数据可以被插入、更新或删除,参见13.3节。如果视图显示来自纽约州的作者,就不可能通过视图插入、更新或删除非纽约州的作者。CASCADED和LOCAL选项只能用于嵌套视图。CASCADED执行对当前视图和所有引用视图的检查。LOCAL只执行对当前视图的检查。