分类: Mysql/postgreSQL
2012-03-06 09:05:47
一、视图的作用
(1).简单性。看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。
(2).安全性。通过视图用户只能查询和修改他们所能见到的数据。数据库中的其它数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上:使用权限可被限制在基表的行的子集上。
使用权限可被限制在基表的列的子集上。
使用权限可被限制在基表的行和列的子集上。
使用权限可被限制在多个基表的连接所限定的行上。
使用权限可被限制在基表中的数据的统计汇总上。
使用权限可被限制在另一视图的一个子集上,或是一些视图和基表合并后的子集上。
逻辑数据独立性。视图可帮助用户屏蔽真实表结构变化带来的影响。
二、视图的优点
(1)视图能简化用户的操作
(2)视图机制可以使用户以不同的方式查询同一数据
(3)视图对数据库重构提供了一定程度的逻辑独立性
(4)视图可以对机密的数据提供安全保护
三、视图的安全性
视图的安全性可以防止未授权用户查看特定的行或列,是用户只能看到表中特定行的方法如下:
1 在表中增加一个标志用户名的列;
2 建立视图,是用户只能看到标有自己用户名的行;
3 把视图授权给其他用户。
四、逻辑数据独立性
视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。
五.语法结构:
create view view_name
AS
select 语句
from ((table1 inner join table2
on (table1.filed1 = table2.filed1)
inner join table3
on (table1.filed2 = table3.filed1)
));
六.例子:
有三个表:tg_assets_info,employee,tg_assets_kind。表结构如下:
mysql> desc tg_assets_info;
+-----------+--------------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+-------------------+-------+
| as_num | varchar(20) | NO | | | |
| as_kind | int(4) | YES | | NULL | |
| as_model | varchar(20) | YES | | NULL | |
| as_status | tinyint(3) | YES | | NULL | |
| use_time | varchar(10) | YES | | NULL | |
| attach | varchar(100) | YES | | NULL | |
| user | int(10) | YES | | NULL | |
| remark | varchar(100) | YES | | NULL | |
| oper_time | timestamp | YES | | CURRENT_TIMESTAMP | |
| operator | varchar(20) | YES | | NULL | |
+-----------+--------------+------+-----+-------------------+-------+
10 rows in set (0.00 sec)
mysql> desc employee;
+---------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+----------------+
| employee_id | int(10) | NO | PRI | NULL | auto_increment |
| department_id | int(10) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| password | varchar(20) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| mobile | char(11) | YES | | NULL | |
| email | varchar(50) | YES | | NULL | |
| qq | varchar(15) | YES | | NULL | |
| position | char(1) | YES | | NULL | |
| team | tinyint(3) | YES | | NULL | |
+---------------+-------------+------+-----+---------+----------------+
11 rows in set (0.00 sec)
mysql> desc tg_assets_kind;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| id | int(4) | YES | | NULL | |
| as_kind_name | varchar(20) | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
创建一个视图:
create algorithm=undefined
view assets_view1
AS
select
tg_assets_info.as_num as as_num,
tg_assets_kind.as_kind_name as as_kind,
tg_assets_info.as_model as as_model,
tg_assets_info.as_status as as_status,
tg_assets_info.use_time as use_time,
employee.name as user,
tg_assets_info.oper_time as oper_time,
tg_assets_info.operator as operator,
tg_assets_info.attach as attach,
tg_assets_info.remark as remark
from ((tg_assets_info inner join tg_assets_kind
on (tg_assets_info.as_kind = tg_assets_kind.id)
inner join employee
on (tg_assets_info.user = employee.employee_id)
));