2017年10月11日 星期三

Transact-SQL的組成元素

Transact-SQL的組成元素
結構化查詢語言的英文全名是Structured Query Language,簡稱SQL
由於微軟公司對SQL ServerSQL做了不小程度的擴充,因此特別將SQL ServerSQL稱之為Transact-SQL

不論是主從架構、多階層式架構,以至於Database Web應用程式,SQL Server皆扮演後端資料庫的角色。此意味著,SQL Server必須搭配一個前端工具來使用,如此可互補不足,達到最完美的境界。

事實上利用各種前端工具(例如:Visual BasicAccessVisual C++…)所開發的前端程式除了使用其本身的獨特介面來存取SQL Server之外,亦能直接呼叫後端SQL ServerTransact-SQL命令敘述來完成特定作業。

仔細歸納後發現Transact-SQL的組成元素不外乎是下列各項:
(即依命令敘述所扮演的角色、定位、功能效用來加以分門別類)
    資料定義語言(Data Definition LanguageDDL)
    資料處理語言(Data Manipulation LanguageDML)
    資料控制語言(Data Control LanguageDCL)
    系統預存程序(System Stored Procedure)
    其他的組成元素

※資料定義語言(Data Definition LanguageDDL)
係指用來定義與管理資料庫及其所內含之各類物件的命令敘述,例如:建立、更改、刪除資料庫;資料表、檢視表、使用者自訂資料型態等物件的命令皆屬之。
形式如下:
CREATE object_name
ALTER object_name
DROP object_name
在預設狀態下,只有sysadmindbcreatordb_ownerdb_ddladmin等角色成員有權執行DDL命令敘述。
如果有不同的使用者帳戶建立物件,可以使用系統預存程序sp_changeobjectowner去改變物件的擁有者。(注意:只有db_owner角色的成員,或同時為db_ddladmindb_securityadmin兩角色的成員,有權執行系統預存程序sp_changeobjectowner)
※資料處理語言(Data Manipulation LanguageDML)
係指用來查詢、新增、修改、刪除資料庫中之資料的命令敘述。
包括:
SELECT
INSERT
UPDATE
DELETE
在預設狀態下,只有sysadmindbcreatordb_ownerdb_datawriter等角色的成員有權執行DML命令敘述。

※資料控制語言(Data Control LanguageDCL)
係用來設定或變更資料庫使用者或角色之權限的命令敘述。
包括:
GRANT  能夠賦予使用者去存取某資料庫物件或執行特定Transact-SQL命令敘述的權限。
DENY    能夠否決使用者的某項權限,並防止使用者去繼承其群組或角色成員的權限。
REVOKE 能夠將先前所賦予或否決的權限移除。
在預設狀態下,只有sysadmindbcreatordb_ownerdb_securityadmin等角色的成員有權執行DCL命令敘述。

※系統預存程序(System Stored Procedure)
乃內建的預存程序,其主要功能是用來完成各項管理工作,係存放在系統資料庫master中且名稱會以sp_開頭。
比方說,可以使用系統預存程序sp_addtype去定義一個使用者自訂資料型態、使用系統預存程序sp_rename去更改資料庫物件的名稱、使用系統預存程序sp_configure去設定伺服器的組態選項等等。

※其他的組成元素
包括:
1.      註解
2.      區域性變數
3.      運算子
4.      函數
5.      流程控制語言







※常數
一個常數(Constant)是一個固定的資料項目、一個純量值、或是一個代表特定資料值的符號,常數的格式依其所代表之資料值的資料型態而有所不同。

文字串常數
  必須內含在一對單引號中,並且會使用電腦的字碼頁(Code Page)來評量。
  例如:
  ‘章立民
  ‘處理中,請稍後…’
  ‘輸入值必須介於30000100000’
  如果將連結選項SET QUOTED_IDENTIFIER設定成OFF,亦可將文字串內含在一對雙引號中(文字串可含單引號)
  一般如果欲採用將文字串內含一單引號中的格式,例如:文字串It’s long則以:
  ‘It’’s long’ 
將文字串本身所內含的單引號以兩個單引號來表示。
  值得注意的是連續兩個單引號且其中不含任何空格(亦即’’)就是代表空字串。
 
Unicode字串常數
  Unicode字串常數與文字串常數的格式類似,唯一的差別是必須以大寫字母N作為前導字元,其N代表National Language
  例如:
  ‘Language’是一個文字串常數,而N‘Language’則是一個Unicode字串常數,其常數會被解釋為Unicode資料,而且不會使用字碼頁來評量。
  Unicode資料的每一個字元使用2個位元組的儲存空間,而一般字元資料則是每一個字元使用1個位元組的儲存空間。
 
二進位常數
  二進位常數係以0x作為前導再加上後續的16進位數值來表示,而且不需要內含在一對引號中。
  例如:
  0xAE
  0x12Ef
  0x69048AEFDD010E
  0x   此為空二進位常數
 
Bit常數
  是以數目字01來表示,而且不需要內含在一對引號中。如果所使用的數目字大於1,則會被轉換成1
 
日期時間常數
  如果只指定日期,時間將預設是12:00AM,如果只指定時間,日期將預設是190011日。
  日期時間格式必須內含在一對單引號中。
  日期格式的年份還是採用 四位數 較為無虞。
 
