视图的创建和使用
GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
https://cnsendnet.taobao.com
来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=2096
视图的创建和使用
一.视图的定义
视图是一种数据库对象,是从一个或者多个数据表或视图中导出的虚表,视图所对应的数据并不真正地存储在视图中,而是存储在所引用的数据表中,视图的结构和数据是对数据表进行查询的结果。视图在数据库开发过程中是非常重要的,对提高查询速度有很大的提高。因此我们的学会创建视图,并且有效的使用视图。
二.视图的优点
* 简化数据操作:视图可以简化用户处理数据的方式。
* 着重于特定数据:不必要的数据或敏感数据可以不出现在视图中。
* 视图提供了一个简单而有效的安全机制,可以定制不同用户对数据的访问权限。
* 提供向后兼容性:视图使用户能够在表的架构更改时为表创建向后兼容接口。
* 自定义数据:视图允许用户以不同方式查看数据。
* 导出和导入数据:可使用视图将数据导出到其他应用程序。
三.创建视图
语法:CREATE VIEW 视图名称 AS SELECT 列名称 FROM 表名称 WHERE 条件
四.创建动态视图
标准视图有一个严重的局限性,那就是标准视图不支持参数。俗话说“法网恢恢,疏而不漏”,呵呵,我们也可以变通的使用带参数的视图。实现方法是我们把一个用户定义的表值函数当作支持参数的动态视图使用:
CREATE FUNCTION fnTestView (@m_id int)
RETURNS TABLE
AS
RETURN (select * from 视图名称 where 条件=@m_id)
这样可以在Select语句的From子句中引用他们,用法:
Select * from fnTestView(2)
SQL临时表
临时表是建立在系统临时文件夹中的表,如果使用得当,完全可以像普通表一样进行各种操作,在VFP退出时自动被释放。
当工作在十分大的表上运行时,在实际操作中你可能会需要运行很多的相关查询,来获的一个大量数据的小的子集,不是对整个表运行这些查询。而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后对这些表运行查询。
创建MySQL临时表很容易,给正常的CREATE TABLE语句加上TEMPORARY关键字
Sql代码
CREATE TEMPORARY TABLE tmp_table ( name VARCHAR(10) NOT NULL, value INTEGER NOT NULL ) CREATE TEMPORARY TABLE tmp_table ( name VARCHAR(10) NOT NULL, value INTEGER NOT NULL )
临时表的应用
1)、当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中。
2)、程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。
SQL临时表
临时表有两种类型:本地表和全局表。在与首次创建或引用表时相同的 SQL Server 实例连接期间,本地临时表只对于创建者是可见的。当用户与 SQL Server 实例断开连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接都是可见的,当引用该表的所有用户都与 SQL Server 实例断开连接后,将删除全局临时表。
首先我们来熟悉下临时表的概念:
临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。
临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。
例如,如果创建了 employees 表,则任何在数据库中有使用该表的安全权限的用户都可以使用该表,除非已将其删除。如果数据库会话创建了本地临时表 #employees,则仅会话可以使用该表,会话断开连接后就将该表删除。如果创建了 ##employees 全局临时表,则数据库中的任何用户均可使用该表。如果该表在您创建后没有其他用户使用,则当您断开连接时该表删除。如果您创建该表后另一个用户在使用该表,则 SQL Server 将在您断开连接并且所有其他会话不再使用该表时将其删除。
conn.Execute("SELECT newscomment_user_id AS user_id, COUNT(*) AS counter INTO #userNewsComment1 " _
& " FROM newsComment GROUP BY newscomment_user_id ")
'把从newsComment中或的数据集合写入到临时表 #userNewsComment1 中
'newsComment是新闻评价表
Set rs = conn.Execute("SELECT TOP 10 a.user_id AS trueId, * FROM userInfo AS a INNER JOIN userPoint AS b " _
& " ON a.user_id = b.user_id INNER JOIN View_Company AS c ON a.user_id = c.user_id " _
& " LEFT OUTER JOIN #userNewsComment1 AS d ON d.user_id = a.user_id " _
& " WHERE user_isProvinceNewsShow = 1 " _
& placeCondition & " ORDER BY d.counter DESC ")
conn.execute("drop table #userNewsComment1")
'使用完记住删除临时表,这里是删除临时表对象
这里是把临时表运用上
1、临时表就是用户在创建表的时候添加了“#”前缀的表,其特点是根据进程独立。只有进程的拥有者有表的访问权限,其它用户不能访问该表;
2、不同的用户进程,创建的临时表虽然“名字”相同,但是这些表之间相互并不存在任何关系;在SQLSERVER中,通过特别的命名机制保证临时表的进程独立性。
3、定单和购买意向一般不会保存在真正的“临时表”中,而是实际的普通表,之所以称之为“临时表”,只是一种叫法而已。因为随着一个用户进程的结束,真正的临时表会自动清除,而定单和购买意向数据一般是定时清除,所以一定是保存在普通表中,具备数据的持久性特征(临时表最缺乏的就是数据的持久性)。
4、真正的临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此也提高了系统效率。
事务完毕或会话完毕数据自动清空,不必记得用完后删除数据。
数据当前会话期可见,其它的会话只能看到其结构,只能看到自己的数据,各会话的数据互不干扰。
如静态创建临时表t_tmp(a number primary key,b number)
用户A可以有数据 用户B可以有数据
1 2 1 2
2 3 3 4
3 4 6 7
4 5
A)select count(*) from t_emp; 结果为4(B的数据它看不到)
B)select count(*) from t_emp; 结果为3(A的数据它看不到)
它们有相同的两条记录,但由于数据只作用于当前会话期,所以primary key不会限制它们,只限制当前用户下的A唯一主键。
上述互不干扰特性可以用于处理中间计算过程,如果是常规表在同一时间仅能被一个会话操作,锁定资源拒绝被其它会话访问。
GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
https://cnsendnet.taobao.com
来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=2096