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万行数据后,进行测试,结果为:
聚合索引使用的关键:在合适的列创建(一般为:最多用做查询条件的列)