一、视图

实质上相当于一张“虚构表”,可当作独立的一张表进行操作(增、删、改、查)

      作用:

       a)可通过权限管制,只将“表中的多数列”裸露给数据库用户,而不让该用户间接操纵数据库中“理论表”

       b)可将罕用的,较简单的SQL在数据库中事后定义好,使得内部调用不必每次都编写简单的SQL语句,直

接当作一张“虚构表”来调用即可
等等,据说你们都很喜爱我~那给个小心心00~,为了褒扬你们,戳这里有你们想要的残缺zl

Customers表中原始数据:

Orders表中的原始数据:

创立“查找运费在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 );

创立胜利之后:

将该视图当作一张“独立的表”进行查问操作:

1 use edisondb; 2  select 客户ID,客户名,年龄 from FortyToSixtyFreightCusts;

   执行后果如下:

   对于SCHEMABINDING选项的一些阐明:

         作用:使得视图中援用的对象不能被删除,被援用的列不能被删除或者批改(避免:因为援用的列等被删除,造成视图无奈应用的状况)

 批改视图,使其指定SCHEMABINDING选项:

1 alter  view FortyToSixtyFreightCusts with schemabinding2  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';

执行后果如下:

二、束缚

   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');

   执行后果为:

  注:主键和外键也属于一种束缚

三、索引

  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万行数据后,进行测试,后果为:

 聚合索引应用的要害:在适合的列建设(通常为:最多用作查问条件的列)