时间:2021-07-01 10:21:17 帮助过:8人阅读
变量
局部变量
使用declare声明局部变量
declare @a nchar(5);
declare @a nchar(5), @b int;
使用select或者set给变量赋值
select @a = ‘111‘;
select @a = ‘aa‘, @b = 1;
select @a = StudentName from [Student] where StudentID = 9;
set @a = ‘ha‘;
全局变量
全局变量使用@@开头,是系统内置的,无法自定义,例如
print @@VERSION; 输出版本信息
print @@DBTS; 返回当前时间戳值
操作符
注释符
单行注释,使用 -- 注释
多行注释,使用 /*内容*/
运算符
算数运算符
+ - * / %
赋值运算符
=
比较运算符
> < = >= <= <>(不等于) != !>(不大于) !<
逻辑运算符
主要用在where字句
all and any between exists in like not or some
字符串连接运算符
+
通配符
配合like用于模糊查询
% 表示 >= 0 个字符
_ 表示 1 个字符
[] 表示任意单个字符
[^] 表示非任意单个字符
流程控制语句
if
if(1 < 2)
begin
print ‘haha‘
end
else
begin
print ‘kuku‘
end
case
类似于一般编程语言的switch
如下是根据员工的名称,给员工添加职位信息
select *, 职位 = case
when [StudentName] = ‘小王‘ then ‘老总‘
when [StudentName] = ‘小叶‘ then ‘技术总监‘
else ‘普通员工‘
end
from [dbo].[Student]
或者使用如下简写形式
select *, 职位 = case [StudentName]
when ‘小王‘ then ‘老总‘
when ‘小叶‘ then ‘技术总监‘
else ‘普通员工‘
end
from [dbo].[Student]
while
declare @index int = 0;
while @index < 100
begin
set @index += 1;
end
print @index
流程终止语句
break 跳出循环
continue 跳出本次循环
return 终止程序
goto 跳转到标识符位置重新执行代码
declare @index int = 0;
count: set @index+=1; // 声明count标识符
if(@index < 10) goto count; // 条件满足则跳转到标识符位置,重新执行代码
waitfor 设置延迟时间或者时间点,参数必须是datetime类型
waitfor delay ‘00:00:03‘ print ‘haha‘; // 延迟3秒执行
waitfor time ‘20:43:00‘ print ‘叶家伟你好帅‘; // 设置代码执行时间点
聚合函数
sum 求和
avg 平均值
min 最小值
max 最大值
count 计数
distinct 去重
select distinct StudentName from [dbo].[Student]
聚合函数一般和group by字句配合使用
select StudentName, count(StudentName) as number from [dbo].[Student] group by StudentName
可以在group by字句后面使用having做进一步筛选,和where作用类似
select StudentName, count(StudentName) as number from [dbo].[Student] group by StudentName having StudentName = ‘yejiawei‘;
数学函数
abs 绝对值 abs(-2)
pi 圆周率 pi()
power 乘方 power(10,3)
rand 随机数
print rand(100) 固定随机数
print rand() 0~1之间任意随机数
round 四舍五入 print round(1.2225555,3)
square 平方 print square(4)
sqrt 平方根 print sqrt(4)
字符串函数
charindex函数
print charindex(‘b‘, ‘abcd‘, 0)
从字符串abcd的起始位置开始找b出现的索引位置,索引从1开始,返回结果如果为0,表示不存在
left函数
print left(‘abcdefg‘, 3) 从字符串左边开始截取三个字符
right函数,从右边截取
len函数,返回字符串个数 print len(‘absdg‘)
replace函数,字符串替换,print replace (‘abdgae‘, ‘ae‘, ‘叶家伟‘)
reverse函数,字符串反转 print reverse(‘cefet‘)
str函数,将数值转化成字符串
print str(round(1.2222234324, 3), 5, 3)
转化后字符串长度是5,小数位数是3
substring函数
print substring(‘gaerget‘, 2, 3);
从索引为2开始截取3个字符,索引是从1开始的
日期函数
getdate 系统当前时间 print getdate()
day 返回指定时间的天数部分 print day(getdate())
month 返回月份 print month(getdate())
year 返回年份 print year(getdate())
dateadd 时间增加
print dateadd("year", 4, getdate()) 增加4年
print dateadd("month", 4, getdate()) 增加4月
print dateadd("day", 4, getdate()) 增加4天
datediff 返回时间间隔
print datediff(day, ‘2017-4-5‘, ‘2017-4-9‘) 返回天数的差数
类型转换函数
cast 类型简单转换 print cast(‘111‘ as int)
convert 类型代号转换 print convert(varchar(255), getdate(), 102)
其他函数
UPPER函数,大写,print upper(‘qq‘)
LOWER函数,小写,print lower(‘QQ‘)
FORMAT函数,格式化数据,print format(getdate(), ‘yyyy-mm-dd‘)
select基本语句的使用
with语句的使用
书写复杂的嵌套的select语句可以使用with提取,简化
with result(StudentID, StudentName) as (
select StudentID, StudentName from [dbo].[Student]
)
select * from result;
使用with提取的select语句必须在随后使用
列别名的三种方式
select
StudentID id1,
id2 = StudentID,
StudentID as id3
from [dbo].[Student]
into语句的使用
创建一张表,将筛选的结果复制到新表中
select * into BackUpTable from [dbo].[Student]
where语句的使用
or配合
select * from [dbo].[Student] where StudentID = 10 or StudentID = 12
not配合
select * from [dbo].[Student] where not StudentID > 12
like配合
select * from [dbo].[Student] where StudentName like ‘%李‘
between配合
select * from [dbo].[Student] where StudentID not between 12 and 17
null配合
select * from [dbo].[Student] where StudentName is null
In配合
select * from [dbo].[Student] where StudentID in (10,12)
all配合
select * from [dbo].[Student] where StudentID >All (select StudentID from [dbo].[Student] where StudentID in (10,12))
>All表示 大于子查询的最大值
some配合
some和any等效
>some表示 大于子查询的最小值
exists配合
两表联合查询
select TeacherId from [dbo].[Teacher] as a where exists (select TeacherType from [dbo].[Teacher] as b where a.TeacherId = b.TeacherType)
先计算外层的查询的数据,然后传递到子查询中进行判断,满足则返回数据
group by使用
分组
select StudentID, count(StudentID) as number from [dbo].[Student] group by StudentID
group by后面如果要进一步筛选只能用having
order by使用
排序
select * from [dbo].[Student] order by StudentID desc -- 倒序
top 使用
取前5个
select top 5 * from [dbo].[Student]
取前5%
select top 5 percent * from [dbo].[Student]
update基本语句的使用
更新数据
update [dbo].[Student] set StudentName=‘小花‘ where StudentID = 24
insert into基本语句的使用
新增数据
整行插入 insert into [dbo].[Teacher] values (‘teacher‘, 2, 3)
指定列插入 insert into [dbo].[Student] (StudentName) values (‘小叶‘)
delete基本语句的使用
删除一条数据 delete from [dbo].[Student] where StudentID = 25
删除整个表数据
delete from [dbo].[Student]
delete * from [dbo].[Student]
union表联接
将两个表的数据合并到一个结果集中
默认合并剔除重复值
select * from [dbo].[Student]
union
select * from [dbo].[Student]
使用all可以显示所有值
select * from [dbo].[Student]
union all
select * from [dbo].[Student]
不同数据类型强并
select StudentName from [dbo].[Student]
union all
select cast(StudentID as nvarchar(50)) from [dbo].[Student]
空列强并
select StudentName, StudentName from [dbo].[Student]
union all
select cast(StudentID as nvarchar(50)), null from [dbo].[Student]
约束
not null 非空约束
表设计中可设置
primary key 主键约束
表设计中直接设置,非空唯一
foreign key 外键约束
表设计中直接设置,在外键表中设置
check 指定条件约束
表设计器中直接设置,如 ProductPrice > 1
default 默认值约束
表设计中可设置
嵌套查询
select * from [dbo].[Student] where StudentID = (select StudentID from [dbo].[Student] where StudentID = 10)
先计算子查询的结果,然后再判断,这要求子查询结果唯一
关系表联合
内联
使用inner join,先进行笛卡尔积运算,当满足条件数据横向拼接到一个结果集
select StandardName from [dbo].[Teacher] as a inner join [dbo].[Standard] as b on a.StandardId = b.StandardId
外联
左外联,使用 left outer join,以左表为基准,当条件满足合并,不满足置空
select * from [dbo].[Teacher] as a left outer join [dbo].[Standard] as b on a.StandardId = b.StandardId
右外联,使用 right outer join
全外联,使用 full outer join
先以左表为基准,执行左外联的规则,执行之后,如果右表数据还有未匹配的,那么执行右外联的规则,将结果集合并
交叉
使用cross join,只进行笛卡尔积运算
select * from [dbo].[Student] cross join [dbo].[Student] as b
视图的使用
视图是一张虚拟表,将一段sql语句使用表关联,使用MSSM可以方便的创建视图
存储过程
存储过程就是讲 sql 封装起来随时执行,使用MSSM方便创建
执行存储过程 exec [dbo].[MyTest] 12
触发器
触发器用来根据数据库完成某种操作然后调用,使用MSSM创建
游标的使用
declare mycursor cursor for select * from [dbo].[Student] -- 声明游标
open mycursor -- 打开游标
fetch next from mycursor -- 使用游标
while @@FETCH_STATUS=0 -- 执行状态码,0表示成功,-1表示失败,-2表示数据没有
begin
fetch next from mycursor
end
close mycursor -- 关闭游标
deallocate mycursor --释放游标
注:游标的性能很差,基本不用
索引
聚集索引,就是按照顺序找数据,无需额外添加聚集索引,主键就是聚集索引
非聚集索引,就是按照名字找数据,是无序的,可以使用MSSM创建
事务
事务就是代码块,失败了可以回滚,sql中的每条语句默认就是一个事务
use [SchoolDB]
begin transaction myTransaction -- 开始事务
print @@trancount -- 打印事务状态 1
set transaction isolation level read uncommitted -- 设置事务隔离级别,不可脏读
save transaction savepoint -- 设置回滚点
insert into [dbo].[Student](StudentName) values(‘小红‘)
rollback transaction savepoint -- 回滚到回滚点
commit transaction myTransaction -- 提交事务,保存数据
print @@error -- 打印代码状态 0
print @@trancount -- 打印事务状态 0
select * from [dbo].[Student]
sql server实用要点全解
标签:成功 ext ack case 自定义 转化 等于 got 精确