一、T-SQL概述
SQL Server用於操作數據庫的編程語言為Transaction-SQL,簡稱T-SQL。T-SQL與PL/SQL不同,並沒有固定的程序結構。
T-SQL包括以下4個部分:
- DDL:定義和管理數據庫及其對象,例如create、alter和drop等。
- DML:實現對數據庫表各對象的操作,例如insert、update等。
- DCL:數據控制語言,實現對數據庫進行安全管理和權限管理等控制,例如grant、revoke、deny等。
- 附加的語言元素。T-SQL的附加語言元素,包括變量、運算符、函數、注釋和流程控制語句等。
在T-SQL中,命令和語句的書寫是不區分大小寫的。
二、T-SQL編程基礎
1、標識符
①T-SQL規則標識符
- 由字母、數字、下划線、@、#、$符號組成,其中字母可以是a-z或A-Z,也可以是來自其他語言的字母字符。
- 首字符不能為數字和$。
- 標識符不允許是T-SQL保留字。
- 標識符內不允許有空格和特殊字符
- 長度小於128
②界定標識符
對於不符合標識符規則的標識符,則要使用界定符方括號([])或雙引號(“”)將標識符括起來。如標識符[My Table]、“select”內分別使用了空格和保留字select。
2、數據類型
在SQL Server中提供了多種系統數據類型。除了系統數據類型外,還可以自定義數據類型。
①系統數據類型
(1)精確數字數據類型
- int
存儲整型數值,存儲數值范圍為-231~231-1。 - bigint
bigint比int能存儲更大的數值,存儲數值范圍為-263~263-1。 - smallint
數據類型的范圍數值比int更小,在-215~215-1之間。定義這種數據類型的時候一定要小心,要確定存儲的數據不會超過smallint所能存儲的數值范圍。 - tinyint
數據類型的范圍數值比smallint更小,存儲從 0 到 255 的整型數據。 - decimal/numeric
decimal[(p,s)]和numeric[(p,s)]這兩種數據類型用於存儲相同精度和范圍的數據(小數點的左、右兩邊存儲的數值位數相同),所能存儲的數值范圍為-1038+1~1038-1。
p表示指定小數點左邊和右邊可以存儲的十進制數字的最大個數,s指定小數位數。[(p,s)]的范圍為1≤p≤38,0≤s≤p。若省略s,則默認為0;若未附帶p及s,則numeric表示numeric(18),只能表示整數
(2)近似數字數據類型
- float
存儲小數點不固定的數值,存儲的數值范圍。為-1.79E+308~1.79E+308。 - real
與float非常相似,存儲數值范圍為-3.40E+38~3.40E+38。
(3)貨幣數據類型
- money
- smallmoney
(4)字符數據類型
- char
長度固定,最多可以定義8000個字符。如果定義一個列為char(n),則將存儲n個字符。當輸入少於定義的字符數時,剩余的長度將被在右邊的空格填滿。 - nchar
與char類型相似,但最多可以定義4000個字符,使用Unicode編碼。 - varchar
與char一樣,用於存儲字母數字數據,最多可定義8000個字符。二者不同之處在於varchar的每一行可以有不同的字符數,最大字符數未定義的最大長度。例如列定義為varchar(50),則該列數據最多可以有50個字符長。然而,如果列中只存儲了3個字符長的字符串,則只會使用3個字符的存儲空間。如果定義列時沒有指定大小,即varchar(),則其長度默認為1。
特別,varchar(max)可以定義超過8000個字符的字符串數據類型,最多1073741824個字符。【注意不是varchar(n)】 - nvarchar
定義方式與varchar相似,除了nvarchar使用Unicode格式存儲字符。
(3)日期和時間數據類型
- date
僅用來存儲日期,其范圍從0001年1月1日到9999年12月31日。date數據類型的格式是YYYY-MM-DD。 - time
只存儲基於24小時制的時間,其格式為hh:mm:ss[.nnnnnnn]。與date數據類型類似,為了給要存儲在列中的數據提供准確的數據類型,能存儲精確度達100納秒的數據。 - datetime
用於存儲從1753年1月1日到9999年12月31日之間的任何日期和時間。datetime不僅存儲日期,而且會在日期的旁邊存儲時間。如果只像定義為datetime的列存入日期,則會在存儲的日期中加入默認的時間12:00:00。 - datetime2
與datetime類似,datetime2用於存儲日期和時間。不同之處是,datatime2的數據類型秒的小數部分的精度更高。此外,該數據類型能存儲從0001年1月1日到9999年12月31日的日期。其格式為YYYY-MM-DD hh:mm:ss[.nnnnnnn]。 - smalldatetime
與datetime十分相似,除了smalldatetime可存儲的數值范圍是從1900年1月1日到2079年6月6日。該數值范圍的結束日期不是月末。
(4)二進制數據類型
- binary
存儲固定大小的二進制個十數據,最多可存儲8000字節。
這種數據類型主要用於存儲作為標記或標記組合的數據。例如存儲關於客戶的標記。需要了解客戶是否處於活動狀態(值為1)、最近一個月有無消費記錄(值為2)、最后一個月的消費額是否超過1000元(值為4)或者是否按時銷賬(值為8)。這將向數據庫中加入4個數據列。然而,若使用binary值,如果客戶有一個值為1101的二進制值,那么該客戶擁有的值為1+4+8,這表明客戶是活動的。最后一個月的消費額超過1000元並按時銷賬。 - varbinary
與binary十分相似,但是varbinary每一行的物理列大小隨存儲的值而不同。varbinary(max)能存儲長度超過8000個字符的數據,最多可存儲2GB,可用於存儲類似圖像這樣的數據。
(5)專用數據類型
- bit
該數據類型存儲的值為0或1.通常用於判定真假值。 - uniqueidentifier
用於存儲16位全局唯一標識符(UUID)。 - XML
②程序中的數據類型
(1)cursor
數據能夠以駐留內存的狀態進行存儲。游標,與表類似,有數據行和列,但它們的相似之處僅限於此。不同之處如:游標沒有索引。通過使用游標來建立數據集,以便一次處理一行數據。
(2)table
table數據類型與游標和表有幾分相似之處。該數據類型用於存儲行和列的數據,但不能在數據上建索引。此時,系統可以“一次處理一個數據集”的數據,就想處理一個標准的表那樣。
(3)sql_varint
可以根據存儲的數據改變數據類型,即用來存儲一些不同類型的數據類型。不過強烈不推薦使用這種數據類型。
3、表達式
表達式常指由常量、變量、函數等通過運算符按一定的規則連接起來的有意義的式子。
1.變量
T-SQL的變量分為局部變量和全局變量。
(1)局部變量
局部變量由用戶定義,一般出現在批處理、存儲過程和觸發器中,其作用范圍僅在程序內部。
局部變量必須先聲明,后使用。T-SQL還為局部變量提供了賦值語句。
①declare變量聲明語句,其語法格式為:
declare @變量1 [as] datatype,@變量2 [as] datatype...
- 局部變量名稱必須以@開始開頭
- as可以省略
- 賦初值NULL
局部變量的賦值有三種方式:
①在變量定義的時候對其賦值:
declare @變量1 [as] datatype = value,@變量2 [as] datatype = value...
②select賦值語句,其語法格式為:
select @變量1 = 表達式1,@變量2 = 表達式2...
- 用select命令可以一次給多個變量賦值
- 表達式可以為普通的value,也可以為查詢結果
- 當表達式為表的列名時,形式與普通查詢中使用列別名的用法類似。可以使用子查詢從表中一次返回多個值。如果查詢的結果為多行,則只會把最后一行的相應列值賦給變量,這與PL/SQL的處理方式不同,在PL/SQL中,不允許把多行查詢結果賦值給變量
③set賦值語句,其語法格式為:
set @變量 = 表達式
- 基本用法和select一樣,區別在於一條set賦值語句只能給一個變量賦值,而一條select語句可以給多個變量賦值
【示例】
declare @sumsal as numeric(10,2),@dno as tinyint select @dno = deptno,@sumsal = sum(sal) from emp where deptno = 10 group by deptno print cast(@dno as varchar)+':'+cast(@sumsal as varchar)
(2)全局變量
全局變量由SQL Server系統定義,通常用來跟蹤服務器范圍和特定會話期間的信息,不能被用戶顯式地定義和賦值。可以通過訪問全局變量來了解系統目前的一些狀態信息。
全局變量名以@@開頭。下面給出一些常用的全局變量。
全局變量 | 說明 |
---|---|
@@error | 上一條SQL語句報告的錯誤號 |
@@nestlevel | 當前存儲過程或觸發器的嵌套級別 |
@@rowcount | 上一條SQL語句處理的行數 |
@@servername | 本地服務器名稱 |
@@identity | 最后插入的標識值 |
@@spid | 當前用戶進程的會話id |
@@fetch_status | 上一條游標fetch語句的狀態 |
@@cpu_busy | SQL Server自上次啟動后的時間狀態 |
2.函數
函數是用來完成某種特定功能,並返回處理結果的一組T-SQL語句,處理結果成為“返回值”,處理過程成為“函數體”。
函數又分為系統內置函數和用戶自動以函數。SQL Server提供了大量系統內置函數,主要可以分為以下幾類:數學函數、字符串函數、日期函數、convert函數、聚合函數。
(1)數學函數
T-SQL中提供的常用的數學函數如下:
- abs():返回絕對值
- round(數值表達式,長度,[,類型]):舍入到指定長度或精度。類型為0,表示舍入,類型為非0,表示截斷
- power(m,n):返回m的n次冪
- trunc():將數字截斷到指定的位數
- %:求余數,SQL Server沒有mod(m,n),而用m%n代替
(2)字符串函數
- ltrim(str,substr)/rtrim(str,substr):str表示要操作的字符串,substr表示要裁剪的子串,若裁剪空格,則可以省略
- substring(str,position,length):求子字符串
- replace(str,search_str,rep_str):替換一個字符串中的子串。search_str表示要搜索的子字符串,rep_str表示要替換的目標字符串
- left(str,n):返回字符串從左邊開始的指定個數的字符
- len():求字符串長度
(3)日期和時間函數
首先列出日期時間函數中的重要參數。
日期時間元素 | 縮寫 | 含義 |
---|---|---|
year | yy,yyyy | 年 |
month | m,mm | 月 |
day | d,dd | 日 |
dayofyear | dy | 年的天數 |
week | wk | 星期數 |
weekday | dw | 星期幾 |
hour | hh | 時 |
minute | mi | 分 |
quarter | 刻 | |
second | ss | 秒 |
millisecond | ms | 毫秒 |
T-SQL中提供下列日期函數:
- getdate():返回當前的日期和時間
- year(日期):返回指定日期的“年”部分的整數
- month(日期):返回指定日期的“月”部分的整數
- day(日期):返回指定日期的“日”部分的整數
- datepart(日期元素,日期):返回日期元素指定的日期部分的整數
- datename(日期元素,日期):以字符串的形式返回日期元素指定時間的日期名稱
- datediff(日期元素,日期1,日期2):返回兩個日期間的差值並將其轉換為指定日期元素的形式
- dateadd(日期元素,數值,日期) :按照“日期元素”給定的日期單位,返回“日期”加上“數值”的新日期
涉及日期時間常量時,SQL Server建議使用與dateformat及語言環境設置無關的字符串格式,通常這樣的字符串常量符合下面兩種形式:
- 日期之間不使用分隔符,格式為yyyymmdd[ hh:mi:[:ss][,mmm]],如'20070703','20070703 17:53:00.997'。
- ISO 8601標准形式,格式為yyyy-mm-ddThh:mi:ss[.mmm],日期各個部分之間使用“-”分隔符,日期和時間部分用T分隔,並且時間部分不能省略,如'2007-07-03T17:53:10'。
(4)數據類型轉換函數
轉換的方式有隱式轉換和顯式轉換兩種。
隱式轉換是SQL Server自動地將數據從一種數據類型轉換為另一種數據類型,用戶不可見。
顯式轉換使用convert函數,該函數可以將一種數據類型的表達式強制轉換為另一種數據類型的表達式。兩種數據類型必須能夠進行轉換,例如,char值可以轉換為binary,但不能轉換為image。該函數的主要作用是把數值型或日期型數據轉換為字符串,而只包含數字的字符串轉換為數值型數據一般隱式轉換。
格式:convert(數據類型(長度),表達式[,n])
函數的第4個參數n是可選的,用於日期時間型數據類型和字符數據類型轉換。參數取值如下表所示。
不帶世紀數位 | 帶世紀數位 | 格式 |
---|---|---|
1 | 101 | mm/dd/yyyy |
2 | 102 | yy.mm.dd |
3 | 103 | dd/mm/yyyy |
4 | 104 | dd.mm.yy |
5 | 105 | dd-mm-yy |
8 | 108 | hh:mi:ss |
20或120 | yyyy-mm-dd hh:mi::ss(24h) |
【示例】
select ename+''''+'s sal is'+convert(char(7),sal) as 'EMPLOYEE'S SAL' from emp;
select cid as '客戶ID',cname as '客戶名稱' convert(char(10),cRegisterationDate,102) as '注冊日期' from customer; 最終顯示的日期格式就會如2006.12.02
3.運算符
算術運算符:+、-、*、/、%(求余)
字符串運算符:+(連接)
比較運算符:=、>、>=、<、<=、<>(不等於)、!>(不大於)、!<(不小於)
邏輯運算符:NOT、AND、OR、ALL(所有)、ANY(或SOME,任意一個)、BETWEEN...AND、EXISTS(存在)、IN(在范圍內)、LIKE(匹配)
按位運算符:&(位與)、|(位或)、^(按位異或)
一元運算符:+(正)、-(負)、~(按位取反)
賦值運算符:=(等於)
作者:水桶的魔法
鏈接:https://www.jianshu.com/p/a7bb06705916
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。