MySQL一一sql的视图、索引、约束

1、视图数据库

本质上至关于一张“虚拟表”,可看成独立的一张表进行操做(增、删、改、查)数组

      做用:架构

       a)可经过权限控制,只将“表中的少数列”暴露给数据库用户,而不让该用户直接操纵数据库中“实际表”ide

       b)可将经常使用的,较复杂的SQL在数据库中预先定义好,使得外部调用不用每次都编写复杂的SQL语句,直测试

接看成一张“虚拟表”来调用便可
等等,据说大家都很喜欢我~那给个当心心00~,为了表扬大家,戳这里有大家想要的完整zlspa

Customers表中原始数据:3d

image

Orders表中的原始数据:code

image

建立“查找运费在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

image

将该视图看成一张“独立的表”进行查询操做:

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

   执行结果以下:

image

   关于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;

执行结果:   

**image

**

    附:可经过执行如下语句查看SQL Server中某对象的定义:      

1 exec sp_helptext 'dbo.FortyToSixtyFreightCusts';

执行结果以下:

image

2、约束

   1)检查约束【一般认为的“约束”】

建立检查约束:

1 use edisondb; 2  alter  table staffinfo 3  add  constraint ck_StaffID check(StaffID between  5000  and  5999)

成功建立以后:

image

此时执行非法的插入行:

1 use edisondb; 2  insert  into StaffInfo(StaffID,StaffName,Department) 3  values(6000,'Wade','Dev');

执行结果为:

image

   2)惟一性约束

 StaffInfo表原始数据:

image

建立惟一性约束:

1 use edisondb; 2  alter  table staffinfo 3  add  constraint uq_StaffName unique(StaffName);

成功建立后:

image

  注:惟一性约束建立成功后,是在“键”中显示,而非“约束”中

 此时执行非法的插入行:

1 use edisondb; 2  insert  into StaffInfo(StaffID,StaffName,Department) 3  values(5003,'keven','Dev');

执行结果为:

image

说明:要使某列的值惟一,既能够经过主键来实现,也能够经过“惟一性约束”来实现

   3)默认约束

建立默认约束:

1 use edisondb; 2  alter  table staffinfo 3  add  constraint df_Department default('部门待定') for Department;

成功建立后:

image

执行行插入:

1 use edisondb; 2  insert  into StaffInfo(StaffID,StaffName) 3  values(5003,'Murphy');

   执行结果为:

image

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

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表中的部分数据以下:

image

进行查询测试:

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())),'  ','')+' 毫秒'

执行结果为:

image

如今对创建“汇集索引”的表进行测试

删除表中全部行:

1use edisondb 2truncate  table neworders;

在NewOrders表的tradeDate列上建立“汇集索引”

1use edisondb 2create  clustered  index tradeDate_NewOrders on NewOrders(tradeDate)

执行结果为:

image

再次插入10万行数据后,进行测试,结果为:

image

 聚合索引使用的关键:在合适的列创建(一般为:最多用做查询条件的列)

相关文章
相关标签/搜索