Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4524472
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: Mysql/postgreSQL

2011-08-07 22:00:42

视图和表一样,也可用于查询

1.什么是视图 ?

   视图是存储在数据库中的用于查询的SQL语句,使用视图主要用于两种原因:

1. 安全原因。视图可以隐藏一些数据,如对于社会保险金表,可以用视图只显示
姓名、地址,而不显示社会保险好和工资数等。
2. 另一个原因是可使复杂的查询易于理解和使用。


2. 视图的语法

   mysql在处理视图时有两种算法,分别为 merge 和 temptable, 可以指定使用哪种算法。 merge是指在处理涉及到视图的操作时,将对视图额操作根据视图的定义进行展开,优点类似于C语言中的宏展开。

    mysql>pager more;
  1. mysql> ? create view
  2. Name: 'CREATE VIEW'
  3. Description:
  4. Syntax:
  5. CREATE
  6.     [OR REPLACE]
  7.     [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
  8.     [DEFINER = { user | CURRENT_USER }]
  9.     [SQL SECURITY { DEFINER | INVOKER }]
  10.     VIEW view_name [(column_list)]
  11.     AS select_statement
  12.     [WITH [CASCADED | LOCAL] CHECK OPTION]
   该语句能创建新的视图,如果给定了OR REPLACE子句,该语句还能替换已有的视图。 select_statement 是一种SELECT语句,它给定了视图的定义。该语句可从基表或其他视图进行选择。

   该语句要求具有针对视图的 CREATE VIEW 权限,以及针对有SELECT语句选择的每列上的某些权限。对于在 SELECT语句中其他地方使用的列,必须具有select权限。如果还有 OR REPLACE 子句,必须在视图上具有DROP权限。

    视图属于数据库。在默认情况下,将在当前数据库创建新视图。要想在给定数据库中明确的创建视图,创建时,应将名称指定为 db_name.view_name
如:
  1. mysql> create view test.v as select * from t
  
   表和视图共享数据库中相同的名称空间,因此,数据库不能包含具有相同名称的表和视图。

   视图必须具有唯一的列名。
  
   视图创建成功后,如果需要修改,可以使用alter view修改
  1. mysql> ? alter view
  2. Name: 'ALTER VIEW'
  3. Description:
  4. Syntax:
  5. ALTER
  6.     [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
  7.     [DEFINER = { user | CURRENT_USER }]
  8.     [SQL SECURITY { DEFINER | INVOKER }]
  9.     VIEW view_name [(column_list)]
  10.     AS select_statement
  11.     [WITH [CASCADED | LOCAL] CHECK OPTION

     删除视图

  1. mysql> ? drop view
  2. Name: 'DROP VIEW'
  3. Description:
  4. Syntax:
  5. DROP VIEW [IF EXISTS]
  6.     view_name [, view_name] ...
  7.     [RESTRICT | CASCADE]

    可以使用关键字 IF EXISTS 来防止因存在的视图而出错

    此外,还可以通过下面的语句查看 view_name 的完整定义

  1. mysql> show create view view_name

3. 视图的使用 ?  


    对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)、删除。当通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动的反映到视图中。

   在mysql中,对视图的使用有如下规则:
1. 视图必须有唯一命名
2. 在mysql中视图的数量没有限制
3. 创建视图必须从管理员那里获得必要的权限
4. 视图支持嵌套,也就是说可以利用其他视图检索出来的数据创建新的视图
5. 在视图中可以使用 OREDR BY,但是如果视图内已经使用该排序子句,则视图的ORDER BY 将覆盖前面的 ORDER BY。
6. 视图不能索引,也不能关联触发器或默认值。
7  视图可以和表同时使用

现在假设我们有一个产品表product和一个购买记录表purchase

  1. ywx@ywx:/opt/mysql5151$ sudo ./bin/mysqld_safe --defaults-file=./my.cnf --user=ywx &
  2. ywx@ywx:/opt/mysql5151$ sudo ./bin/mysql --defaults-file=./my.cnf


  1. mysql> create table product(product_id int not null, name varchar(50) not null,price double not null);
  2. Query OK, 0 rows affected (0.06 sec)

  3. mysql> insert into product values(1,'apple',5.5);
  4. Query OK, 1 row affected (0.40 sec)

  1. mysql> create table purchase(id int not null, product_id int not null, qty int not null default 0, gen_tim datetime not null);
  2. Query OK, 0 rows affected (0.04 sec)

  3. mysql> insert into purchase values(1,1,10,now());
  4. Query OK, 1 row affected (0.00 sec)

创建视图 purchase_detail,用于查询购买的详细信息:

  1. mysql> create view purchase_detail as select product.name as name,product.price as price,purchase.qty as qty,product.price * purchase.qty as total_value from product,purchase where product.product_id=purchase.product_id;
  2. Query OK, 0 rows affected (0.02 sec)

查看视图
  1. mysql> select * from purchase_detail;
  2. +-------+-------+-----+-------------+
  3. | name | price | qty | total_value |
  4. +-------+-------+-----+-------------+
  5. | apple | 5.5 | 10 | 55 |
  6. +-------+-------+-----+-------------+
  7. 1 row in set (0.36 sec)


删除视图

  1. mysql> drop view if exists pruchase_detail;
  2. Query OK, 0 rows affected, 1 warning (0.00 sec)

阅读(13202) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~