SqlServer基础知识总结.docx
- 文档编号:4534427
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:37
- 大小:31.34KB
SqlServer基础知识总结.docx
《SqlServer基础知识总结.docx》由会员分享,可在线阅读,更多相关《SqlServer基础知识总结.docx(37页珍藏版)》请在冰豆网上搜索。
SqlServer基础知识总结
一、语句建库、表
1.回顾
1)数据库文件
Ø主数据文件(.mdf)
Ø次数据文件(.ndf)
Ø日志文件(.ldf)
2.建库
1)语法
CreateDataBase数据库名称
Onprimary
(
Name=’逻辑名称’,
=’物理名称’,
Size=初始大小(单位:
KB、MB、GB、TB),
MaxSize=最大空间(UNLIMITED),
增长速度
)
……
Logon
(
Name=’逻辑名称’,
=’物理名称’,
Size=初始大小(单位:
KB、MB、GB、TB),
MaxSize=最大空间(UNLIMITED),
增长速度
)
2)必要属性
Ø存储位置
Ø初始大小
Ø增长速度
3)示例
--创建Xoa数据库
--数据文件初始大小为MB,增长速度为%。
无最大上限
--日志文件初始大小为MB,增长速度为MB。
最大上限为MB
createdatabasexoa
onprimary
(
name='Xoa_Data',
='e:
\data\Xoa.mdf',
Size=5Mb,
MaxSize=unlimited,
=15%
)
logon
(
name='Xoa_Log',
='e:
\data\Xoa.ldf',
Size=3MB,
MaxSize=100MB,
=1MB
)
4)注意事项
Ø单位必须完整(必须具有”B”,eg:
KB、MB等)
Ø数据库的逻辑名称不能出现重复
5)建议
Ø将数据文件和日志文件进行分开存放
Ø数据库的初始大小及增长速度计算后在定义
3.删除数据库
1)语法
Dropdatabase数据库名
2)示例
--2、删除数据库
--练习:
删除名为Xoa的数据库
--检查数据库是否存在
--databases:
视图,存在与Master数据库中
ifexists(select*fromsys.databaseswherename='xoa')
dropdatabaseXoa
3)建议
删除数据库之前尽量使用判断语句检查数据库是否存在。
4.建表
1)数据类型
Ø字符类型
✧Char:
非unicode的固定长度的字符类型
✧Varchar:
非unicode的可变长度的字符类型
✧Nchar:
unicode的固定长度的字符类型
✧Nvarchar:
unicode的可变长度的字符类型
✧Text
Ø数值
Int、float、decimal、number
Ø布尔类型
Bit
Ø日期类型
Datetime
Ø二进制
Image
2)语法
Createtable表名
(
字段名类型[(长度)][特征]
)
注:
特征—非空(Notnull)、自增(Identity)
3)示例
--练习:
创建部门表(Department)
--记录Id(deptId,int,自增)、部门名称(deptName,varchar(50),非空)
createtableDepartment
(
deptIdintidentity(1,1),
deptNamevarchar(50)notnull
)
4)数据完整性
Ø实体完整性
✧要求
唯一标识每行记录
✧实现
主键、唯一、自增
Ø域完整性
✧要求
保证列数据的有效性
✧实现
数据类型、非空、默认值、检查
Ø引用完整性
✧要求
引用完整性约束保证两(多)表之间数据的有效性
✧实现
引用关系
Ø自定义完整性
✧要求
通过编写自定义的逻辑或规则实现数据的验证。
✧实现
存储过程、触发器、规则
5)约束(Constraint)
Ø主键约束(PrimaryKeyConstraint)
作用:
数据唯一且不允许出现null值
Ø唯一约束(UniqueKeyConstraint)
作用:
数据唯一但允许出现一次null值
Ø检查约束(CheckConstraint)
作用:
数据符合规则
Ø引用约束(ForeignKey……References)
作用:
保证两表之间数据的有效性
Ø默认值约束(DefaultConstraint)
作用:
提供默认的字段值
6)命名规则
缩写_列名
7)分类
Ø行内约束
--行内约束
createtableUsers
(
--主键约束
--主键可以由多个字段组成(复合主键),主键列字段不能为空
UserIdintidentity(1,1)primarykey,
UserNamevarchar(20)notnull,
--唯一约束
Accountvarchar(20)notnullunique,
--检查约束
Pwdvarchar(20)notnullcheck(len(pwd)>=6andlen(pwd)<=20),
Ageintnotnullcheck(age>=18andage<=60),
--引用约束
DeptIdintreferencesDepartment(deptId),
--默认值约束
Memovarchar(200)default('这个家伙很懒,什么都没留')
)
--方式
createtableUsers
(
UserIdintidentity(1,1),
UserNamevarchar(20)notnull,
Accountvarchar(20)notnull,
Pwdvarchar(20)notnull,
Ageintnotnull,
DeptIdint,
Memovarchar(200),
--约束
--主键约束
--primarykey(UserId),
constraintpk_UserIdprimarykey(UserId),
--唯一约束
--unique(Account),
constraintuq_Accountunique(Account),
--检查约束
--ck_Pwdcheck(len(pwd)>=6andlen(pwd)<=20),
constraintck_Pwdcheck(len(pwd)>=6andlen(pwd)<=20),
constraintck_Agecheck(age>=18andage<=60),
--引用约束
--foreignkey(deptId)referencesDepartment(deptId)
constraintfk_DeptIdforeignkey(deptId)referencesDepartment(deptId)
)
注:
省略constraint时会自动生成约束名,而带有constraint时可以自定义约束名
Ø外部约束
--方式
createtableUsers
(
UserIdintidentity(1,1),
UserNamevarchar(20)notnull,
Accountvarchar(20)notnull,
Pwdvarchar(20)notnull,
Ageintnotnull,
DeptIdint,
Memovarchar(200)
)
go
--约束
altertableUsers
addconstraintpk_UserIdprimarykey(UserId)
go
altertableUsers
addconstraintuq_Accountunique(Account)
go
altertableUsers
addconstraintck_Pwdcheck(len(pwd)>=6andlen(pwd)<=20)
go
altertableUsers
addconstraintck_Agecheck(age>=18andage<=60)
go
altertableUsers
addconstraintfk_DeptIdforeignkey(deptId)referencesDepartment(deptId)
go
--方式
createtableUsers
(
UserIdintidentity(1,1),
UserNamevarchar(20)notnull,
Accountvarchar(20)notnull,
Pwdvarchar(20)notnull,
Ageintnotnull,
DeptIdint,
Memovarchar(200)
)
go
--约束
altertableUsers
addconstraintpk_UserIdprimarykey(UserId),
constraintuq_Accountunique(Account),
constraintck_Pwdcheck(len(pwd)>=6andlen(pwd)<=20),
constraintck_Agecheck(age>=18andage<=60),
constraintfk_DeptIdforeignkey(deptId)referencesDepartment(deptId)
go
方式1、2适用于建表时已经设计好约束时使用;方式3、4适用于在表建立后追加约束时使用。
8)删除约束
Ø语法
Dropconstraint约束名
Ø示例
--修改表结构
altertableUsers
--删除约束
dropconstraintck_age
5.删除数据表
1)语法
Droptable表名称
2)示例
--objects:
系统视图,存在于所属的数据库
--判断表是否存在
ifexists(select*fromsys.objectswherename='Users')
droptableUsers
go
二、Sql编程
1.输出语句
1)语句
ØSelect
Select输出内容
ØPrint
Print输出内容
2)示例
--1、输出语句
--格式:
select输出内容
--select后可以输出任何有效内容,如:
常数、变量及函数
select'abc'
select'中国'
selectGETDATE()
--格式:
print输出内容
--print后可以输出任何有效内容,如:
常数、变量及函数
print'abc'
print'中国'
printgetDate()
3)区别
ØSelect在网格中对数据进行显示;Print在消息窗口中对数据进行显示。
ØSelect支持列别名;print不支持列别名
4)说明
输出的内容可以是变量、常数、函数或表达式。
2.变量
1)全局变量
Ø特点
全局变量是由系统定义和维护的,我们无法更改,只能使用。
Ø命名规则
@@+变量名
Ø常用全局变量
✧@@error:
获取前一条语句执行过程中的错误编号,0表示没有错误
✧@@identity:
获取前一条语句所产生的自增列的值
✧@@version:
获取当前数据库版本号
✧@@servername:
获取当前服务器的名称
✧@@rowcount:
获取受影响的行数
Ø示例
--2、变量
--向User表中插入数据
insertintousersvalues('Mike','Mike','123456',20,1,DEFAULT)
go
--输出前一条语句所产生的自增序列值
print@@identity
--输出前一条语句所产生的错误号
print@@error
insertintousersvalues('Mike','Mike','123456',20,1,DEFAULT)
--错误编号
print@@error
--错误编号
print@@error
select*fromusers
--获取受影响的行数
print@@rowcount
--获取当前数据库版本号
print@@version
--获取当前服务器的名称
print@@servername
2)局部变量
Ø特点
局部变量是由用户自定义的,局部变量的定义遵循先定义后赋值的原则。
Ø语法
Declare变量名变量类型[(长度)]
命名规则:
@+变量名
Ø示例
--声明局部变量
--一次定义一个变量
declare@i1int
go
--一次性定义多个变量
declare@i1int,@i2int
Ø赋值语句
✧Select
Select@变量名=值[from表名]
✧Set
Set@变量名=值/表达式/子查询
✧示例
--a、set语句赋值
declare@i1int
set@i1=20
print@i1
set@i1=77
print@i1
go
--b、select语句赋值
declare@i1int
select@i1=-60
print@i1
select@i1=90
print@i1
--c、查询并赋值
--set语句
declare@idint
--查询语句将被视为表达式进行使用
--注:
使用过程中必须使用()括起来
--一次只能对一个变量进行赋值
set@id=(selectdeptIdfromDepartmentwheredeptName='市场部')
print@id
go
--select语句
--一次可以对多个变量进行赋值
declare@idint,@namevarchar(20)
--效果等同于set语句
--select@id=(selectdeptIdfromDepartmentwheredeptName='市场部')
select@id=deptId,@name=deptNamefromDepartmentwheredeptName='市场部'
print@id
print@name
go
--返回多个结果值
selectdeptIdfromDepartment
--set语句
declare@Idint
--set赋值时查询语句最多只能返回一个值
set@Id=(selectdeptIdfromDepartment)
print@id
go
--select语句
declare@Idint
--set赋值时查询语句最多只能返回一个值
select@Id=deptIdfromDepartment
print@id
go
--无返回值
selectdeptIdfromDepartmentwheredeptName='教质部'
--set语句
declare@idint
set@Id=-100
--查询语句无返回值变量将赋值为空
set@id=(selectdeptIdfromDepartmentwheredeptName='教质部')
print@id
go
--select语句
declare@idint
set@Id=-100
--查询语句无返回值时将保留变量的原值
select@id=deptIdfromDepartmentwheredeptName='教质部'
print@id
✧区别【面试题】
✓Set语句一次只能对一个变量进行赋值;select语句一次可以对多个变量进行赋值
✓Set赋值时查询将做为条件表达式;select语句查询时可以将变量定义在语句内
✓Set赋值时查询语句最多只能有一个返回值;select赋值时查询语句可以有多个返回值,但是只有最后一个赋值给变量
✓查询赋值时,如果查询语句无返回结果时,set将为变量赋值为null;select将保留原值
✧应用
多变量赋值时考虑使用select;单一赋值时考虑set。
✧注意
Select赋值时,赋值与查询不能同时使用
Set赋值效率偏高;select赋值效率偏低
3.转换函数
1)“+”运算符
Ø作用
✧执行算术运算(表达式中有一项为数值类型)
✧执行连接运算(表达式中运算数都不为数值类型)
Ø示例
--算术运算符
print2+3
--连接运算符
print'a'+'c'
--表达式执行按照从左向右的顺序进行执行
--当表达式遇到数值类型时将执行算术"+"法运算
print'1'+'7'+3
--表达式包含无法转换的数据
--执行过程中遇到数值类型则首先对参与运算的运算数进行转换
--如果转换成功则执行算术运算,否则将抛出异常
print'1'+'8'+1+'a'
算术运算高于连接运算
2)转换函数
ØCast
Cast(表达式as目标类型[(长度)])
ØConvert
Convert(目标类型[(长度)],表达式[,格式])
Ø示例
--定义变量
declare@idint,@namevarchar(50)
--查询并赋值
select@id=deptId,@name=deptNamefromDepartment
--异常:
类型转换失败
--print@id+@name
--将@id(int)转为varchar
--cast()函数
printcast(@idaschar(4))+@name
--convert()函数
printconvert(char(4),@id)+@name
ØConvert与cast【面试题】
Convert转换过程中可以设置转换的格式;cast无法设置转换格式
4.流程控制语句
1)分支语句
ØIf…else语句
If(条件表达式)
Begin
代码段1
End
Else
Begin
代码段2
End
说明:
sql中使用begin…end替代{},只有一条语句的代码段可以省略begin…end
Ø示例
--6、if分支语句
--a、if分支语句
declare@iint
set@i=20
if(@i>100)
print'yes'
go
--b、if...else分支语句
declare@iint
set@i=20
if(@i>100)
print'yes'
else
print'no'
go
--c、嵌套if...else语句
declare@iint,@jint
set@i=20
set@j=80
if(@i>100)
begin
if(@j>150)
print'if--->yes'
else
print'if--->no'
end
else
begin
if(@j>50)
print'else--->yes'
else
print'else--->no'
end
go
ØCase语句
✧语法
Case
When条件1then值表达式1,
……
[,else值表达式n]
End
✧示例
--按照国际评分标准输出学生成绩信息
--包含:
学号、课程编号、成绩等级
--优:
-100
--良:
-90
--中:
-80
--差:
低于分
--注:
between...and相当于>=且<=
selectStudentNo,SubjectId,level=
case
when(studentresultbetween90and100)then'优'
when(studentresultbetween80and89)then'良'
when(studentresultbetween60and79)then'中'
when(studentresultbetween0and59)then'差'
else'缺考'
end
fromResult
✧适用
✓表中数据结果值的转换,如示例
✓表结构的转换,如:
竖表转横表或横表转竖表
2)循环语句
ØWhile语句
✧语法
While条件表达式
Begin
循环体;
[break/continue]
end
✧示例
--8、while循环
--通过循环语句输出~5等个数
--声明变量并赋值
declare@iint
set@i=1
--循环输出@i的值
while@i<=5
begin
print@i
set@i=@i+1
end
go
--横向输出个数
--声明变量并赋值
declare@iint,@rvarchar(100)
set@i=1
set@r=''
while@i<=5
begin
--拼接字符串
set@r=@r+CAST(@iasCHAR(5))
set@i=@i+1
end
--输出拼接后的字符串
print@r
--为所有学生的科目Id为的课程成绩提分
--每次提分,且最高成绩不能高于分
--如果所有学生均已及格则结束
select*fromResultwhereSubjectId=1
--定义变量存储不及格学生的人数
declare@countint
--获取不及格学生的人数
set@count=(selectCOUNT(Id)fromResultwhereSubjectId=1andStudentResult<60)
--通过循环来更新不及格学生成绩
while(@count>0)
begin
--更新所有学生成绩
--条件:
科目编号为且小于
updateResultsetStudentResult=StudentResult+5
whereSubjectId=1andStudentResult<95
--重新获取不及格学生的人数
set@count=(selectCOUNT(Id)fromResultwhereSubjectId=1andStudentResult<60)
end
print'修改完成'
go
✧Break与Continue
Br
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SqlServer 基础知识 总结