随笔 - 14  文章 - 0  评论 - 30 

* 主键设置:SQLServer中两种常用的主键数据类型:int(或 bigint)+标识列(又称自动增长字段);uniqueidentifier(又称Guid、UUID)

*  用标识列实现字段自增可以避免并发等问题,不要开发人员控制自增。用标识列的字段在Insert的时候不用指定主键的值。

*  GUID算法:可以产生唯一标识的高效算法。SQLServer中生成GUID的函数newid(),.NET中生成Guid的方法:Guid.NewGuid(),返回是Guid类型。

insert into Student(ID,Name,Sex) values(newid(),'波波','男') //此时的ID是主键,但不是自动增长的

* SELECT * FROM T_Employee
  ORDER BY FAge DESC,FSalary ASC

* 数据库中,一个列如果没有指定值,呢么值就为null,这个null和C#中的null,数据库中的null表示“不知道”,而不是表示没有。因此select null+1结果是null,因为“不知道”加1的结果还是“不知道”。

SELECT * FROM T_Employee WHERE FNAME=null;
SELECT * FROM T_Employee WHERE FNAME!=null;
都没有任何返回结果,因为数据库也“不知道”。

SELECT * FROM T_Employee WHERE FNAME IS null; //查出姓名为空的信息
SELECT * FROM T_Employee WHERE FNAME IS NOT null;//查出姓名不为空的信息

* where与having:在where中不能使用聚合函数,必须使用having,having要位于group by之后。having是对分组后信息的过滤,能用的列和selectz中能用的列是一样的。having无法代替where

* 例:检索按照工资从高到低排序检索从第六名开始一共三个人的信息。(top)

* Row_Number函数:可简化实现上面例子

* DISTINCT:去掉数据重复,它是对整个结果集进行数据重复处理的,而不是针对每一个列。

* UINON:联合结果集,基本原则:每个结果集必须有相同的列数,每个结果集的列必须类型相容。UNION合并两个查询结果集,并且将其中完全重复的数据行合并为一条,若要使它不合并,可用UINON ALL.
UINON因为要进行重复值扫描,所以效率低,因此如果不是确定要合并重复行,那么就用UNION ALL.

案例1:要求查询员工的最低年龄和最高年龄,临时工和正式工要分别查询。
SELECT ‘正式员工最高年龄’,MAX(FAge) FROM T_Employee
UNION ALL
SELECT ‘正式员工最低年龄’,MIN(FAge) FROM T_Employee
UNION ALL
SELECT ‘临时员工最高年龄’,MAX(FAge) FROM T_TempEmployee
UNION ALL
SELECT ‘临时员工最低年龄’,MIN(FAge) FROM T_TempEmployee

案例2:查询每个正式员工的信息,包括工号,工资,并且在最好一行加上所有员工工资额合计。
SELECT FNumber,FSalary FROM T_Employee
UNION
SELECT '工资合计',SUM(FSalary) FROM T_Employee

* 索引(Index):创建索引的方式,在表设计器中点击右键,选择“索引/键”—>添加-->在列中选择索引包含的列
一般只在经常检索的字段上(where)创建索引。
另:即使创建了索引,仍然有可能全表扫描,比如like、函数、类型转换等。

posted on 2010-10-26 19:35 波波. 阅读(...) 评论(...) 编辑 收藏