T-SQL編程
T-SQL編程與C語言類似,只是語法稍有不同而已,總體思想還是沒有變化的。多的就不說了,還是從變量開始。
變量也分為全局變量和局部變量,表示方式稍有不同。
局部變量:
局部變量必須以標記@作為前綴,如@age
局部變量的使用也是先聲明,再賦值
全局變量:
全局變量必須以標記@ @作為前綴,如@@version
全局變量由系統定義和維護,我們只能讀取,不能修改全局變量的值
局部變量
聲明局部變量語法為:declare @變量名 數據類型
例:declare @age int declare @name nvarchar(10)
賦值的語法為:
set @變量名 = 值 或 select @變量名 = 值
例: set @name ='張三' select @name = stuname from stu where stuid='101'
使用select方法賦值需要注意的是:要確保篩選出來的數據只有一條
來看一個例子:
1 /*--查找一壺清酒的信息--*/ 2 declare @name varchar(8) --學員姓名 3 set @name='一壺清酒' --使用set賦值 4 select * from stuInfo where stuName = @name 5 /*--查找一壺清酒的左右同桌--*/ 6 declare @seat int --座位號 7 select @seat=stuSeat from stuInfo --使用select賦值 8 where stuName=@name 9 select * from stuInfo 10 where (stuSeat = @seat+1) or (stuSeat = @seat-1) 11 go
全局變量
聲明全部變量語法為:declare @@變量名 數據類型
常用的全局變量如下表所示:
變量 |
含義 |
@@ERROR |
最后一個T-SQL錯誤的錯誤號 |
@@IDENTITY |
最后一次插入的標識值 |
@@LANGUAGE |
當前使用的語言的名稱 |
@@MAX_CONNECTIONS |
可以創建的同時連接的最大數目 |
@@ROWCOUNT |
受上一個SQL語句影響的行數 |
@@SERVERNAME |
本地服務器的名稱 |
@@TRANSCOUNT |
當前連接打開的事務數 |
@@VERSION |
SQL Server的版本信息 |
再看一個例子:
1 print 'SQL Server的版本'+@@VERSION 2 print '服務器的名稱: '+@@SERVERNAME 3 insert into stuInfo(stuName,stuNo,stuSex,stuAge) 4 values('武松','s25328','男','23') 5 --如果大於0表示上一條語句執行有錯誤 6 print '當前錯誤號'+convert(varchar(5),@@ERROR) 7 print '剛才報名的學員,座位號為:' 8 +convert(varchar(5),@@IDENTITY ) 9 update stuinfo set stuAge=85 10 where stuName='一壺清酒' 11 print '當前錯誤號'+convert(varchar(5),@@ERROR) 12 go
error指的是錯誤號,返回為0表正確,沒有錯誤
邏輯控制語句
在c語言中,邏輯控制語句是if-else,switch,for,while,在sql編程中,也大相徑庭,這里的邏輯控制語句分別是:if-else,while,case-end語句
if-else語句
語法格式為:
if(條件) begin 語句1 語句2 end else begin 語句1 語句2 end
注意:begin…end相當於c語言中的大括號,有多條語句才使用begin…end,相當於begin…end之間的語句就是一個語句塊
看個實例更容易理解,例:
declare @myavg float select @myavg=avg(writexam) from stumake print '本班平均分' + convert(varchar(5),@myavg) if(@myavg>70) begin print '前三的成績為' select top 3 * from stumake order by writexam dese end else begin print '后三名的成績為' select top 3 * from stumake order by writexam asc end
在使用T-SQL編程時,可以切換視圖來查看結果,工具>選項>查詢結果>常規>顯示結果的默認方式>以文本格式顯示結果,查看效果更好
while循環語句
語法格式為:
while(條件) begin 語句1 語句2 break end
注意:break是表示結束循環,與c語言中的輔助控制語句break,continue類似
看個實例:
declare @n int while(1=1) --條件永遠成立 begin select @n=count(*) from stuMarks where writtenExam<60 --統計不及格人數 if (@n>0) update stuMarks --每人加2分 set writtenExam=writtenExam+2 else break --退出循環 end print '加分后的成績如下:' select * from stuMarks
case-end多分支語句
語法格式為:
case when 條件1 then 結果1 when 條件2 then 結果2 else 其他結果 end
看個成績等級實例就很清楚了,例:
print 'ABCDE五級顯示成績如下:' select stuNo,成績= case when writtenExam<60 then 'E' when writtenExam between 60 and 69 then 'D' when writtenExam between 70 and 79 then 'C' when writtenExam between 80 and 89 then 'B' else 'A' end from stuMarks
注意:之前代碼中出現過go,批處理標志是go,批處理是將一些邏輯相關的業務操作語句放置在同一批中,同時操作
再看一個實例:
根據如下規則對機試成績進行反復加分,直到平均分超過85分為止。請編寫T-SQL語句實現。
90分以上: 不加分
80-89分: 加1分
70-79分: 加2分
60-69分: 加3分
60分以下: 加5分
1 select * from stuMarks --原始成績 2 declare @labAvg int --聲明變量,用戶臨時存放平均分 3 while(1=1) --條件一直成立 4 begin 5 update stuMarks 6 set labExam=case 7 when labExam<60 then labExam+5 --設置加分條件 8 when labExam between 60 and 69 then labExam+3 9 when labExam between 70 and 79 then labExam+2 10 when labExam between 80 and 89 then labExam+1 11 else labExam 12 end 13 select @labAvg=avg(labExam) from stuMarks --獲取目前平均分,判斷是否還據需加分 14 if @labAvg>=85 15 break --如果已經大於或等於85就執行break,跳出循環 16 end 17 select * from stuMarks --加分后的成績
安全模式
在SQL server學習(一)的帖子中,有提到過安全模式(設置權限),但都是用手動操作,現在講一種代碼實現的方式
登錄驗證有兩種方式:
SQL身份驗證:適合於非windows平台的用戶或Internet用戶, 需要提供帳戶和密碼
Windows身份驗證:適合於windows平台用戶,不需要提供密碼,和windows集成驗證
登錄帳戶相應有兩種:SQL 帳戶和Windows帳戶
創建登錄
添加 Windows登錄帳戶
exec sp_grantlogin 'HONG-PJ3108YT43\Administrator' –域名\用戶名,域名為本機計算機名,用戶名為計算機下的用戶
添加 SQL登錄帳戶
exec sp_addlogin ‘yihuqingjiu', ‘123456’ --用戶名,密碼
exec表示調用存儲過程,存儲過程類似C語言的函數,在后面文章會講到
創建數據庫用戶
創建數據庫用戶需要調用系統存儲過程sp_grantdbaccess,其用法為:
exec sp_grantdbaccess ‘登錄帳戶名’,’數據庫用戶名’
其中,“數據庫用戶“為可選參數,默認為登錄帳戶,即數據庫用戶默認和登錄帳戶同名。
在數據庫中添加兩個用戶
exec sp_grantdbaccess 'jbtraining\ww123456', 'ww123DBUser'
exec sp_grantdbaccess 'yihuqingjiu', 'yiDBUser'
系統內置的數據庫用戶
dbo用戶和guest用戶
dbo用戶:表示數據庫的所有者(DB Owner),無法刪除dbo用戶,此用戶始終會出現在每個數據庫中
guest來賓用戶:適用於沒有數據庫用戶的登錄賬號訪問,每個數據可有也可刪除,來賓用戶需要管理員授權,不然無法操作數據庫
授權的語法
grant 權限 [on 表名 ] to 數據庫用戶
例:
/*--為yiDBUser分配對表stuInfo的select, insert, update權限--*/ grant select, insert, update on stuInfo to yiDBUser /*--為ww123DBUser分配建表的權限--*/ grant create table to ww123DBUser
這樣操作比之前的方法可是要簡單了很多