一、视图
实质上相当于一张“虚构表”,可当作独立的一张表进行操作(增、删、改、查)
作用:
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 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';
执行后果如下:
二、束缚
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 万行数据后,进行测试,后果为:
聚合索引应用的要害:在适合的列建设(通常为:最多用作查问条件的列)