使用CREATE VIEW创建视图

来源:互联网 发布:马克安东尼 知乎 编辑:程序博客网 时间:2024/05/29 04:58

13.1 使用CREATE VIEW创建视图(2)

代码13-2 创建视图列出那些居住在有出版社的城市的作者。注意视图使用了列名au_city和pub_city。重命名这些列避免了两列从基础表继承相同的列名city

  1. CREATE VIEW cities  
  2.   (au_id, au_city, pub_id, pub_city)  
  3.   AS 
  4.   SELECT a.au_id, a.city, p.pub_id, p.city  
  5.     FROM authors a  
  6.     INNER JOIN publishers p  
  7.       ON a.city = p.city; 

代码13-3 创建视图,按某一出版社图书的不同类型列出总收入(=价格×销量)。因为对数学表达式显式命名而不是让DBMS分配默认名,这个视图在以后会很容易查询

  1. CREATE VIEW revenues  
  2.   (Publisher, BookType, Revenue)  
  3.   AS 
  4.   SELECT pub_id, type, SUM(price * sales)  
  5.     FROM titles  
  6.     GROUP BY pub_id, type; 

代码13-4 为使打印作者邮寄标签变得容易而创建视图。注意程序在SELECT子句中而不是CREATE VIEW子句中指定列名

  1. CREATE VIEW mailing_labels  
  2.   AS 
  3.   SELECT 
  4.       TRIM(au_fname || ' ' || au_lname)  
  5.         AS 'address1',  
  6.       TRIM(address)  
  7.         AS 'address2',  
  8.       TRIM(city) || ', ' || TRIM(state) ||  
  9.         ' ' || TRIM(zip)  
  10.         AS 'address3' 
  11.     FROM authors; 

代码13-5 创建列出作者A02和A05的姓及两个人所写(或合写)图书的视图。注意这个语句使用了嵌套视图,它引用代码13-1创建的视图au_names。

  1. CREATE VIEW au_titles (LastName, Title)  
  2.   AS 
  3.   SELECT an.au_lname, t.title_name  
  4.     FROM title_authors ta  
  5.     INNER JOIN au_names an  
  6.       ON ta.au_id = an.au_id  
  7.     INNER JOIN titles t  
  8.       ON t.title_id = ta.title_id  
  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 au_titles  
  2.   (LastName, Title)  
  3.   AS 
  4.   SELECT an.au_lname, t.title_name  
  5.     FROM au_names an  
  6.     INNER JOIN (titles t  
  7.     INNER JOIN title_authors ta  
  8.       ON t.title_id = ta.title_id)  
  9.       ON an.au_id = ta.au_id  
  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 cities  
  2.   (au_id, au_city, pub_id, pub_city)  
  3.   AS 
  4.   SELECT a.au_id, a.city,  
  5.       p.pub_id, p.city  
  6.     FROM authors a, publishers p  
  7.     WHERE a.city = p.city; 

对于代码13-5:

  1. CREATE VIEW au_titles  
  2.   (LastName, Title)  
  3.   AS 
  4.   SELECT an.au_lname, t.title_name  
  5.     FROM title_authors ta,  
  6.       au_names an, titles t  
  7.     WHERE ta.au_id = an.au_id  
  8.       AND t.title_id = ta.title_id  
  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只执行对当前视图的检查。