SQL Server高级部分笔记

SQL Sever数据库

SQL sever基本语句:

输出语句:Print

声明变量语句:declare

数据类型转换:Convert(varchar,@age)

输出语句:

print 10*9 select 10*9 as '乘积'; 

最后一次插入的数据行的标识值。

@@IDENTITY

受上一个SQL语句影响的行数
select @@ROWCOUNT

本地的服务名称
select @@SERVERNAME

SQL Sever的if语句:

if(条件)  begin  (输出的内容)  end  else  begin  (输出的内容)  end 

第一单元

第二单元

1、查询操作

案例1:查询学号“20209130501”的学生的年龄,并输出

案例代码:

declare @age int;--声明一个局部变量,用于保存年龄 select @age=Age from Baselnfo where StuNo=20209130501; print '学号为20209130501的学生的年龄'+ Convert(varchar,@age);--输出变量的值,等效于C#中的Console.WritrLine(@age) go 

案例2:查询学号在:哈哈 同学前一个和后一个的学生信息

案例代码:

declare @stuNo bigint; select @stuNo=StuNo from Baselnfo where Name='哈哈';  select * from Baselnfo where StuNo=@stuNo-1 or StuNo=@stuNo+1; go 

案例3:找表中年龄最大的学生

案例代码:

declare @maxAge int; declare @name nvarchar(50); select @maxAge=Max(Age) from Baselnfo; select @name=Name from Baselnfo where Age=@maxAge; print @name; go 

2、内联接查询

查询男女生C#科目的平均成绩

案例代码:

select Gender,AVG(Score) from BaseInfo bi inner join StuScore ss on bi.StuId=ss.StuId  where Subject='C#'group by Gender; 

3、逻辑控制语句if-else

根据男女生C#科目的平均分,若男生的高于女的,则输出男生C#平均分高于女生,否则输出女生C#平均分高于男生。

案例代码:

--求男生的平均分 declare @maleAVG float; select @maleAVG=AVG(Score) from BaseInfo bi inner join StuScore ss on bi.StuId =ss.StuId where Subject='C#' and Gender='1';  --求女生的平均分 declare @femaleAVG float; select @femaleAVG=AVG(Score) from BaseInfo bi inner join StuScore ss on bi.StuId =ss.StuId where Subject='C#' and Gender='0';  if(@maleAVG>=@femaleAVG) begin print'男生C#的平均分大于女生平均分' end    else begin print'女生C#的平均分大于男生平均分' end go 

4、多分支语句:case...end

案例代码:

select StuId '学号',Name '姓名',(case when Gender=1 then '男' else '女' end) as'性别' from BaseInfo; 

--case语句的第一种格式:case后不带条件表达式,而是在when子句后带条件表达式,若条件表达式为真,则执行相应的then子句后的子句.

select StuId '学号',Name '姓名',(case when Gender=1 then '男' else '女' end) as'性别' from BaseInfo 

case语句的第二种格式:case后带有条件表达式

select StuId '学号',Name '姓名',(case Gender when 1 then '男' else '女' end) as'性别' from BaseInfo 

5、用case... end来判断平均分大小

案例代码:

select distinct'比较大结果'= (case when @maleAVG>@femaleAVG then '男生的C#的平均分大于女生的平均分' when @maleAVG=@femaleAVG then '男生的C#的平均分等于女生的平均分' else '男生的C#的平均分小于女生的平均分'  end) from StuScore; 

6、while循环

--在T-SQL中,循环使用while语句来实现

--查询SQLSever科目的平均分 declare @AVGScore float; select @AVGScore=AVG(Score) from StuScore where Subject='SQLSever'; while(@AVGScore<80) begin   update StuScore set Score=Score+1 where Subject='SQLSever' and Score<100;  select @AVGScore=AVG(Score) from StuScore where Subject='SQLSever'; end print @AVGScore go 

第三章

1、子查询

查询“张瑛”同学高于八十分的成绩信息

1.1联合查询

select * from StuScore t1,BaseInfo t2 where  t1.StuId= t2.StuId and Score>80 and Name='张瑛'; 

1.2使用子查询来实现

1.2.1子查询作为临时表来使用

 select  s2.StuId,s2.Name,s1.Subject,s1.Score from  BaseInfo s2,  (select * from StuScore where Score>80) s1  where Name='张瑛' and s1.StuId=s2.StuId; 

1.2.2 子查询作为查询条件来使用

