SQL Server 2008编程入门经典

3.1  基本sql语句

 1)如果在查询中未指定查询结果的排列顺序,则有sql server 决定数据的输出顺序,通常是按照表的物理储存顺序,或者用于查找数据的索引的顺序;

 2)除了count(*),以其他任意形式使用的count函数都会自动忽略NULL值,其他聚合函数(SUM,AVG,MAX,MIN等同理)。

     比如5行数据中有1行为NULL,count(*)统计出来的总行数为5,count(’列名‘)统计出来的是4

 

4.7 联合

 1)UNION查询返回的结果默认为distance,即不返回重复的行,若需要返回所有行,需增加使用ALL关键字,即为 union all;

 

5.2.2

exec sp_help tb_test; 调用了一个储存过程,查看tb_test的表信息;

不带exec时也能执行,但限制只能作为第一个语句;

 

5.3.2

1)在已存在的表中添加一列not null的列,需考虑原来已经是null的数据。可以为改列设置设置一个默认值default;

2)sql server中无法在表的特定位置添加列,新增的列都会在表的最后;

3)添加列对视图的影响:即使视图是用select * 作为基本语句构建的,在重新构造视图前,新增列不会出现在视图中,

只能重建视图或者用alter view重新构造视图。因为视图的的列名称是在视图创建时进行解析的。

 

6.3.2

1)添加了外键的表中插入新记录时,外键的列要么与被引用表中的被引用列的某条记录匹配,要么外键的值设为null;

2)外键可以引用自身表中的列,但表中至少有一行数据,否则插入第一行时没有值可以引用,或者外键约束的列设置为允许NULL;

3)为了使外键约束的记录能在 当被引用列的值被改变或被删除 时自动更新或删除,需要设置 级联;

4)被外键引用的列必须定义一个主键或唯一约束;

 

6.3.3 唯一约束

唯一约束 与主键类似,都要求表中指定的列有唯一值,但唯一约束可以允许列中有且仅有一个NULL,而主键不允许有NULL;

 

6.4 check约束

check约束可以与一个列关联,也可以与一个表关联;

可以使用与where语句一样的规则来定义check约束;

与其他选择(规则和触发器),check约束的速度更快;

 

6.6 禁用约束

1)sql server 只允许禁用外键约束和check约束;

2)创建约束时可以忽略表中原有的不符合约束的数据,方法是在alter table语句中加入WITH NOCHECK;(alter table tb_test with nocheck .....)

 

6.7规则和默认值

规则与默认值是实际存在的对象,需要将其绑定到指定表的指定列才会起作用;而约束是在建表时定义的,不会单独存在;

规则类似于check约束,但规则不能联合多列进行检查,每列都是独立的;

默认值类似于Default约束;

 

7.1 嵌套查询

使用连接(join)的方式进行查询,性能优于嵌套的select查询;

 

7.2关联子查询

能高效得从表中获取特定数据;

 

关联子查询中内部查询根据外部查询的信息运行:

1)外部查询获得一个记录, 将记录传给内部查询;

2)内部查询根据传递的值执行;

3)内部查询将查询结果传回外部查询,外部查询再根据该结果完成一次处理;

4)外部查询获得新一个记录,重复1到4;

例子:

 

select so1.OrderDate,so1.CustomerID, so1.SalesOrderID from Sales.SalesOrderHeader so1 where so1.OrderDate= 
(select min(so2.OrderDate) from Sales.SalesOrderHeader so2 where so1.CustomerID = so2.CustomerID ) 

对于外部查询返回的每行数据,内部查询都会执行,条件是限制其结果集与
CustomerID匹配。Min() 调用将结果集限制为感兴趣的一行数据。

如果有500位客户下达了订单,内部查询将执行500次——so1中的每个记录中的CustomerID执行一次,外部查询然后根据so1.OrderDate进行数据筛选

7.4 一般来说,EXISTS关键字的查询会比join,以及派生表的查询要快,因为只要判断有存在就会返回结果,不必继续搜索;

7.5 CAST和CONVERT进行数据类型转换

大部分时候两者是功能相同的;

CAST:是ANSI兼容的;CONVERT进行日期转换可以控制日期格式 ;

 

连接,嵌套子查询,关联子查询,派生表,EXISTS, 预查询(声明一个变量,将需要的值赋给这个变量)

 

8、第一范式:消除重复数据组合保证数据原子性;

     第二范式:每列必须依赖整个键;

    第三范式:任何列不能依赖于非键列,不可以有派生数据;

一、二、三范式依次递进,均以前一范式为基础;

 

9.2.2 广义上将SQL SERVER检索数据的方式有:使用表扫描;使用索引;

1)表扫描是从表的物理起点浏览表的每一行,直到数据结尾;

2)使用索引时sqlserver将在B-平衡树中导航至与条件匹配的数据位置,并提取相应的数据;

    与表扫描的区别在于,使用索引时数据是排序的,所以查询引擎知道何时到达正在查找的范围的下界,从而结束查询或者转至其他数据范围;

3)索引分为:(物理数据在不同的索引中的排列顺序是不同的,而且sqlserver通过索引到达数据的方式也是不同的)

    1、群集索引:一个表只能有一个群集索引;群集索引的叶级是实际数据,也就是说数据重新排序,按照索引排列条件声明的相同物理顺序存储;

   2、非群集索引(又可细分为堆上的非群集索引和群集表上的非群集索引)。群集表是具有群集索引的表;堆没有群集索引的任意表;

       堆上的非群集索引:叶级不是数据,而是一个指向数据的指针;这意味着数据的物理排序是不确定的,需要通过指针才能找到数据,

                                检索多个数据时需要在硬盘访问多个页,会增加很多系统开销,而群集索引则不需要;

       群集表上的非群集索引:在叶级找到的是群集键,利用群集索引进行查找;这意味中需要多次利用群集索引进行查找;

9.3.3当向表中添加主键约束或者唯一约束,会隐式地创建索引;

 

9.4.1 索引,特别是非群集索引,只有在索引中具有相当高的选择性时才是有益的。选择性是指列中唯一值的百分比。但对群集索引几乎没什么影响;

 

9.4.2 索引在读取数据时可提高性能,但在数据发生修改是,索引也必然做出相应更新,导致花费的增加;

一旦创建了索引,改变它的唯一方法是删除并重建它

 

10.视图

1、减少用户查询时的复杂性;

2、防止敏感数据被查询;

3、给数据库添加额外的索引以提高性能;

默认情况下,视图跟在命令行执行命令一样,并不会有预先优化的过程。使用视图进行查询,会比直接查询多一层开销,

一般会比直接运行内部的select语句会慢;

 

10.10视图的索引

在视图上建立索引,为提取视图背后的信息提供了一种更快的方法,但同时也会导致底层表的insert,update,delete的执行速度变慢;

你可能感兴趣的:(SQL Server 2008编程入门经典)