T-SQL 之 語法元素


一、標識符

  在T-SQL語言中,對SQLServer數據庫及其數據對象(比如表、索引、視圖、存儲過程、觸發器等)需要以名稱來進行命名並加以區分,這些名稱就稱為標識符。

  通常情況下,SQLServer數據庫、Oracle數據庫以及各種數據對象都應該有一個標識符,但對於某些對象來說,比如約束,標識符是可選的。推薦每個對象都使用標識符。

  1、常規標識符的規則

  [1] 首字符:標識符的第一個字符必須滿足下列條件:

  Unicode標准3.2定義的字母,通常就是字母a~z和A~Z。

  下划線(_)、at字符(@)、或數字符號(#)。

  [2] 后續字符:

  Unicode標准3.2中所定義的字母。

  基本拉丁字符或其他國家/地區字符中的十進制數字。

  at符號(@)、美元符號($)、數字符號或下划線。

  [3] 不能是保留字(默認關鍵字):

  常規標識符不能使用SQL Server內部的保留字,比如char。

  [4] 不允許嵌入空格:

  2、帶分隔符的標識符

  當一定要使用保留字時,如table,這樣的標識符是SQLServer內部的保留字,如果非得這樣使用,就必須用這樣的方式:"table"。

  (1)分隔符

  T-SQL規定下列符號為特定的分隔符。

  [1] 雙引號("):用於表示引用的標識符。

  [2] 中括號([]):用於表示括號中的標識符。

  (2)使用分隔符的情況

  T-SQL常在下列情況下使用分隔符。

  [1] 對象名稱或對象名稱的組成部分中包含保留字時。

  [2] 使用其他特殊的字符時。

二、數據類型

  T-SQL語言和SQLServer數據庫中的數據通常需要定義一個數據類型,數據類型定義了對象可以容納的數據的種類。

  1、需要聲明數據類型的對象

  (1)表 和 視圖的列:在定義表或視圖時,其列需要定義數據類型。

  (2)存儲過程的參數:在定義存儲過程的T-SQL代碼中定義參數的數據類型。

  (3)變量:如果在T-SQL中使用變量,需要定義數據類型。

  (4)帶返回值的函數:返回一個或多個特定類型數據值的T-SQL函數中的返回值需要定義數據類型。

  (5)帶返回代碼的存儲過程:具有返回代碼的存儲過程。

  2、選擇恰當的數據類型

  (1)必須

  首先根據需要判斷數據的類別、需要存儲的數據的最大長度和大小,對於數字數據類型還要考慮精度和小數位數,然后再T-SQL中挑選備用的數據類型。

  (2)夠用

  接下來可以在備用的數據類型中挑選夠用即可的類型作為最后的方案。比如要表述“身份證號碼”這樣的字段,nvarchar和nchar這樣的數據類型都可以,最后我們可以使用nchar(18),因為身份證號碼規定為統一的18位,所以選擇定長的數據類型。

  (3)權衡

  權衡空間和效率,權衡數據的存儲方式等。

  通常情況下,數據類型的長度越小,存儲大量數據所需要的存儲空間就越小。因此一次I/O讀取到內存中的數據記錄就會越多,同樣大小的內存空間存儲的記錄數量就會更多,這樣T-SQL語句使用數據時從內存讀取的幾率就增大了,所以自然效率就高,尤其是聯機事務頻繁的系統,這樣的設計優點就十分明顯。"細節決定成敗",數據類型的選擇恰當與否往往會對數據庫系統的性能產生非常大的影響。

  3、基本數據類型

名稱 說明 取值范圍
Bit 整數型 0、1或NULL,常用於代表Yes(No)、True(False)等
Int 整數型 -2147483648~2147483647
tinyint 整數型 0~255
smallint 整數型 -32768~32768
Bigint 整數型 -9223372036854775808~9223372036854775807
binary 二進制 1~8000字符的定長二進制數據,比如0x2A
varbinary 二進制 1~8000字符的變長二進制數據,varbinary(max)可以存儲2^31個字節
image 二進制 變長達20億字符的二進制數據
char 字符型 1~8000字符的定長、非Unicode字符數據
varchar 字符型 1~8000字符的非定長的、Unicode字符數據varchar(max)可以存儲2^31個字符
text 字符型 變長達20億字符的unicode字符數據
nchar unicode字符型 1~4000定長的、unicode字符數據
nvarchar unicode字符型 1~4000字符的非定長的、unicode字符數據,nvarchar(max)可以存儲2^31-1個字符
ntext unicode字符型 1~1073741823字符、非定長的、unicode字符數據
datetime 日期時間型 1753年1月1日~9999年12月31日的日期和時間
smalldatetime  日期時間型 1900年1月1日~2079年6月6日的日期和時間
decimal 精確數值型 -1038次方+1~1038-1的固定精度和范圍的數值型數據
numeric 精確數值型 同decimal
float 近似數值型 -1.79E+308~1.79E+308之間的浮點數
real 近似數值型 -3.40E+38~3.40E+38之間的浮點數
money 貨幣型 -263~263-1的貨幣型數據,精確到萬分之一
smallmoney 貨幣型 -214748.3648~214748.3647的貨幣型數據,精確到萬分之一
timestamp 特殊類型 時間戳,用於記錄SQLServer在一行數據的活動次序
uniqueidentifier  特殊類型 16位的16進制數據表示的全局唯一標識符(GUID)
sql_variant 特殊類型 存儲除了text、ntext、image和sql_variant之外的SQLServer支持的各種數據類型值的數據類型

  4、SQLServer2008新增數據類型

  [1] 日期和時間類型

名稱 取值范圍
Time 00:00:00.0000000到23:59:59.0000000,按照hh:mm:ss的格式精確表示時間
Date 00001-01-01到99999-12-31,按照年-月-日的格式表示日期
DateTime2 0001-01-01 00:00:00.0000000到9999-12-31 23:59:59:9999999,表示日期和時間
DateTimeOffset 00000-01-01 00:00:00.0000000到99999-12-31 23:59:59:9999999

  [2] hierarchid

  新增的數據類型,用於創建層次結構的表,或引用位於另一位置的數據層次結構。

三、常量

  常量是指在T-SQL代碼中其值始終不變的數據。常量的定義格式取決於其所屬於的數據類型。

  常量的使用不需要定義,直接在T-SQL中使用就可以,所以需要關注的是各種典型的常量的格式。

  1、數值型常量

  數值型常量的格式不需要任何其他的符號,只需要按照特定的數據類型進行賦值就可以

  (1)、bit常量:0、1

  (2)、int常量:89、22

  (3)、decimal(numeric)常量:123.89、89.0

  (4)、float(real)常量:100.5E5

  (5)、money(smallmoney)常量:$12、$123.90

 2、字符串型常量

  字符串型常量的格式需要以單引號(')包含起來。

  1、非unicode字符串常量:'Hello World'

  2、unicode字符串常量:N'Hello World'

  N 在這里表示Unicode,就是雙字節字符。對於西文字符,用一個字節來存儲過足夠了,對於東方文字字符,就需要兩個字節來存儲。Unicode 為了統一、規范、方便、兼容,就規定西文字符也用兩個字節來存儲。也就是說加 N 就表示字符串用 Unicode 方式存儲。但有時候加與不加都一樣,這是由於自動轉換造成的。

  3、單引號作為字符串常量的處理:

  如果單引號本身也屬於字符串常量的內容,就需要使用單引號將其包含在內,比如'O'''Brien'實際上定義的就是字符串O'Brien。''你好'',定義的就是'你好'。

  4、日期時間型常量的格式

  日期時間型常量的格式需要以單引號('')包含起來,和字符串常量的格式一致。

  如:'April 15,1998'  '04/15/98'  '14:30:24'  '04:24 PM'

四、注釋

  在T-SQL代碼中,添加注釋信息是一個很好的習慣,便於程序的可讀性。

  1、添加單行注釋

  如果需要添加單行注釋,可以使用兩個連字符(--)。

  如: select * from person  --查詢所有的人信息

  2、添加多行注釋信息

  如果需要添加多行注釋信息,可以使用正斜杠型號字符對(/**/)

五、變量

  在T-SQL語言中,經常需要使用變量來臨時賦值,變量常用於在T-SQL代碼中作為存儲執行的計數器,或作為臨時數據存儲場所。

 1、變量的數據類型

    SQLServer支持的數據類型。

 2、變量的分類

   (1)、全局變量

    T-SQL中的全局變量是由SQLServer系統定義和使用的變量。DBA和用戶可以使用全局變量的值,但不能自己定義全局變量。全局變量以兩個@@為標記,如        @@Connections等。

   (2)、局部變量

     T-SQL中的局部變量是由用戶定義和使用的變量,其作用范圍僅僅局限在定義的T-SQL程序內。局部變量以一個@為標記,如@A。

 3、局部變量的聲明

   在T-SQL程序中,定義局部變量的語法如下。

DECLARE
{{@local_variable data_type} |{@cursor_variable_name CURSOR} |{table_type_definition} }
[,...n]

  主要參數說明如下:

  [1] @local_variable:局部變量的名稱,必須以at符號(@)開頭,符合標識符規則。

  [2] data_type:任何有系統提供的或用戶定義的數據類型,但不能是text、ntext或image數據類型。

  [3] @cursor_variable_name:游標變量的名稱。

  [4] CURSOR:指定變量是局部游標變量,為關鍵字。

  [5]table_type_definition:定義表數據類型。

  4、局部變量的賦值

  T-SQL程序中給局部變量賦值有三種方法。

  [1] SET語句賦值

  在T-SQL程序中,用SET語句給局部變量賦值的語法如下:

SET @local_variable=expression

  其中,@local_variable為局部變量的名稱,expression為有效的表達式,表示將表達式的值賦予局部變量。

  [2] select語句賦值

  與上面的SET等效的賦值語句是將SET替換為SELECT。

SELECT @local_variable=expression

  [3] 通過選擇語句賦值

  很多情況下,局部變量需要獲取通過選擇語句查詢某個表后得到的字段值。

SELECT @empId = max(empId)  --查出的值賦給局部變量
FROM tableTest

  如果查詢語句返回的值不止一行,而且變量引用一個非標量表達式,那么最后變量的值將是最后一行記錄的特定字段的值。

 5、局部變量的作用域

  局部變量的作用域就是可以引用該變量的T-SQL語句的范圍。局部變量的作用域從聲明變量的地方到聲明變量的批處理或存儲過程的結尾。

六、SQLServer 數據庫常用全局變量

select APP_NAME ( ) as w --當前會話的應用程序

select @@IDENTITY   --返回最后插入的標識值 
select USER_NAME()    --返回用戶數據庫用戶名

SELECT @@CONNECTIONS  --返回自上次SQL啟動以來連接或試圖連接的次數。 
SELECT GETDATE() --當前時間 
SELECT @@CPU_BUSY/100  --返回自上次啟動SQL 以來 CPU 的工作時間,單位為毫秒

USE tempdb SELECT @@DBTS  as w  --為當前數據庫返回當前 timestamp 數據類型的值。這一 timestamp 值保證在數據庫中是唯一的。 
select @@IDENTITY as w --返回最后插入的標識值 
SELECT @@IDLE  as w  --返回SQL自上次啟動后閑置的時間,單位為毫秒 
SELECT @@IO_BUSY AS w   --返回SQL自上次啟動后用於執行輸入和輸出操作的時間,單位為毫秒 
SELECT @@LANGID AS w   --返回當前所使用語言的本地語言標識符(ID)。 
SELECT @@LANGUAGE AS w   --返回當前使用的語言名 
SELECT @@LOCK_TIMEOUT as w  --當前會話的當前鎖超時設置,單位為毫秒。 
SELECT @@MAX_CONNECTIONS  as w  --返回SQL上允許的同時用戶連接的最大數。返回的數不必為當前配置的數值 
EXEC sp_configure  --顯示當前服務器的全局配置設置 
SELECT @@MAX_PRECISION as w --返回 decimal 和 numeric 數據類型所用的精度級別,即該服務器中當前設置的精度。默認最大精度38。 
select @@OPTIONS  as w  --返回當前 SET 選項的信息。 
SELECT @@PACK_RECEIVED as w  --返回SQL自啟動后從網絡上讀取的輸入數據包數目。 
SELECT @@PACK_SENT as w  --返回SQ自上次啟動后寫到網絡上的輸出數據包數目。 
SELECT @@PACKET_ERRORS as w  --返回自SQL啟動后,在SQL連接上發生的網絡數據包錯誤數。 
SELECT @@SERVERNAME as w --返回運行SQL服務器名稱。 
SELECT @@SERVICENAME  as w --返回SQL正在其下運行的注冊表鍵名 
SELECT @@TIMETICKS  as w --返回SQL服務器一刻度的微秒數 
SELECT @@TOTAL_ERRORS AS w  --返回 SQL服務器自啟動后,所遇到的磁盤讀/寫錯誤數。 
SELECT @@TOTAL_READ  as w  --返回 SQL服務器自啟動后讀取磁盤的次數。 
SELECT @@TOTAL_WRITE as w  --返回SQL服務器自啟動后寫入磁盤的次數。 
SELECT @@TRANCOUNT  as w  --返回當前連接的活動事務數。 
SELECT @@VERSION as w  --返回SQL服務器安裝的日期、版本和處理器類型。

 


免責聲明!

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



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