查询学号比张瑛同学小的,且挨得最近的一个学生信息

select top 1 * from BaseInfo where StuId< (select StuId from BaseInfo where Name='张瑛') order by StuId desc; 

1.2.3子查询作为列来使用

查询所有学生的C#成绩信息,若无分数则显示null

select bi. *, (select score from StuScore ss where bi.StuId=ss.StuId and Subject='C#')CSharpScore  from BaseInfo bi 

2、 使用in和not in 完成子查询

--使用in完成子查询 select Name as'姓名' from BaseInfo where StuId in   (select StuId from StuScore where Subject='C#' and Score>=70)      --使用not in来完成子查询   select StuId as '学号', Name as'姓名' from BaseInfo where StuId not in   (select StuId from StuScore where Subject='C#' and Score>=70);  

3、使用exists和not exists完成子查询

-- 使用exists查询存在成绩的学生的学号和姓名 select StuId,Name from BaseInfo where exists (select StuId from StuScore where StuScore.StuId=BaseInfo.StuId)  --  使用exists查询不存在成绩的学生的学号和姓名  select StuId,Name from BaseInfo where not exists (select StuId from StuScore where   

4、使用some,any,all进行子查询

查询学号为20209130203不低于学号20209130504最高分还要高的成绩信息

--使用all select Subject, Score from StuScore where StuId=20209130503 and Score> all (select Score from StuScore where StuId=20209130504) --使用any  select Subject, Score from StuScore where StuId=20209130503 and Score> any (select Score from StuScore where StuId=20209130504) --使用some  select Subject, Score from StuScore where StuId=20209130503 and Score> some (select Score from StuScore where StuId=20209130504)  

5、排序函数

5.1 ROW_NUMBER()函数:没有并列编号,不跳空编号

select ROW_NUMBER() over(order by Score desc) as '名次',bi.StuId '学号',Name '姓名',Score '分数'  from StuScore ss, BaseInfo bi where Subject='C#' and ss.StuId=bi.StuId;  

5.2 RANK()函数:有并列编号,有跳空函数

select RANK() over(order by Score desc) as '名次',bi.StuId '学号',Name '姓名',Score '分数'  from StuScore ss, BaseInfo bi where Subject='C#' and ss.StuId=bi.StuId;  

5.3 DENSE_RANK()函数:有并列编号,没有跳空编号

select DENSE_RANK() over(order by Score desc) as '名次',bi.StuId '学号',Name '姓名',Score '分数'  from StuScore ss, BaseInfo bi where Subject='C#' and ss.StuId=bi.StuId;  

6、公式表表达式

--将公式表表达式(CTE)视为临时结果集,在select,insert,update,delete或create vlew 语句的执行范围内进行定义 with ScoreInfo(StuId ,Name ,Score ,Subject) as (select bi.StuId '学号',Name '姓名',Score '分数',Subject as'科目' from StuScore ss, BaseInfo bi where Subject='C#' and ss.StuId=bi.StuId) select * from ScoreInfo go  

第四单元 视图和索引

4.1、创建视图

--如果有视图则删除 if exists( select * from sysobjects where name='ew_Student') begin drop view ew_Student end go --创建视图 create view ew_Student as ( select bi.StuId, Name,Gender,ExamNo,Subject,Score  from BaseInfo bi,StuScore ss where bi.StuId=ss.StuId ) go  --案例2 --创建视图ew_Student2, create view ew_Student2 as ( select bi.StuId as '学号', Name as '姓名',Gender as '性别',ExamNo,Subject as '科目',Score as '成绩'  from BaseInfo bi  left join StuScore ss on bi.StuId=ss.StuId ) go --查询视图ew_Student2 select * from ew_Student2;   

4.2、创建索引

--创建索引 if exists(select * from sysindexes where name='TX_score') begin drop index Studentinfo2.TX_score--删除索引 end go create nonclustered index TX_score on StuScore(score) with fillfactor=30 go  --查询StuScore表所有的索引 sp_helpindex StuScore  --使用索引进行查询 select * from StuScore with (index=TX_score);  

索引查询的语法:

select * from 表名with (index=索引名);

查询结果:

第五章 事务和游标

回滚事务:RollBack transaction

提交事务:commit transaction

系统事务:@@error

5.1、事务

5.1.1、事务的特性:

原子性,一致性,隔离性,持久性

5.1.2、事务可以分为三种类型:

显示事务,自动提交事务,隐式事务

案例代码:

--使用事务实现转账 begin transaction tran_Bank --开始一个事务 declare @error int--声明局部变量, set @error=0--变量初始值 update Bank set Yuer=Yuer-1000 where Name='桑永波'; set @error=@error+@@error; update Bank set Yuer=Yuer+1000 where Name='詹露'; set @error=@error+@@error; if(@error<>0) 	begin 	RollBack transaction--回滚事务 	print'转账失败' 	end  	else 	begin 	commit transaction--提交事务 	print'转账成功' 	end 	go  select * from Bank;  

5.2、游标

--游标 declare cursor_Mark cursor scroll for select * from StuScore;--定义游标  open cursor_Mark--打开游标  --检索游标 declare @examNo int declare @stuId bigint declare @Subject nvarchar(50) declare @Score float fetch first from cursor_Mark into @ExamNo,@StuId,@Subject,@Score   while(@@fetch_status=0) begin  if(@Score+5>100) update StuScore set Score=100 where examNo=@examNo else update StuScore set Score=Score+5 where examNo=@examNo  fetch next from cursor_Mark into @ExamNo,@StuId,@Subject,@Score end  close cursor_Mark--关闭游标  deallocate cursor_Mark--删除游标   

第六章 存储过程

concat:字符拼接

output:输出参数

intput:输入参数

sp:系统存储过程

xp:调用操作系统

up:自定义存储过程

sp_helpindex:查看某个表的索引

sp_stored_procedures:列出当前环境中的所有存储过程

6.1、存储过程

--案例1: --创建存储过程(不带参数的) --查询参加了考试的所有学生信息 if exists(select * from sysobjects where name='sp_Score') drop proc sp_Score go create proc sp_Score as 	select bi.StuId ,bi.Name,ss.ExamNo,ss.Score,ss.Subject 	from BaseInfo bi,StuScore ss 	where bi.StuId=ss.StuId go --2.调用存储过程 exec sp_Score  --案例2: --根据学生姓名查询参加了考试的所有学生信息 if exists(select * from sysobjects where name='sp_ScoreByName') drop proc sp_ScoreByName go create proc sp_ScoreByName @Name nvarchar(50)='张英'--参数带有默认值 as 	select bi.StuId ,bi.Name,ss.ExamNo,ss.Score,ss.Subject 	from BaseInfo bi,StuScore ss 	where bi.StuId=ss.StuId and Name=@Name go exec sp_ScoreByName '牛开军' --案例3: --根据学生姓名查询该学生的C#成绩信息 if exists(select * from sysobjects where name='sp_ScoreByNameandSubJect') drop proc sp_ScoreByNameandSubJect go create proc sp_ScoreByNameandSubJect @Name nvarchar(50)='张英',--参数带有默认值 @Score float output--输出参数 as 	select @Score=Score 	from BaseInfo bi,StuScore ss 	where bi.StuId=ss.StuId and Name=@Name and Subject='C#' go declare @Score float--先声明输出参数对应的变量 exec sp_ScoreByNameandSubJect '张英' , @Score output print concat('张英的C#成绩是:',@Score)  --扩展内容:将学习成绩表BaseInfo表中的学号和姓名列显示为“学号-姓名”格式 select Convert( varchar,StuId)+'-'+Name from BaseInfo select concat(StuId,'-',Name) from BaseInfo   

第七章

触发器的类

delete 触发器

update触发器

insert触发器

7.1、创建触发器

语法:

create trigger trig_insert
on TransInfo for insert
as

案例代码:

create trigger trig_insert on TransInfo for insert  as declare @accountNumber varchar(20),@transType nvarchar(20),@transMoney money  select  @accountNumber=AccountNumber,@transType=TransType,@transMoney=TransMoney from inserted; if(@TransType='存入') begin update Account set CurrentMoney=CurrentMoney+@transMoney where AccountNumber=@AccountNumber select CurrentMoney from Account where AccountNumber=@accountNumber print '存款成功账户信息如下:' print '卡号:'+concat(@accountNumber,',存入金额',@transMoney) end else--交易类型为支取时 begin update Account set CurrentMoney=CurrentMoney-@transMoney where AccountNumber=@AccountNumber select CurrentMoney from Account where AccountNumber=@accountNumber print '存款成功账户信息如下:' print '卡号:'+concat(@accountNumber,',取出金额',@transMoney) end go insert into TransInfo Values('123456789','存入','200',getdate())