11-08笔记

--8新建视图,修改视图,删除视图
     alter view vw_StudentScore
as
select * from Student
select * from vw_Studentscore
update Student set sName='山西关羽' where sName='关羽'
    
 select * from vw9
 as
 select
 sName,
    case
      when sAge>13 and sAge<16 then '豆蔻年华'
      when sAge >=50 then 'oldmen'
      elsn '青壮年'
    end as 生存状态
 from Student

 select * from vw9
alter view vw9 as……
drop viwe vw9

create view vw11
as
select top 3 *
from Student
order by sAge desc

select * from vw11
----出错! TOP 或 FOR XML,否则,order by子句在视图、内联函数、派生表、子查询和公用表表达式中无效
----order by …… 成了游标!不能作为数据源
create view vw12
as
select * feom Student
order by sAge desc

----可以执行的方法
select * from vw12  order by sAge desc


----!!!!order by后,必须有top 才能作为视图的查询语句
----## 注意,在子查询和视图中都不能有 order by  除非 有top

---视图索引
   create view vw_ix_t1 with schemabinding
as
select autoid,uname,usrid from dbo.T1
create unique clustered index ix_vw_t1 on vw_ix_T1(autoId)
-------------------------------------------------------------------
-----------一、在T-sql中使用变量-------
------(一)局部变量---------
---全局变量是系统定义好的,只能使用不能修改一和删除
---1、声明变量
declare @name vsrvhsr(20)
declare @age int
---2、赋值
--(1) 方法1
set @age=18
set @name='yqq'
--输出方法1
select @age
select @name
--输出方法2
print @age
print @name
--(2)方法2
 select @age=18
 select @name='yqq'
 print @age
 print @name
---使用set 和 select 为变量赋值的区别
declare @rcount int
--方法1 先查询在赋值
set @rcount=(select count(*) from Student)
--方法2 既查询又赋值
select @rcount=count(*) from Student
print @rcount


declare @sAge int

select sAge from Student
-----!!!!出错  子查询凡获得值不值一个 当子查询随在 =  != < <= > >= 之后子查询用作表达式时 这种情况是不允许的
set @sAge=(select sAge from Student)
-----------
select top 5 @sAge=sAge from Student--当查询返回多个值的时候是把最后一个值赋值给变量
select @sAge

----------------------------------
declare @Fage int ---只定义了,没有赋值,因此@Fage为null
set @Fage=@Fage+1
print @Fage----这里输出的为null

-------------------
declare @userName varchar(10)
declare @userAge int
set @userAge=18
set @userName='hd'
select @userAge,@userName-----输出一行两列
print @userAge,@userName -----!!!错误,print只能输出一个文本类型的
print @userName+case(@userAge as varchar(10))--输出一个字符串
                         ---print输出的是某一种数据类型的数值
----------------------------------------
----(二)全局变量----
select * from Student
insert into Student (sName,sAge,sSex,sNo) values ('韩庚',33,'男',121212)
print @@identity ---插入的上一条语句的自增长的id号
print @@version--版本
print @@language---语言
print @@setvername---服务器名称
print @@error--错误   如果返回值为0 ,说明上一条语句没错! 如果上一条语句出错,返回错误消息序号
--------------

---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 --聚合函数不考虑null
---使用isnull()函数计算平均值
select avg (isnull(english,0))from Score --将分数为null的赋值为0
---练习使用变量计算平均值
---笨方法---
declare @count int
select @count=count(*) from Score
declare @sum float
select @sum=sum(english) from Score
declare @avg flaot
select @avg=@sum/@count
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 @sum2 int =0
declare @i int =1
while @i<=100
begin
if @1%2<>0
begin
set @sum2=@sum2+@i
end
set @i=@i+1
end
print @sum2
---作业 :通过while 计算1——100之间偶数得和
---例题:如果english不及格的人超过半数,则给每人增加2分,循环加,知道不及格的人数少于一半
---1.计算总人数
declare @count int= (select count(*) from Score)
---2.计算英语不及格的人数
declare @loster int=(select count(*)from Score where english<60)
---3.找一半的人数
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

---------
 select * from Score

print floor (7/2.0)
print ceiling(7/2.0)

print 7/2

----------五、事务
--------隐式事务 、自动提交 、显示事务
--转账问题:
---转账问题
create table Bank
(
Cid char(4) primary key,
balance money
)
alter table Bank
add constraint CH_balance check (balance>=10)--增加一条约束,(检查约束),约束balance里边的数不能小于10

insert into Bank values ('0001',1000)
insert into Bank values ('0002',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'
--事务,就是把一系列操作作为一件事处理,要么都完成,要么都不完成!
--begin transaction --打开事务1
begin tran--打开事务2
begin try
declare @errorSum int =0
update Bank set balance=balance-900 where Cid='0001'
set @errorSum=@errorSum+@@ERROR
update Bank set balance=balance+900 where Cid='0002'
set @errorSum=@errorSum+@@ERROR
commit
print '提交!'
end try
begin catch
rollback
print '回滚!'
end catch
--if @errorSum=0
--begin
--commit tran
--print '提交'
--end
--else
--begin
--rollback
--print '回滚'
--end
commit tran --提交事务
rollback tran --回滚事务
select * from Bank
----------'自动提交事务':系统检测sql语句是否出错,如果没有错误就自动提交--------------------------

insert into Bank values ('0003',1000)
--如果希望手动提交,可以回滚在执行插入等操作的时候:
begin tran--打开事务
insert into Bank values('0004',2100000)
rollback--手动回滚或提交事务
---commit--关闭事务
----"隐式事务":默认情况下为关,如果打开了则不自动提交,需要手动提交。
set implicit_Transactions on
delete from Bank
--如果隐式事务打开,然后哦删除某个表,在事务没有结束前,其他查询不能访问该表。
--这就是"锁",由于只是执行了一个sql的操作,没有结束事务,就会把表锁住,不让别人在对它进行操作防止并发问题。
set implicit_Transactions off

----可以给事务起名,当多个事务存在时用以区分
begin tran tran1
rollback tran1
commit tran1
----如果没有打开的事务,执行rollback时,就会报错。
---六。存储过程!!!!!(重要 important!!!)
---与c#中的方法一样。存储过程 有 名、可以有参数、还可以有返回值。
--优点:
-- 执行速度更快-在数据库中保存的存储过程语句都是编译过的
--允许模块化程序设计- 类似方法的复用
--提高系统安全性-防止SQL注入
--减少网络流通量-只要传输存储过程的名称
--
--6.1 系统存储过程
--放在系统数据库中master 中的--可编程性--存储过程---系统存储过程
--select * from sys.databases
exec sp_databases
--使用sp_helptext 来显示一个存储工程中的代码
exec sp_helptext sp_databases
exec sp_helptext sp_helptext--查询自己的
--给数据库重命名
exec sp_renamedb 'MyTest','MyTest123'
--查询当前数据库中有多少个表
exec sp_tables
--查询当前数据库中的列信息
exec sp_columns 'MyStudents'
------------------------------------------------------
--以上是 几个 系统的存储过程:以sp_ 开头,exec执行
--自定义存储过程一般是以usp_ 开头
create proc usp_Helloworld
as
begin
print 'hello world'
end

exec usp_Helloworld
---创建一个计算2个数的和的存储过程

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值