变量/while循环/事务/存储过程
来源:互联网 发布:tomcat7域名绑定项目 编辑:程序博客网 时间:2024/05/20 20:03
视图
drop view vw9
alter view vw9
create view vwl1
as
select top 3 * --将游标变成数据源
from Student
order by sAge desc
select * from vwl1
select * from Student
--出错!order by。。。成了游标,不能作为数据源!
create view vwl2
as
select * from Student
order by sAge desc
create view vwl2
as
select * from Student
select * from vwl2
order by sAge desc
--order by 后,必须有top才能作为视图的查询语句
注意,在子查询和视图中都不能有order by,除非 top 3
索引视图
在视图上创建唯一的聚集索引
一、在T-SQL中使用变量
1.声明变量
declare @name varchar(20)
daclare @age int
2.赋值
(1)方法一
set @name='yqq'
set @age=18
print @name
ptint @age
(2)方法二
select @name='yqq'
select @age=18
print @name
ptint @age
-----使用set和select为变量赋值的区别
declare @rcount int
--set @rcount=(select count(*) from Student) --先查询,后赋值
select @rcount=count(*) from Student --即查询又赋值
print @rcount
declare @sAge int
select sAge from Student
--set @sAge=(select sAge from Student)--出错!查询返回的值不止一个
set @sAge=sAge from Student
print @sAge
select @sAge=sAge from Student-- 当查询返回多值的时候,是把最后一个值赋值给变量
declare @Fage int --只定义,没有赋值,因此@Fage为null
set @Fage=@Fage+1
select @Fage --这里输出的就是null
declare @userName varchar(10)
declare @userAge int
set @userAge=18
set @userName='hb'
select @userName,@userAge
print @userName+cast(@userAge as varchar(10))
--全局变量
select * from Student
insert into Student(sName,sAge,sSex,sNo)valuse('韩庚',33,'男',23231131)
print @@identity
print @@version--版本
print @@language--计算机语言
print @@servername--服务器的名称
print @@eror--错误,如果返回值为0,说明上一条语句没有错误!如果上一条语句出错,返回错误消息序号
print 'hello gey!'+22
print @@error
if else 条件语句
declare @Hage int
set @Hage=50
if @Hage>10
begin
print '长大了!'
end
else
begin
print '还小!'
end
select * from Score
--计算Score表中english成绩的平均值,如果>=60,查询正数前三名,否则找出倒数前三名
select avg(english) from Score
使用isnull()函数计算平均值
select avg(isnull(english,0)) from Score
使用变量计算平均值
declare @count int
select @count=count(*) from Score
declare @sum float
select @sum=sum(english) from Score
declare @avg float
set @avg=(@sum/@count)
print @avg
if @avg>=60
begin
select top 3 * from Score order by english desc
end
else
begin
select top 3 * from Score order by english asc
end
--while循环
--通过while计算1---100之间的奇数的和
declare @sum int
declare @i int
set @i=1
while @i<=100
begin
if @i%2<>0
begin
set @sum2=@sum2+@i
end
set @i=@i+1
end
print @sum2
--作业:通过while计算1---100之间的偶数的和
--如果english不及格的人超过半数,则给每个人增加2分,循环加,直到不及格的人数少于一半
select * from Score
计算总人数
declare @count int=(select count(*) from Score)
计算英语不及格人数
declare @loster int=(select count(*)from Score where english<60)
declare @harfcount int=floor(@count2/2)
while @harfcount<@loster
begin
update Score set english=english+2 where english<60
set @loster=(select count(*)from Score where english<60)
end
update Score set english=69 where english is null
update Score set english=22 where scoreId=9
--7个人一半按3算,7/2向下取整
print floor(7/2.0)
print ceiling(7/2.0)
print 7/2
把所有不及格的改成及格的
update Score set english=60 where english<60
---五、事务-------最典型的案例就是银行转账
--转账问题
create tbale Bank
(
Cid char(4) primary bey,
balance money
)
alter table Bank
add constraint CH_balance check(balance>=10)
insert into Bank values('001',1000)
insert into Bank values('002',10)
select *from Bank
delete from Bank
--假设要从0001账户转1000快到0002账户
update Bank set balance=balance-1000 where Cid='0001'
update Bank set balance=balance+1000 where Cid='0002'
if @@error=0
begin
commit tran
print '提交!'
end
else
begin
rollback
print '回滚!'
end
事务,就是把一系列操作作为一件事处理,要么都完成,要么都不完成!
begin tran--打开事务
begin try
declare @errorSum int=0
update Bank set balance=balance-1000 where Cid='0001'
set @errorSum=@errorSum+@@error
update Bank set balance=balance+1000 where Cid='0002'
set @errorSum=@errorSum+@@error
commit
--end try
begin catch
rollback
print '回滚!'
end catch
commit tran--提交事务
rollback tran--回滚事务
---'自动提交事务':系统检测SQL语句是否出错,如果没有错误就自动提交------------------
insert into Bank values('0003','1000')
-- 如果希望手动提交,可以回滚在执行插入操作的时候:
begin tran--打开事务
insert into Bank values('0004','4200000')
rollback--手动回滚或提交事务
commit
--隐式事务:默认情况为关,如果打开了则不自动提交,需要手动提交
set implicit_Trandactions on
delete from Bank
rollback
select * from Bank
--如果隐式事务打开,然后删除某个表,在事务没有结果前,其他查询不能访问该表。
--这就是“锁”,由于只是执行了一个SQL的操作,没有结束事务,就会把表锁住,不让别人在对他进行操作。放置并发问题出现
set implicit_Trandactions off
begin tran tranl
rollback tranl
commit tranl
--如果没有打开的事务,执行rollback时,就会报错
六、存储过程
和C#里的方法一样,由存储过程名/存储过程参数数组/可以有返回结果
if else/while/变量/insert/select等,都可以在存储过程中使用
优点:
执行速度更快--在数据中都是编译过的
允许模块化程序设计
提高系统安全性
减少网络流通量
1.系统存储过程
放在系统数据库master中的——可编译性——存储过程——系统存储过程中
--select *from sys.databases
exec sp_databases
sp_databases——右击修改——查看内部代码
使用sp_helptext来显示一个存储过程中的代码
exec sp_helptext sp_databases
exec sp_helptext sp_helptext
--给数据库重命名:
exec sp_renamedb 'Test','Text123'
--查询当前数据库中有多少个表
exec sp_tables
--查询当前数据库中的列信息
exec sp_columns 'Student'
以上是几个 系统的存储过程:以sp_开头,exec
自定义存储过程一般是以usp_开头
create proc usp_Helloworld
as
begin
print 'hello world!'
end
exec usp_Helloworld
--创建一个计算2个数的和的存储过程
- 变量/while循环/事务/存储过程
- mysql 存储过程中使用while循环
- mysql 存储过程while循环插入语句
- MySQL存储过程中的while循环
- SQLserver--表变量、事务、存储过程
- oracle存储过程、声明变量、for循环
- oracle存储过程、声明变量、for循环
- oracle存储过程、声明变量、for循环
- oracle存储过程、声明变量、for循环
- oracle存储过程、声明变量、for循环
- oracle存储过程、声明变量、for循环
- MySQL存储过程中使用 WHILE 循环语句的用法
- MySQL 存储过程中使用 WHILE 循环语句
- oracle存储过程中的while loop循环示例
- mysql存储过程while循环搭配if elseif选择条件
- MYSQL存储过程,while循环和游标的嵌套使用
- SQL存储过程(包含事务/参数/嵌套调用/游标/循环)
- 存储过程:while
- webRTC源码获取
- study1
- oracle编译无效对象卡住--等待事件single-task message
- EL表达式
- 百钱百鸡问题
- 变量/while循环/事务/存储过程
- 判断一个正整数是否为素数
- Android ListView 去除边缘阴影、选中色、拖动背景色等
- 几个不错的c++面试题目
- [ubuntu12.04] ubuntu查看系统信息
- 年龄排排序
- handler例子
- 第十一周任务大奖赛计分问题(痛苦死了,不会做)
- html调用swf文件