Hi!请登陆

mysql视图简介

2020-10-27 31 10/27

一.视图概述

视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成.
对其中所引用的基础表来说,视图的作用类似于筛选.定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图.通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少.
视图是存储在数据库中的查询的sql 语句,它主要出于两种原因:安全原因,视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用.

二.创建视图 create view

1.语法

create [or replace] [algorithm = {undefined | merge | temptable}] view [db_name.]view_name [(column_list)] as select_statement [with [cascaded | local] check option]

通过该语句可以创建视图,若给定了[or replace],则表示当已具有同名的视图时,将覆盖原视图.select_statement是一个查询语句,这个查询语句可从表或其它的视图中查询.视图属于数据库,因此需要指定数据库的名称,若未指定时,表示在当前的数据库创建新视图.
表和数据库共享数据库中相同的名称空间,因此,数据库不能包含相同名称的表和视图,并且,视图的列名也不能重复.

2.使用举例

本例创建一个产品表(product)和一个购买记录表(purchase),再通过视图purchase_detail查询出购买的详细信息.

create table product
(
    product_id int not null,
    name varchar(50) not null,
    price double not null
);
insert into product values(1, 'apple ', 5.5);
create table purchase
(
    id int not null,
    product_id int not null,
    qty int not null default 0,
    gen_time datetime not null
);
insert into purchase values(1, 1, 10, now());
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;

创建成功后,输入:select * from purchase_detail;
运行效果如下:

+-------+-------+-----+-------------+
| name | price | qty | total_value |
+-------+-------+-----+-------------+
| apple | 5.5 | 10 | 55 |
+-------+-------+-----+-------------+
1 row in set (0.01 sec)

3.注意事项

创建视图存在如下注意事项:

(1) 运行创建视图的语句需要用户具有创建视图(crate view)的权限,若加了[or replace]时,还需要用户具有删除视图(drop view)的权限;
(2) select语句不能包含from子句中的子查询;
(3) select语句不能引用系统或用户变量;
(4) select语句不能引用预处理语句参数;
(5) 在存储子程序内,定义不能引用子程序参数或局部变量;
(6)在定义中引用的表或视图必须存在.但是,创建了视图后,能够舍弃定义引用的表或视图.要想检查视图定义是否存在这类问题,可使用check table语句;
(7) 在定义中不能引用temporary表,不能创建temporary视图;
(8) 在视图定义中命名的表必须已存在;
(9) 不能将触发程序与视图关联在一起;
(10) 在视图定义中允许使用order by,但是,如果从特定视图进行了选择,而该视图使用了具有自己order by的语句,它将被忽略.

三.修改视图 alter view

1.语法

alter [algorithm = {undefined | merge | temptable}] view view_name [(column_list)] as select_statement [with [cascaded | local] check option]

该语句用于更改已有视图的定义.其语法与create view类似.

2.使用举例

  1. 将上一小节中中创建的视purchase_detail进行修改,去掉qty列,语句如下:

    alter view purchase_detail as select product.name as name, product .price as price, product .price * purchase.qty as total_value from product, purchase where product.product_id = purchase.product_id;

此时通过语句:select * from purchase_detail;对视图进行查询时.

Tag:

相关推荐