@big-bear
2016-04-01T04:04:01.000000Z
字数 1694
阅读 1149
数据库
以下是W3School给的定义:
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。
理解一下:
1.视图就是基于sql语句结果集的,虚拟的,可视化的表.
2.视图是包含行和列,跟真实表是一样的.
3.视图的数据来源于一个或者多个真实表,自己本身并没有存储的数据.
4.我们可以像操作真实表一样来操作视图表.
- 简单性。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次都指定全部的条件。
- 安全性。通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上。
- 逻辑数据独立性。视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。
- 性能。数据库必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也把它变成一个复杂的结合体,需要花费一定的时间。
- 修改限制。当用户试图修改视图的某些行时,数据库必须把它转化为对基本表的某些行的修改。对于简单视图来说,这是很方便的,但是,对于逻辑比较复杂的视图,可能是不可修改的。
首先视图因为修改限制的缺点,所以只能使用在业务逻辑比较简单的情况下:
- 当需要查询的数据是由来自多个真实表字段共同拼接而成的
- 当查询的数据集是从来源于多个不同的真实表
- 当你想要隐藏某些字段的时候以实现安全性或者满足某些安全性
CREATE VIEW VIEW_NAME(FIELD_1,FIELD_2,fIELD_3)
AS //as之后是一个普通的查询结果集,在构建视图前我们可以在先执行一下下面的语句确定一下正确与否
SELECT
A.FIELE_ONE,A.FIELD_TWO,A.FIELD_THREE
FROM TABLE_A AS A
UNION
B.FIELD_ONE,B.FIELD_TWO,B.FIELD_THREE
FROM TABLE_B AS B
需要注意的是:
- 视图是没有主键的,所以当我们用hibernate映射视图成一个PO的时候,需要使用hibernate的一个联合主键的功能(处理没有主键的表的时候通过多个字段共同来确定一条记录的唯一性)
- 构建视图的时候使用的SQL语句的性能调到最右
- 一个view最好不要嵌套另一个view,最多嵌套一层
- 调用视图的时候会调用返回所有行,所以where自句能加在视图内的时候,尽量不要加在视图外.
- 使用hibernate查询视图的时候就可以完全当视图是一张表正常使用hql语句.(从这也可以看出处理视图和表示数据库系统所做的事情,对外是透明的,所以对hibernate来时视图就是一张没有主键的数据表)
如果在使用过程中我们发现视图的结构需要变化,我们就需要通过以下的语句来对视图进行更新:
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
DROP VIEW view_name
参考以及相关知识:
http://www.cnblogs.com/CareySon/archive/2011/12/07/2279522.html
http://blog.csdn.net/tianjf0514/article/details/7854931
hibernate联合主键