MSSQLSERVER數據庫- 視圖

        “視圖是由基於一個或多個表的一個查詢所定義的虛擬表,它將查詢的具體定義保存起來,視圖不包含任何數據。” 前面這句是我在網上找的視圖的定義,對於初接觸MSSQLSERVER視圖的人,一眼讀過去,可能也不解其意,不過沒有關係,大概記住就行了,在實際使用過後再來看這句,你就知道他在講什麼了。

        視圖在操作上和數據表沒有什麼區別,但兩者的差異是在其本質上的。數據表是實際存儲記錄的地方,然而視圖並不是保存任何記錄,它存儲的實際上是查詢語句。相同的數據表,根據不同用戶的不同需求,可以創建不同的視圖。

        視圖的作用主要是用來查詢,但也可以對視圖進行增刪改的操作,對視圖的增刪改操作實際是通過視圖的變化引起基表數據的變化。這篇文章不會寫到對視圖的增刪改操作,因爲我認爲沒有必要對視圖進行這方面的操作,我現在的理解僅是將視圖作爲查詢操作,在實際應用上也是如此。

 

我們首先來看一下系統視圖

                                        (圖1)

從圖1我們可以看,MSSQL數據裏內置瞭如此之多的系統視圖。那麼這些視圖裏面存放的是什麼東西?

1、我們輸入SQL語句:

select * from sys.tables

結果顯示:

name object_id principal_id schema_id parent_object_id type type_desc create_date
student 133575514 NULL 1 0 U  USER_TABLE 2012-08-04 16:03:00.613
Employee 597577167 NULL 1 0 U  USER_TABLE 2012-08-04 16:53:40.557
comment 709577566 NULL 1 0 U  USER_TABLE 2012-08-05 21:25:56.637
article 741577680 NULL 1 0 U  USER_TABLE 2012-08-05 21:27:46.980
teacher 2121058592 NULL 1 0 U  USER_TABLE 2012-08-04 14:41:58.470

從name字段可以看過,我們把當前數據庫的全部表名都查找出來了。

2、我們輸入SQL語句:

select * from sys.databases

從name字段可以看過,我們把當前數據庫的全部數據庫名都查找出來了。

3、我們輸入SQL語句

select * from
INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='student'

結果顯示

TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION
MySchool dbo student sid 1
MySchool dbo student sname 2
MySchool dbo student sage 3
MySchool dbo student ssex 4
MySchool dbo student tid 5

我們可以從 COLUMN_NAME獲得student表的全部字段。

那麼你可能會問得到這些系統視圖有什麼用? 我實際用過一次,可以根據這些系統視圖所獲得的內容來做某種類型的代碼生成器。

SQL視圖的其他應用舉列:

--如果存在該數據庫那麼先把他刪除掉再創建 
if exists(select * from sys.database where name='test') 
    drop database test 
create database test 
 
--如果存在該表那麼先把他刪除掉再創建 
if exists(select * from sys.objects where name = 'test') 
    drop table test 
create table test 
( 
    tid int primary key identity(1,1), 
    tName nvarchar(50) null, 
    tAge int
) 
 
--爲該表創建一個年齡檢測約束,約束範圍在18-70歲之間,如果存在該約束則刪除後創建 
if exist(select * from sys.objects where name='UQ_TEST_TNAME'
    alter table test 
    drop constraint UQ_TEST_TNAME 
alter table test 
add constraint UQ_TEST_TNAME CHECK(tAge>=18 and tAge<=70) 

怎麼創建視圖

create view v_Student 
as
    select sname,sage from student 
      
select * from v_Student; 

創建好後就可當作一個表來使用  select * from v_Student

怎麼刪除視圖

if exists(select * from sys.objects where name='v_Student') 
    drop view v_Student 


怎麼修改視圖

alter view v_Student 
as
    select sname,sage from student where sid=1 


視圖的注意事項

  • 視圖不包括結合
  • 視圖不包括Group By子句
  • 視圖不包括Union語句
  • 視圖不包含對僞字段RowNum的任何引用
  • 視圖不包含任何組函數
  • 不能使用Distinct子句
  • Where子句包含的嵌套的表表達式不能與From子句引用同一個表
發佈了40 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章