1、視圖數據庫
本質上至關於一張「虛擬表」,可看成獨立的一張表進行操做(增、刪、改、查)數組
做用:架構
a)可經過權限控制,只將「表中的少數列」暴露給數據庫用戶,而不讓該用戶直接操縱數據庫中「實際表」ide
b)可將經常使用的,較複雜的SQL在數據庫中預先定義好,使得外部調用不用每次都編寫複雜的SQL語句,直測試
接看成一張「虛擬表」來調用便可
等等,據說大家都很喜歡我~那給個當心心00~,爲了表揚大家,戳這裏有大家想要的完整zlspa
Customers表中原始數據:3d
Orders表中的原始數據:code
建立「查找運費在40到60之間的客戶信息」的視圖:對象
1 use edisondb; 2 3 if object_id('FortyToSixtyFreightCusts')is not null 4 drop view FortyToSixtyFreightCusts 5 go 6 create view FortyToSixtyFreightCusts 7 as 8 9 select C.custid as '客戶ID',C.name as '客戶名', C.age as '年齡' 10 from customers as C 11 where Exists( 12 select * 13 from Orders as O 14 where C.custid=O.custid and (O.freight between 40 and 60) 15 );
建立成功以後:blog
將該視圖看成一張「獨立的表」進行查詢操做:
1 use edisondb; 2 select 客戶ID,客戶名,年齡 from FortyToSixtyFreightCusts;
執行結果以下:
關於SCHEMABINDING選項的一些說明:
做用:使得視圖中引用的對象不能被刪除,被引用的列不能被刪除或者修改(防止:因爲引用的列等被刪除,形成視圖沒法使用的狀況)
修改視圖,使其指定SCHEMABINDING選項:
1 alter view FortyToSixtyFreightCusts with schemabinding 2 as 3 4 select C.custid as '客戶ID',C.name as '客戶名', C.age as '年齡' 5 from dbo.customers as C 6 where Exists( 7 select O.custid 8 from dbo.Orders as O 9 where C.custid=O.custid and (O.freight between 40 and 60) 10 ); 11 go
(以上表名,必定要以「dbo.」的形式出現,不然會出現:名稱 'customers' 對於架構綁定無效的錯誤)*
嘗試刪除Customers表中的age列:
1 use edisondb; 2 alter table customers drop column age;
執行結果:
**
**
附:可經過執行如下語句查看SQL Server中某對象的定義:
1 exec sp_helptext 'dbo.FortyToSixtyFreightCusts';
執行結果以下:
2、約束
1)檢查約束【一般認爲的「約束」】
建立檢查約束:
1 use edisondb; 2 alter table staffinfo 3 add constraint ck_StaffID check(StaffID between 5000 and 5999)
成功建立以後:
此時執行非法的插入行:
1 use edisondb; 2 insert into StaffInfo(StaffID,StaffName,Department) 3 values(6000,'Wade','Dev');
執行結果爲:
2)惟一性約束
StaffInfo表原始數據:
建立惟一性約束:
1 use edisondb; 2 alter table staffinfo 3 add constraint uq_StaffName unique(StaffName);
成功建立後:
注:惟一性約束建立成功後,是在「鍵」中顯示,而非「約束」中
此時執行非法的插入行:
1 use edisondb; 2 insert into StaffInfo(StaffID,StaffName,Department) 3 values(5003,'keven','Dev');
執行結果爲:
說明:要使某列的值惟一,既能夠經過主鍵來實現,也能夠經過「惟一性約束」來實現
3)默認約束
建立默認約束:
1 use edisondb; 2 alter table staffinfo 3 add constraint df_Department default('部門待定') for Department;
成功建立後:
執行行插入:
1 use edisondb; 2 insert into StaffInfo(StaffID,StaffName) 3 values(5003,'Murphy');
執行結果爲:
注:主鍵和外鍵也屬於一種約束
3、索引
1.彙集索引
對應於數據庫中數據文件的物理存儲方式,每張表只能創建一個
適用場合:a)select次數遠大於insert、update的次數(insert、update時須要移動其餘數據文件的物理位置)
b)創建聚合索引的列,既不能絕大多數都相同,又不能只有極少數相同(可從相似二維數組查找時間複雜的方式去理解)
建立一個NewOrders表,用於對索引的測試:
1 use edisondb; 2 3 create table NewOrders 4 ( orderID numeric(18, 0) identity(1,1) not null, 5 custID numeric(18, 0) not null, 6 empID numeric(18, 0) not null, 7 tradeDate datetime not null 8 );
在NewOrders表中插入10萬條測試數據:
1 use edisondb; 2 set nocount on 3 declare @i numeric(18,0) 4 declare @custid numeric(18,0) 5 declare @empid numeric(18,0) 6 declare @tradeDateTime datetime 7 begin 8 set @i=0 9 set @custid=100000 10 set @empid=500000 11 set @tradeDateTime=getdate() 12 while @i<100000 13 begin 14 insert into neworders(custID,empID,tradeDate) 15 values(@custid,@empid,@tradeDateTime) 16 set @i=@i+1 17 set @custid=@custid+1 18 set @empid=@empid+1 19 if (@i%1000)=0 20 set @tradeDateTime=dateadd(day,1,@tradeDateTime) 21 end 22 end 23 print 'Insert data over'
插入數據成功以後,NewOrders表中的部分數據以下:
進行查詢測試:
1 use edisondb; 2 declare @startDT datetime 3 set @startDT=getdate() 4 select * from neworders where tradedate> dateadd(day,10,'2011-9-20') 5 print '耗時:'+replace(str(datediff(ms,@startDT,getdate())),' ','')+' 毫秒'
執行結果爲:
如今對創建「彙集索引」的表進行測試
刪除表中全部行:
1use edisondb 2truncate table neworders;
在NewOrders表的tradeDate列上建立「彙集索引」:
1use edisondb 2create clustered index tradeDate_NewOrders on NewOrders(tradeDate)
執行結果爲:
再次插入10萬行數據後,進行測試,結果爲:
聚合索引使用的關鍵:在合適的列創建(一般爲:最多用做查詢條件的列)