天天看點

2-1 T-SQL概述

<b>2-1 T-SQL概述</b>

u      T-SQL代碼的基本格式及注釋

u      T-SQL文法全局變量與局部變量

u      T-SQL的臨時表和全局表

u      T-SQL的運算符号

T-SQL就是Transact-SQL,是标準 SQL 在MSSQL環境下程式設計語言的增強版,它是用來讓應用程式與SQL Server溝通的主要語言。T-SQL提供标準SQL的DDL和 DML功能,加上延伸的函數、系統預存程式以及程式設計結構(例如IF和WHILE)讓程式設計更有彈性,T-SQL的功能随著新版的SQL Server而持續成長。

<b>2-1-1 格式化的T-SQL代碼</b>

T-SQL的批處理是一組的擴充SQL語句,在一個批進行中可以包含一條或多條Transact-SQL語句,成為一個語句組。兩個GO之間的SQL語句作為一個批處理,見圖2-1所示。這樣的語句組從應用程式一次性地發送到SQL Server伺服器進行執行。SQL Server伺服器将批處理編譯成一個可執行單元,稱為執行計劃。

<a href="http://blog.51cto.com/attachment/201007/220351833.jpg" target="_blank"></a>

圖2-1 基本批處理是以GO語句為辨別點

<b>1. 注釋</b>

注釋是程式代碼中不執行的文本字元串(也稱為注解)。使用注釋對代碼進行說明,不僅能使程式易讀易懂,而且有助于日後的管理和維護。注釋通常用于記錄程式名稱、作者姓名和主要代碼更改的日期。注釋還可以用于描述複雜的計算或者解釋程式設計的方法。

在SQL Server中,可以使用兩種類型的注釋字元:

(1)單行注釋:

該方法是ANSI标準的注釋符“--”,它用于單行注釋;

(2)多行注釋:

該種方法是與C語言相同的程式注釋符号,即“/* */”。“/*”用于注釋文字的開頭,“*/”用于注釋文字的結尾,利用它們可以在程式中辨別多行文字為注釋。當然,單行注釋也可以使用“/* */”,我們隻需将注釋行以“/*”開頭并以“*/”結尾即可。反之,段落注釋也可以使用“--”,隻需使段落注釋的每一行都以“--”開頭即可。

實驗:建立第一個T-SQL實驗

首先,我們建立公司資料庫sample,該資料庫的基本表邏輯結構如圖2-2所示。

<a href="http://blog.51cto.com/attachment/201007/220436261.jpg" target="_blank"></a>

圖2-2 Sample資料庫的基本表

Use sample --該批處理執行打開資料庫sample

Go /*批處理結束标志*/

--該批處理檢索項目部員工

Select * From 員工資料表 Where 所屬部門=’項目部’ and 工資&gt;2000 Order by 姓名

Go/*批處理結束标志*/

--下面的批處理建立視圖

Create view PM_View

As

Select * from 員工資料表 where 所屬部門=’項目部’

Go

<b>2. 結束TSQL語句的标準</b>

TSQL标準規定在每個指令行末尾使用分号結束該部分的批處理TSQL語句,但需要注意的是,TSQL編碼時候分号是可選擇的,但是請不要在下面的位置使用分号:

(1)    不要在try end後面添加分号

(2)    不要在if語句後面添加分号

(3)    必須在SET之前添加分号

<b>2-1-2 T-SQL文法變量</b>

變量是一種語言中必不可少的組成部分。Transact-SQL語言中有兩種形式的變量,一種是使用者自己定義的局部變量,另外一種是系統提供的全局變量。

<b>1. 全局變量</b>

SQL Server系統本身就提供了一些全局變量。全局變量是SQL Server系統内部使用的變量,其作用範圍并不僅僅局限于某一程式,而是任何程式均可以随時調用。全局變量通常存儲一些SQL Server的配置設定值和統計資料。使用者可以在程式中用全局變量來測試系統的設定值或者是Transact-SQL指令執行後的狀态值。在使用全局變量時應該注意以下幾點:

