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