2015.5.28
***数据库·表的约束***
一、防止同一条数据完全重复
1.主关键字约束(主键约束)---PK
①能够唯一地区分每一行数据---不许重
②表中的数据按照主关键字排序---有序
③主关键字不能为空---不为空
④一个表只能有一个主键,但可以设置组合主键
操作:
添加主键:在表的设计界面,在相应的列上右击“设为主键”
删除主键:在表的设计界面,在相应的列上右击“删除主键”
2.唯一键约束(候选键)---UK
①唯一键不许重,可以为空
②一个表中可以有多个唯一键
③唯一键不能自动排序
操作:
在表的设计界面上右击“索引/键”,在弹出窗口上点击左下角“添加”,右键属性列表,修改类型“唯一键”,设置列
tips:
ctrl+0 清空不想要的某列某项数据
3.自增长列(标识列,Identity列)
①不能手动向自增长列里面填值,如果要写INSERT语句的话,则INSERT语句应当把这一列忽略
②自增长列主要用于整型、长整型、Decimal型
③不要随便把自增长列设置为主键
操作:
在表的设计界面中选中相应的列,在下面的属性面板→标识规范→选择“是”
二、防止有些该填的没有填
1.非空约束
不能为NULL
操作:
在表的设计界面中“允许NULL值”的复选框去掉
2.默认值
如果不给赋值的话,会使用默认值填上
操作:
在表的设计界面,选择相应的列,在下面的属性面板中设置默认值
三、防止乱填
1.类型
2.Check约束---CK
按照某种规则对数据进行检查
操作:
在表的设计界面中,右击相应的列,选择CHECK约束,在弹出的对话框中,设置约束的名称和表达式
3.外键约束---主表,从表
①主表是用来约束从表的,外键应当建立在从表上,从表中的外键列是不能随便乱填内容的,只能填写主表主键中存在的数据
②一旦建立起外键关系来,从表的外键不能乱填,反过来,主表中的主键列也不能乱删除乱改动
操作:
先建好主表,从表的设计界面上右击“关系”,在弹出的对话框中选择“添加”,在右边属性列表中设置“表和列的规范”
★级联删除的设置
***数据库函数***
一、数学函数
SQRT 平方根
select SQRT(2)//输出结果为1.414
ABS 绝对值
select ABS(-234)//输出结果为234
ROUND
①保留小数点后几位
select ROUND(4.532,1)
②四舍五入
select ROUND(4.532,0)//输出结果为4.500
CEILING 取大于已知小数的最小整数
select ceiling(COUNT(*)/5.0) from News
FLOOR 取小于已知整数的最大整数
select floor(COUNT(*)/5.0) from News
二、字符串函数
LOWER 大写转小写
select LOWER(‘UserName‘)---username
UPPER 小写转大写
select UPPER(‘UserName‘)---USERNAME
LTRIM 压缩左边空格
select LTRIM(‘ me‘)---me
RTRIM 压缩右边空格
select LTRIM(‘me ‘)---me
*截取字符串
select LEFT(Title,5) from News 截取前几个字符
select RIGHT(Title,5) from News 截取后几个字符
select SUBSTRING(Title,3,5) from News 任意位置截取字符//3表示截取字符位置,5表示截取字符个数
*替换字符串
select REVERSE(Title) from News 翻转字符串
select CHARINDEX(‘中国‘,Title) from News 字符串出现的位置---标题中字符"中国"出现的位置
select REPLACE(Title,‘中国‘,‘美国‘) from News 替换字符串---标题中字符"中国"的位置替换成"美国"//"中国"表示原字符,"美国"表示替换字符
select REPLACE(Title,3,4,‘china‘) from News 指定位置、指定个数替换字符串//3表示替换位置,4表示替换个数,"china"表示替换字符
三、其他
select RAND()
随机数生成函数,0-1之间
select LEN(‘china‘)//输出结果为5
取字符串长度
select GETDATE()
获取当前时间
select YEAR(sbirthday) from Student
取日期时间年份
select MONTH(sbirthday) from Student
取日期时间月份
select DAY(sbirthday) from Student
取日期时间天数
*取日期时间部分字符
select DATEPART(yy) from Student 取日期时间年份
select DATEPART(mm) from Student 取日期时间月份
select DATEPART(dd) from Student 取日期时间天数
select DATEPART(hh) from Student 取日期时间小时
select DATEPART(mi) from Student 取日期时间分钟
select DATEPART(ss) from Student 取日期时间秒数
*转换格式
select CAST(123 as varchar(20))//输出varchar格式123
select CAST(‘123‘ as int)//输出int格式123
2015.5.30
视图View
视图:查询结果---与视图相对应的是表
表---真正存储数据的地方
视图---不存数据,展示查询的结果
定义:
select * from view_表名
语法:
create view 视图表名
as
select代码行
go
as...go等效于c#语句中的花括号
tips:
①视图就是为了查询数据方便,一般不要试图向视图中插入数据,容易出错。
②视图可以由一个表生成,也可以由多个表生成,还可以由表中各视图生成新的视图。
掌握:
1.视图是什么
2.会建视图、会查视图
3.知道视图的主要功能是查询,不是增删改
索引Index
索引:为了提高查询效率
索引的类型:簇索引(聚集索引)、非簇索引(非聚集索引)---簇索引比非簇索引检索效率高
操作:在表的设计界面上右击“索引/键”,在弹出窗口上点击左下角“添加”,设置索引
tips:
①数据的默认存储次序跟簇索引的次序是一样的。一个表中只有一个簇索引。
②非簇索引是单独放置的,查询的时候,先查询非簇索引,再根据非簇索引查询内容。一个表可以有多个非簇索引。
要记住的:
1.索引是什么
2.索引的分类、效率、原理
3.索引提升查询效率,但会影响增删改的效率
4.如何建索引、删索引
存储过程
SQL编程
数据类型:列的类型
变量定义:declare 变量名 类型名---变量名以@开头
赋值和取值:
赋值:set 变量=值或select 变量=值
eg.set @a=‘hello world‘
select @a=‘hello world‘
取值:变量名
declare @a varchar(50)---定义变量
set @a=‘hello world‘---给变量赋值
print @a---取值输出
运算符:算术、关系、逻辑、其他
算术:+ - * / % 没有++(自增) --(自减)
关系:> < >= <= = <> != //<> !=都是不等于,但常用的是<>
逻辑:and(与) or(或) not(非)
其他:
between...and...
exists
like
is(null)
没有条件运算符?: 也没有复合运算符%= += -=()
条件分支:
if 表达式---一定注意SQL的if语句不加小括号
begin
end
else
begin
end
存储过程的创建:
create procedure(或简写作proc) 存储过程名
形参名 形参类型,
形参名 形参类型,
......
形参名 形参类型
as
函数体
go
存储过程的调用:
存储过程名 实参1,实参2,...实参n
案例一:往Info中送入数据,如果主键已经存在,则执行修改操作,否则执行插入操作
案例二:做一个存储过程,输入水果代号、人员用户名、购买数量,把库存和账户扣掉相应的值
案例三:同案例二。但要检查:1.库存够不够 2.余额够不够
案例1
create procedure testinfo
@code varchar(50),
@name varchar(50),
@sex bit,
@nation varchar(50),
@birthday datetime(50)
as
declare @c int
select @c=count(*) from info where [email protected]
[email protected]>0
begin
update info set [email protected],[email protected],[email protected],[email protected] where [email protected]
end
else
begin
insert into info(code,name,sex,nation,birthday)values(@code,@name,@sex,@nation,@birthday)
end
go
testinfo ‘代号‘,‘姓名1‘,‘性别1‘,‘民族‘,‘生日1‘
select * from info//执行插入数据
testinfo ‘代号‘,‘姓名2‘,‘性别2‘,‘民族‘,‘生日2‘
select * from info//执行修改数据
案例2
create proc buyfruit
@uid varchar(50),
@id varchar(50),
@count int
as
update fruit set [email protected] where [email protected]
declare @cost decimal(8,2)
declare @p decimal(8,2)
select @p=price from fruit where [email protected] //从表中查询单价
set @cost=cast(@count as decimal)*@p
update login set [email protected] where [email protected]
go
buyfruit ‘用户名‘,‘水果代号‘,个数//执行后查询库存和账户是否扣掉相应的值