SQLserver 连接+开窗函数+视图+事务

时间:2023-12-06 10:00:56

今天学习SQLserver 连接以及开窗函数..加油!

1、复习:查询(检索)
-》筛选列
-》筛选行:distinct top where
运算符与关键字:比较运算符,逻辑运算符,between...and...,like '%_[^]'
-》分组与聚合函数
group by ... having ...
max,min,avg,sum,count
-》系统内置函数
类型转换函数:cast(值 as 类型) convert(目标类型,值[,格式])
字符串函数:len()
日期时间函数:getdate() datediff(关键字,日期1,日期2) datepart(关键字,日期)
-》联合查询:将多个结果集合并成一个结果集
要求:列相同,列类型相同
union:会排序,会去重复
union all:所有数据都取出来,并且不排序
-》连接查询:结果集中包含的数据分布于多个表中,则需要将多个表根据关系连接起来查询
何时使用连接查询?
关键:找出多个表的关系
join on
内连接inner join

2、自连接
分公司-company
cid
名称
1 总部
部门-department
did
名称
属于某个分公司cid
1 北京分公司 1
事业部-depart
deit
名称
属于某个部门did
->观察发现表的结构非常类似,于是考虑将这些表合成一张表
->组织架构表groups
gid
gname
gparent--对于没有上级的信息,可以使用0来填充
-》特点:关系列的值引用的本表中主键列信息
-》示例数据
1 总部 0
2 北京分公司 1
3 上海分公司 1
4 深圳分公司 1
5 广州分公司 1
6 .net部门 2
7 .net部门 5
-》查询部门及所对应的公司的名称
3、外连接
-》left join:左表中的信息全部出现,右表中的信息必须能够匹配的才出现
未匹配的项使用null填充
-》right join:右表中的信息全部出现,左表中的信息必须能够匹配的才出现
未匹配的项使用null填充
-》full join:所有数据都会出现,不匹配的项使用null填充
-》只要想做连接查询,必须分析出两个表间的关系

4、t-sql
-》case:用于在select子句中进行判断
两种格式:判断相等,判断不等
-》全局变量
@@identity:与一个insert语句连用,表示最新生成的标识
@@error:返回最近一个语句的错误编号,如果没有错误返回0,结合if替代try---catch的使用
-》开窗函数over
用途一:排序order by ,row_number
用途二:划区partition by,结合聚合函数针对某部分数据进行汇总
-》视图
用于存储封装一个select语句
使用:和使用表一样
注意:视图并不是一个存储数据的容器,而只是存储了一个查询
-》事务

在sqlserver中事务是自动提交的
通过set implicit_transactions on阻止自动提交
--开启事务:begin tran
--提交事务:commit tran
--回滚事务:rollback tran
-》存储过程
功能:完成一段代码的封装
语法:create proc 名称
参数列表
as
代码段
调用:exec 名称 参数列表
知识1:可以使用output修饰参数
知识2:可以使用默认值,注意需要将最后的参数设置成默认值
-》索引
作用:提高查询速度
注意:不是越多越好,会损耗存储空间
应用:对于出现在where子句中的列建立索引

下面是学习的代码

declare @uname nvarchar(10)='sk'
set @uname='yzk'
print @uname
select @uname

--全局变量
select @@VERSION
select * from Employee

insert into Employee(eName,eCode,edid) values('zjy',14,4)
select @@IDENTITY

insert into Employee values('yhb')
print @@error

print @@rowcount
---================if语句
--判断一个值是奇数还是偶数
declare @i int=10
if(@i%2=0)
begin
print '偶数'
end
else
begin
print '奇数'
end

--===========循环语句
--求1-100的和
declare @j int=1
declare @sum int=0
while(@j<=100)
begin
set @sum+=@j
set @j+=1
end
print @sum

--=============开窗函数
--排序
select *,RANK() over(order by tenglish desc) from TblScore
--order by tEnglish desc
--划区
select * from TblOrders
--传统的统计汇总
--这个语句表示对整个数据进行划区
select oname,SUM(ocount)
from TblOrders
group by oname

select *,SUM(ocount) over(partition by oname)
from TblOrders
--36
select *,SUM(ocount) over() from TblOrders
--196
--排号
select * from TblOrders
delete from TblOrders where oname='糖果'
select *,row_number() over(order by oprice desc)
from TblOrders
--
select distinct oname,oprice,max(ocount) over(partition by oname)
from TblOrders
--分页,要求3条数据显示一页
select * from(
select *,row_number() over(order by oprice desc) as num
from TblOrders
) t1
where num between 4 and 6
--找各班中城市人最多的城市名称
use ItCastCn

select * from TblStudent

select distinct tSClassId,MAX(counter) over(partition by tsclassid) from(
select distinct tSClassId,tSAddress,COUNT(*) over(partition by tsaddress) as counter
from TblStudent
) t1
--
select tSAddress ,tSClassId from(
select rank() OVER(partition by tsclassid ORDER BY num DESC )AS number,* from
(
select tSAddress,tSClassId ,count(tSAddress) as num
from TblStudent
group by tSClassId,tSAddress
)a
)b where number=1

--============视图
use hem09
select *,row_number() over(order by oprice desc) as num
from TblOrders

create view ordersWithNum
as
select *,row_number() over(order by oprice desc) as num
from TblOrders

select * from ordersWithNum
--查看视图中的代码
exec sp_helptext ordersWithNum

--=============事务
--比如订火车票
--下一个订单,这个订单中,包含多个购买信息
--orders,orders_detail
--合作事务来处理这种模型
--关键字:tran[saction]
--开启事务:begin tran
--提交事务:commit tran
--回滚事务:rollback tran
--示例
select * from TblOrders
declare @errornum int=0
begin tran
insert into tblorders values('五粮液',2,300)
set @errornum+=@@error
insert into TblOrders values('包子',3,1)
set @errornum+=@@error
if(@errornum>0)
begin
rollback tran
end
else
begin
commit tran
end

select * from TblOrders

begin tran
insert into tblorders values('ee',100,300)
--commit tran
rollback tran

set implicit_transactions on
--===============存储过程
select ' abc '
select rtrim(LTRIM(' abc '))
--'abc'

--存储过程完成一段sql代码的封装
create proc trim
--参数列表,多个间用逗号分隔
@str varchar(10)
as
--自定义代码段
declare @str1 varchar(10)
set @str1=LTRIM(RTRIM(@str))
print @str1

--使用存储过程
exec trim ' abc '
--'abc'
--===带输出参数的存储过程
--求两个数的和
create proc sum1
@num1 int,
@num2 int,
@result int output--表示这个参数可以将结果带出存储过程
as
set @result=@num1+@num2

declare @r1 int
exec sum1 1,2,@r1 output--必须要写output关键字,否则调用出错
print @r1

--===参数带默认值的存储过程,注意:默认值必须是最后一个参数
alter proc multi
@num1 int,
@num2 int=10 output--output的功能类似于C#中的ref修饰参数
as
set @num2=@num2*@num1
print @num2
--测试带出值的效果
declare @num int=2
exec multi 3,@num output
select @num
--测试默认值
exec multi 3

-------==============索引
select * from TblOrders
where oprice>100
--创建索引
create index index_name
on tblorders(oname)

这是昨天晚上看黑马视频学习的东西.感觉刘祁老师讲的挺好的.就是连着看了3-4个小时,很容易走神,可能听着听着就不知道自己想哪去了.这一点在以后的学习过程中要注意,不要一成不变的连续的看 ,可以边总结 边看