(1)    全局變量不是由使用者的程式定義的,它們是在伺服器定義的。

(2)    使用者隻能使用預先定義的全局變量。

(3)    引用全局變量時,必須以标記符“@@”開頭。

(4)    局部變量名稱不能與全局變量名稱相同,否則會在應用程式中出現不可預測的結果。

    表2-1 基本全局變量含義表

全局變量名

含義

@@ERROR

最後一個T-SQL錯誤的錯誤号

@@IDENTITY

最後一次插入的辨別值

@@LANGUAGE

目前使用的語言的名稱

@@MAX_CONNECTIONS

可以建立的同時連接配接的最大數目

@@ROWCOUNT   

受上一個SQL語句影響的行數

@@SERVERNAME

本地伺服器的名稱

@@TRANSCOUNT 

目前連接配接打開的事務數

@@VERSION

SQL Server的版本資訊

SQL-sever提供的全局變量共有33個,但是并不是每一個都會經常用到,基本的全局變量見表2-1所示。下面舉例說明部分全局變量的用法:

實驗: T-SQL全局變量實驗

Use sample

<b>--</b><b>例1</b><b>:檢測限制檢查沖突</b>

--将項目部的工資更新為

Update 員工資料表 Set 工資=3000 where 所屬部門='項目部'

--檢查是否出現限制檢查沖突

If @@ERROR=547

print '出現限制檢查沖突,請檢查需要更新的資料'

--@@ERROR全局變量将傳回最後執行的T-SQL語句的錯誤代碼,資料類型為integer,如果成功@@ERROR傳回0,否則傳回錯誤代碼。有關錯誤代碼的資訊請在sysmessages系統表中查找。

-- print關鍵詞是列印輸出的語句,既可以輸出“字元串”或者“字元串常量”或者“字元串變量”

--例如:Print '你好嗎?'

Print @@version

<b>--</b><b>例2</b><b>:全局變量@@CONNECTIONS</b><b>,檢測連接配接次數</b>

SELECT GETDATE( ) AS '目前的時期和時間', @@CONNECTIONS AS '試圖登入的次數'

<b>--</b><b>例3</b><b>:全局變量@@RowCount</b><b>的用法</b>

--@@RowCount全局變量用以判别查詢是否成功,并傳回查詢到的行數。

Use school

GO

update student set sname='叮當' where sname='老叮當';

if @@rowcount=0

 begin

    print '沒有修改任何行'

End

<b>2. 局部變量</b>

局部變量是一個能夠擁有特定資料類型的對象,它的作用範圍僅限制在程式内部。局部變量被引用時要在其名稱前加上标志“@”,而且必須先用DECLARE指令定義後才可以使用。 

(1)    定義局部變量的文法形式如下:

DECLAER {@local_variable data_type} […n]

其中,參數@local_variable用于指定局部變量的名稱,變量名必須以符号@開頭,并且局部變量名必須符合SQL Server的命名規則。參數data_type用于設定局部變量的資料類型及其大小。data_type可以是任何由系統提供的或使用者定義的資料類型。但是,局部變量不能是 text,ntext 或 image 資料類型。

(2)    定義局部變量的文法形式如下:

使用DECLARE指令聲明并建立局部變量之後,會将其初始值設為NULL,如果想要設定局部變量的值,必須使用SELECT指令或者SET指令。兩種文法形式為:

