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
這樣操作比之前的方法可是要簡單了很多
本文僅代表作者觀點,系作者@溫一壺清酒發表。歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。文章出處:http://www.cnblogs.com/hong-fithing/
轉載于:https://www.cnblogs.com/hong-fithing/p/7637948.html