1.基本术语:
表(Table)
列(Column)
字段(Field)
2.设置主键:
业务主键和逻辑主键 推荐使用逻辑主键。
业务主键:使用有业务意义的字段做主键,比如身份证号,银行账号等,难以保证没有重复。
逻辑主键:使用没有任何业务意义的字段做主键,完全给程序看的,比如序号,流水号。
3.表间关联、外键(ForeignKey):用于表设计,合理设计。外键约束,对于维护数据完整性、数据一致性有重大作用。
外键约束:
缺点:对性能影响比较大
优点:操作方便
是否使用外键:
对性能要求低、安全控制高的大型系统,使用外键约束,数据安全性主要由数据库控制。
海量数据、高性能系统,不适用外键约束,安全性有程序控制。
小型系统根据性能和便捷性进行权衡。
推荐:使用无意义的逻辑主键,只要主键和索引,不使用任何外键约束,必要时再使用。
4.
MS SQL Server 2005/2008
4.1数据库的表格数据类型:
Var:variable,可变的
bit 位,只能是0/1
char(n) n个字符,不足长度n的部分用空格填充
int 32位整数
bigint 64位大整数
varchar(MAX) 无限长的英文字符串,存一篇文章
varchar(n) n个字符长的英文字符串
nvarchar(MAX) 无限长的中文字符串,存一篇文章
nvarchar(n) 可以存中文等。含中文的字段都用nvarchar
4.2 SQL语言
4.2.2 SQL关键字、表名、字段等不区分大小写,但是字符串值大小写敏感。
4. 2.3 SQL包括DDL(数据定义语言)和DML (数据操作语言)两类。
4.2.4 自动增长:
(3)标识规范:标识列设置为是,并设置增量=k,自动增长k
(4)使用Guid算法产生唯一标识。guid效率高,导入导出方便,但是占用空间大。业界倾向于这个。
SQL server中生成guid的函数时newid(): select newid()
.Net中生成guid的方法是Guid.NewGuid(),返回是guid类型:Guid id=Guid.NewGuid();
int自动增长:占用有点小,易读,但是效率低,而且数据导入和导出的时候麻烦。
guid标识:效率高,数据导入和导出的时候方便,但是占用空间大,不易读懂。全部主键和外键都用guid,可能占用整个表空间的20%-40%
5.
SQL语句的通配符
通配符过滤使用like关键字
5.1
单字符匹配 用下划线“_”,匹配单个出现的字符。
select * from table1 where name like '_erry'//匹配以任意字符开头,剩余部分为“erry”
5.2
多字符匹配 用百分号“%”,匹配任意次数(0次或多次)出现的任意字符。
'k%'匹配以k开头,任意长度的字符串。‘%n%’ 匹配包含有字符n的记录
6.
SQL的常用函数
newid() //返回一个新的guid值
abs() //求绝对值 abs(-3)=3
ceiling() //天花板 舍入到最大整数 ceiling(3.14)=4
floor() //地板 舍入到最小整数floor(3.14)=3
round() //半径 四舍五入 round(3.14,3) 保留精度为3位
len() //计算字符串长度 len('abc')=3 len(name)
lower() //转小写
upper() //转大写
rtrim() //字符串右侧的空格去掉
ltrim() //字符串左侧的空格去掉
//没有trim()函数:去掉字符串的左右两端的空格,ltrim(rtrim(string))
substring(string,start_position,length)//截取字符串
getdate() //取得当前日期
dateadd(datepart,number,date) //计算增加后日期值
dateadd(day,3,getdate()) //3天后的日期
参数datepart可选:year,month,day,hour,hh,...
datediff(datepart,start_date,end_date) //计算两个日期的差值
datepart(datepart,date) //返回一个日期的特定部分
类型转换函数
cast(expression as data_type)
convert(data_type,expression)
select cast('123' as int),cast('2008-08-08' as datetime),
convert(datetime,'2010-01-01'),convert(nvarchar(50),'123得')
空值处理函数
isnull(expression,value) //exp不空则返回exp,否则返回value
isnull(name,'佚名') //如果name字段为null,则写为‘佚名’
</pre><p><pre name="code" class="sql">case expression
when exp1 then returnvalue1
when exp2 then returnvalue2
when exp3 then returnvalue3
//例子1:
select name,
(case score
when '1' then ‘第1名’
when '2' then ‘第2名’
when '3' then ‘第3名’
)
from user;
//例子2:
select name,
(
case
when salary<2000 then '低收入'
when salary>=2000 and salary<=5000 then '中等收入'
else '高收入'
end
)
as 收入水平
from user;
7.索引
全表扫描:效率最差,线性扫描全表
创建索引的方式:
添加索引的原则:只在经常检索的字段上(where子句)创建索引。
索引占用空间,insert、update和delete都要更新索引,影响速度。
(*)操作:有时候索引会失效,导致检索不走索引,而走全表扫描,比如like,函数、类型转换等等。