字母日期格式有:
  ‘October 15, 2018’
  ‘Oct 15, 2018’
  ’15 Oct 2018’
  ‘2018 Oct 15’
  ‘2018 15 Oct’
 
  數字日期格式
  其年份、月份、日期全部使用數目字來表示,格式如:
  number separator number separator number
  其中separator為一個分隔字元,限為斜線(/)、連字號(-)、英文句號(.)
  ‘8/17/1999’
  ‘8-17-1999’
  ‘8.17.1999’
  ‘01/21/1999
  可自訂數字日期格式中日期數值的先後順序,使用語法如SET DATEFORMAT命令:
  SET DATEFORMAT {format | @format_var}
  參數format | @format_var用來決定三項日期數值的先後順序,其設定值如下:
  mdy  (例如:’12/31/1999’)
  dmy  (例如:’31/12/1999’)
  ymd  (例如:’1999/12/31’)
  ydm  (例如:’1999/31/12’)
  myd  (例如:’12/1999/31’)
  dym  (例如:’31/1999/12’)
  範例:
  SET DATEFORMAT ydm
  GO
  …
  DECLARE @datevar datetime
  SET @datevar = ‘2001/21/09’
  SELECT @datevar
  GO
 
  未分隔字串格式
  例如:
  ‘19990908’  即代表西元199998
 
 
  時間格式
  指定日期時間常數中的時間部分,採用下列格式:
  Hours [Minutes [Seconds] [Milliseconds] ] ] [AM | PM]
 
  Hours [Minutes [Seconds] [Milliseconds] ] ] [AM | PM]
  可以使用12小時制或24小時制,必須知道12:00 AM12:0000:00皆代表午夜12點。
  ’14:30:20:559’
  ’14:30:20.5’
  ‘2:30:20.5 PM’
  ‘02:30:20.5 AM’
  ’10:20:50 PM’
  ’16:30’
  ‘6PM’
  ‘6am’
 
  綜合討論
  日期時間常數的日期部分可以採用字母日期格式、數字日期格式、或未分隔字串格式,至於時間的部分則採用時間格式。同一個日期時間常數有非常多種表示方式,如:
  ‘10/15/2018  15:10:45’
  ‘10/15/2018  3:10:45 PM’
  ‘October 15 2018 15:10:45’
  ‘October 15 2018 3:10:45 PM’
  ‘2018 Oct 15 15:10:45’
  ‘10/15/2018 03:10:45 PM’
  ‘20181015 15:10:45’
  雖然日期時間常數有非常多種表示方式,不過最好統一採用某一種格式,如此在開發、維護、與偵錯時,方能降低其複雜度。
 
整數常數
  係以一連串的數目來表示,不包含小數點,而且不需內含在一對引號中,如:
  2991
  5
  10
 
Decimal常數
  係以一連串的數字來表示,可以包含小數點,且不需內含在一對引號中,如:
  2902.2231
  1.2
  3.22
 
 
FloatReal常數
  係以科學記號來表示,如:
  101.5E5
  0.5E-2
 
貨幣值常數
  係以一連串的數字來表示,可以包含或不包含小數點,以一個貨幣符號($)作為前導,且不需內含在一對引號中,如:
  $234
  $66000.32
 
全球性獨一識別碼常數
  能夠以文字串常數或二進位常數的形式來表示。
1.      文字串常數:只需將全球性獨一識別碼(Uniqueidentifier)內含在一對單引號中。
2.      二進位常數:以0x作為前導再加上後續的16進位數值。
下例為兩個完全相同的全球性獨一識別碼常數:
  ‘6F9619FF-8B86-D011-B42D-00C04FC964FF’
  0xff19966f868b11d0b42d00c04fc964ff
 

※指定正數與負數
對數字類型的常數而言,可以在其前方加上一個正號(+)或負號(-)來標示其為正值或負值。

※區域性變數(Local Variable)
通常將區域性變數當作一個計數器來使用,以便計算一個迴圈執行的次數,或是控制迴圈執行的次數。
再者,也可以使用區域性變數去存放自預存程序所傳回的資料值。

宣告區域性變數
在能使用一個區域性變數之前,必須先使用語法如下的DECLARE命令來宣告與建立它:
DECLARE {@local_variable data_type} […n]
其執行作業起始化如下:
    賦予區域性變數一個名稱
語法中的@local_variable引數用來指定區域性變數的名稱。必須以符號@開頭。
    決定區域性變數的資料型態與大小
語法中的data_type引數為設定它的資料型態與大小。惟資料型態不可以是textntextimage
  
    DECLARE命令於建立區域性變數後,會將其初值設定成NULL

DECLARE命令可以同時宣告多個區域性變數,只需以逗號(,)分隔即可。
範例:
1.      宣告一個名為@SearchName且資料型態為varchar(12)的區域性變數:
DECLARE @SearchName varchar(12)
2.      宣告一個名為@Birthday且資料型態為datetime的區域性變數:
DECLARE @Birthday datetime
3.      宣告一個名為@Height且資料型態為decimal(5,2)的區域性變數:
DECLARE @Height decimal(5,2)
4.      使用DECLARE命令敘述宣告三個區域性變數:
DECLARE @Name nvarchar(12) , @Phone nvarchar(11) , @Salary money


沒有留言:

用頭腦去思考,不要人云亦云才好, 宗教信徒就是依賴與自私心態(求東求西)的人, 光是這點就很容易暴露弱點了, 難怪seafood吃飽飽,哈哈。 續上, 除了依賴與自私心態(兩者都是人性)之外。 另外也有很大一部份的人,是人云亦云的思考邏輯, 所以宗教才能譁眾取寵。