1. 程式人生 > 其它 >SQL Server高階部分筆記

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())