q        SET { { @local_variable = expression } 

q        SELECT { @local_variable = expression }[ ,...n ]

其中,參數@local_variable是給其指派并聲明的局部變量,參數expression是任何有效的SQL Server表達式。

實驗: T-SQL局部變量實驗

<b>--</b><b>例1</b><b>、通過SET</b><b>進行附值實驗</b>

go

declare @char1 float,@num char(40)

select @char1=max(degree) from score,course where cname='高等數學' and score.cno=course.cno

set @num='高等數學的最高成績是:'

print @num+Ltrim(STR(@char1)) --str函數的作用是将數值類型轉換成為char類型;Ltrim函數是去除左邊空格。

--問題說明:如果高等數學的最高成績查詢為空,則執行‘print @num+STR(@char1)’語句後顯示為空,表示空值與字元串拼接後顯示資訊也為空。

<b>--</b><b>例2</b><b>、通過SELECT</b><b>進行附值,需要注意的事項是:</b>

(1)如果查詢之中select傳回多個值,則僅僅将最後一個數值附值給變量

(2)如果沒有傳回值則保持目前的變量值

use school

declare @cc1 nvarchar(32)

select @cc1=sno from score

print @cc1 --此句話可以将局部變量@cc1正常顯示出來

print @cc1 

--由于已經執行Go語句,批處理結束,是以此句話執行錯誤,@cc1局部變量生命周期已經結束

<b>--</b><b>例3</b><b>、通過SELECT</b><b>進行附值</b>

declare @var1 nvarchar(30)

set @var1='張飛'

select @var1=sname from student where sno='0000'

print @var1 

--0000編号的學生是沒有的,此時@var1将顯示初始值“張飛”,如果有則顯示查詢到的資訊

select @var1=sname  from student  where sno='101'

print @var1

<b>--</b><b>例</b><b>4</b><b>、通過</b><b>SELECT</b><b>進行附值</b>

Use sample --調用sample資料庫

--開始聲明局部變量

Declare @max_salary int

--将其指派為全體員工的工資最大值

Select @max_salary=max(工資) from 員工資料表

<b>--</b><b>注意</b>:局部變量的作用範圍是從聲明該局部變量的地方開始到聲明局部變量的批處理或存儲過程的結尾。在局部變量的作用範圍以外引用該局部變量将引起文法錯誤。

<b>2-1-3 臨時表和全局表</b>

除了基本表和視圖意外,SQL Server還提供臨時表和全局表供資料庫通路者進行通路操作,從本質上來說,臨時表和全局表都屬于虛表,其生命周期視使用者通路情況而生成或者消失,唯一不同的是為建立者提供資料臨時通路,還是為所有資料庫通路使用者提供臨時的通路。

<b>1. 局部臨時表</b>

SQL Server支援局部臨時表(簡稱臨時表)。臨時表就是那些名稱以井号(#)開頭的表。如果當使用者斷開連接配接時沒有除去臨時表,SQL Server将在一定時間後自動除去臨時表。臨時表不存儲在目前資料庫内,而是存儲在系統資料庫tempdb内。

局部臨時表的建立方法與使用者表相同,其生命周期自批處理開始生成,自該批處理結束終止,該臨時表将從tempdb庫中被删除。局部臨時表往往在存儲過程開發中被設計,至該存儲過程結束終止。

實驗: T-SQL建立局部臨時表實驗

--例1:

create table #stupass

( sno int primary key, sname varchar(20), sdegree int, cname varchar(20));

<b>2. 全局臨時表</b>

以兩個井号(##)開頭的那些表名,在所有連接配接上都能夠通路到的表就是全局臨時表。如果在建立全局臨時表的連接配接斷開前沒有顯式地除去這些表,那麼隻要所有其它任務停止引用它們,這些表即被除去。當建立全局臨時表的連接配接斷開後,新的任務不能再引用它們。目前的語句一旦執行完,任務與表之間的關聯即被除去;是以通常情況下,隻要建立全局臨時表的連接配接斷開,全局臨時表即被除去。

實驗: T-SQL建立全局臨時表實驗

<b>--</b><b>例1</b><b>:</b>

create table ##stupass1

<b>3. 全局臨時表和局部臨時表的差異:</b>

二者在名稱、可見性和可用性上均不相同。本地臨時表的名稱以單個數字元号(#)打頭;它們僅對目前的使用者連接配接是可見的;當使用者從SQL Server執行個體斷開連接配接時被删除。全局臨時表的名稱以符号(##)打頭,建立後對任何使用者都是可見的,當所有引用該表的使用者從SQL  Server斷開連接配接時被删除。

例如,如果建立名為employees的表,則任何人隻要在資料庫中有使用該表的安全權限就可以使用該表,除非它已删除。如果建立名為 #employees的本地臨時表,隻有您能對該表執行操作且在斷開連接配接時該表删除。如果建立名為##employees的全局臨時表,資料表中的任何使用者均可對該表執行操作。如果該表在您建立後沒有其他使用者使用,則當您斷開連接配接時該表删除。如果該表在您建立後有其他使用者使用,則SQL Server在所有使用者斷開連接配接後删除該表。

<b>2-1-4 運算符</b>

運算符是一些符号,它們能夠用來執行算術運算、字元串連接配接、指派以及在字段、常量和變量之間進行比較。在SQL Server 2005中,運算符主要有以下六大類:算術運算符、指派運算符、位運算符、比較運算符、邏輯運算符和字元串串聯運算符。

<b>1. 算術運算符</b>

算術運算符可以在兩個表達式上執行數學運算,這兩個表達式可以是數字資料類型分類的任何資料類型。算術運算符包括加(+)、減(-)、乘(*)、除(/)和取模(%)。

<b>2. 指派運算符</b>

Transact-SQL 中隻有一個指派運算符,即(=)。指派運算符使我們能夠将資料值指派給特定的對象。另外,還可以使用指派運算符在列标題和為列定義值的表達式之間建立關系。

<b>3. 位運算符</b>

位運算符使我們能夠在整型資料或者二進制資料(image 資料類型除外)之間執行位操作。此外,在位運算符左右兩側的操作數不能同時是二進制資料。表2-2列出了所有的位運算符及其含義。

    表2-2 位運算符

運算符

&amp;(按位 AND)

按位 AND(兩個操作數)

|(按位 OR)

按位 OR(兩個操作數)

^(按位互斥 OR)

按位互斥 OR(兩個操作數)

<b>4. 比較運算符</b>

比較運算符亦稱為關系運算符,用于比較兩個表達式的大小或是否相同,其比較的結果是布爾值,即TRUE(表示表達式的結果為真)、FALSE(表示表達式的結果為假)以及UNKNOWN。除了text,ntext 或 image 資料類型的表達式外,比較運算符可以用于所有的表達式。

<b>5. 邏輯運算符</b>

邏輯運算符可以把多個邏輯表達式連接配接起來。邏輯運算符包括AND、OR和NOT等運算符。邏輯運算符和比較運算符一樣,傳回帶有 TRUE 或 FALSE 值的布爾資料類型。     三個運算符的優先級别為:NOT,AND,OR。

<b>6. 字元串串聯運算符</b>

字元串串聯運算符允許通過加号(+)進行字元串串聯,這個加号即被稱為字元串串聯運算符。例如對于語句SELECT ’abc’+’def’,其結果為abcdef。

<b>7. 運算符的優先級</b>

在SQL Server 2005中,運算符的優先等級從高到低如下所示,如果優先等級相同,則按照從左到右的順序進行運算。

(1)       括号:();

(2)       乘、除、求模運算符:*,/,%;

(3)       加減運算符:+,-;

(4)       比較運算符:=,&gt;,&lt;,&gt;=,&lt;=,&lt;&gt;,!=,!&gt;,!&lt;;

(5)       位運算符:^,&amp;,|;

(6)       邏輯運算符:NOT;

(7)       邏輯運算符:AND;

(8)       邏輯運算符:OR。

本文轉自 qianshao 51CTO部落格,原文連結:http://blog.51cto.com/qianshao/348282,如需轉載請自行聯系原作者