13.1 使用CREATE VIEW创建视图(2)
代码13-2 创建视图列出那些居住在有出版社的城市的作者。注意视图使用了列名au_city和pub_city。重命名这些列避免了两列从基础表继承相同的列名city
1. CREATE VIEW
2. (au_id, au_city, pub_id, pub_city)
3. AS
4. SELECT
5. FROM
6. INNER JOIN
7. ON
代码13-3 创建视图,按某一出版社图书的不同类型列出总收入(=价格×销量)。因为对数学表达式显式命名而不是让DBMS分配默认名,这个视图在以后会很容易查询
1. CREATE VIEW
2. (Publisher, BookType, Revenue)
3. AS
4. SELECT pub_id, type, SUM(price * sales)
5. FROM
6. GROUP BY
代码13-4 为使打印作者邮寄标签变得容易而创建视图。注意程序在SELECT子句中而不是CREATE VIEW子句中指定列名
1. CREATE VIEW
2. AS
3. SELECT
4. ' '
5. AS 'address1',
6. TRIM(address)
7. AS 'address2',
8. ', '
9. ' '
10. AS 'address3'
11. FROM
代码13-5 创建列出作者A02和A05的姓及两个人所写(或合写)图书的视图。注意这个语句使用了嵌套视图,它引用代码13-1创建的视图au_names。
1. CREATE VIEW
2. AS
3. SELECT
4. FROM
5. INNER JOIN
6. ON
7. INNER JOIN
8. ON
9. 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,输入:
1. CREATE VIEW
2. (LastName, Title)
3. AS
4. SELECT
5. FROM
6. INNER JOIN
7. INNER JOIN
8. ON
9. ON
10. 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输入:
1. CREATE VIEW
2. (au_id, au_city, pub_id, pub_city)
3. AS
4. SELECT
5. p.pub_id, p.city
6. FROM
7. WHERE
对于代码13-5:
1. CREATE VIEW
2. (LastName, Title)
3. AS
4. SELECT
5. FROM
6. au_names an, titles t
7. WHERE
8. AND
9. 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只执行对当前视图的检查。