視圖的創建和使用


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM