“視圖是由基於一個或多個表的一個查詢所定義的虛擬表,它將查詢的具體定義保存起來,視圖不包含任何數據。” 前面這句是我在網上找的視圖的定義,對於初接觸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子句引用同一個表