sql 里如果想循环数据,可以使用游标,但是效率比较慢,相当于每次循环都要查询一次,适用于处理少量的DateFix
例子如下
begin
declare @id varchar(5);--先是声明变量
declare @name varchar(max);
declare @FullName varchar(5);
DECLARE test CURSOR FOR --创建游标test,stock 某表
select s.TypeID,s.Name,s.FullName from BrandType_Test s --这里是需要操作的数据
--打开游标
OPEN test
FETCH NEXT FROM test INTO @id,@name,@FullName --这里和for 循环的初始化类似->i=0 注意into 后面跟的变量 要和取得的列的数目对应
while @@FETCH_STATUS =0 --提取数据的状态,游标读取下一条数据是否成功
begin
print @id
print @name
FETCH NEXT FROM test INTO @id,@name,@FullName-- 类似->i++
end
--关闭游标
CLOSE test
--释放资源
DEALLOCATE test
end
(*注意: @@FETCH_STATUS
0 FETCH 语句成功
-1 FETCH 语句失败或此行不在结果集中
-2 被提取的行不存在 )
如果是相对数据量比较大,可以使用with as 子查询 和 join 的巧用,把子查询作为每次循环的条件。
with A as (select * from class)
也就是将重复用到的大批量 的SQL语句,放到with as 中,加一个别名,在后面用到的时候就可以直接用。对于大批量的SQL数据,起到优化的作用。
数据库分页
可以用析函数row_number() 给每一条数据一个编号
然后根据每一个页面取多少数据进行输出。
数据分组处理
row_number() 和 partiion by 连用是通过row_number()对分组后的数据进行编号,这样的话属于同一组的数据就有相同的编号,然后可以对不同编号的数据组进行处理。
partiion by其实就是group by但用法不一样。
常用的数据库的三元运算符,Case When 需要判断的数据 Then 这个条件下的结果 End
select @@rowcount
获取最近一次数据库操作影响的行数,可以通过这个来判断sql是否有限执行成功,用于自定义error
with(RowLock,UpdLock)
行级锁和更新锁,比如查询时有更新,可以通过这个锁定数据,只有查询完成后才可以更新数据。
rank()
RANK()
在计算排序时,若存在相同位次,会跳过之后的位次。
例如,有3条排在第1位时,排序为:1,1,1,4······