SQL server學習(三)T-SQL編程、邏輯控制語句和安全模式


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

這樣操作比之前的方法可是要簡單了很多


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM