書名: 從零開始學SQL Server作者名: 桂穎等編著本章字數: 6887字更新時間: 2018-12-27 12:57:36
第2篇 SQL Server基礎篇
第3章 管理SQL Server 2005的工具——SQL語言
經過前面兩章的學習,我們已經對SQL Server 2005數據庫管理系統有了一個大致的概念,從這一章開始我們將對該數據庫管理系統的具體內容展開全面的介紹,讓讀者通過自己的努力去揭開SQL Server 2005的神秘面紗,本章將從SQL語言講起,讓讀者對SQL語言的基本語法先有一個大致的了解,為以后的學習打下一個基礎。本章的主要內容如下:
? SQL語言簡介。
? SQL語言中的數據類型。
? SQL語言中的變量。
? SQL語言中的運算符。
? SQL語言中的表達式。
3.1 SQL語言簡介
SQL是Structured Query Language(機構化查詢語言)的簡寫,是高級的非過程化編程語言,允許用戶在高層數據結構上工作。它不要求用戶指定對數據的存放方法,也不需要用戶了解具體的數據存放方式,所以具有完全不同底層結構的、不同數據庫系統可以使用相同的SQL語言作為數據輸入與管理的接口。最早是IBM的圣約瑟研究實驗室為其關系數據庫管理系統SYSTEM R開發的一種查詢語言,它的前身是SQUARE語言。SQL語言結構簡潔,功能強大,簡單易學,所以自從IBM公司1981年推出以來,SQL語言得到了廣泛的應用。如今無論是Oracle、Sybase、Informix、SQL Server這些大型的數據庫管理系統,還是Visual FoxPro、PowerBuilder這些在PC上常用的數據庫開發系統,都支持SQL語言作為查詢語言。
3.1.1 SQL語言的主要特點
SQL是一種面向數據庫的通用數據處理語言規范,它具有非常強大的功能,主要包括以下幾類:
? 提取查詢數據。
? 插入、修改、刪除數據。
? 生成、修改、刪除數據庫對象。
? 數據庫安全控制。
? 數據庫完整性及數據保護控制。
SQL語言的這些強大功能充分體現了關系數據語言的特點和優點。其主要的特點如下:
1.綜合統一
SQL語言集數據定義語言DDL、數據操縱語言DML、數據控制語言DCL的功能于一體,語言風格統一,可以獨立完成數據庫生命周期中的全部活動,包括定義關系模式、錄入數據以建立數據庫、查詢、更新、維護、數據庫重構、數據庫安全性控制等一系列操作要求,這就為數據庫應用系統開發提供了良好的環境。例如,用戶在數據庫投入運行后,還可根據需要隨時地、逐步地修改模式,并不影響數據庫的運行,從而使系統具有良好的可擴充性。
2.高度非過程化
非關系數據模型的數據操縱語言是面向過程的語言,用它完成某項請求,必須指定存取路徑。而用SQL語言進行數據操作,用戶只需提出“做什么”,而不必指明“怎么做”,因此用戶無須了解存取路徑,存取路徑的選擇及SQL語句的操作過程由系統自動完成。這不但大大減輕了用戶負擔,而且有利于提高數據獨立性。
3.面向集合的操作方式
SQL語言采用的是面向集合的操作方式,不僅查找結果可以是元組的集合,而且一次插入、刪除、更新操作的對象也可以是元組的集合。
非關系數據模型采用的是面向記錄的操作方式,任何一個操作其對象都是一條記錄。例如,查詢所有平均成績在80分以上的學生姓名,用戶必須說明完成該請求的具體處理過程,即如何用循環結構按照某條路徑一條一條地把滿足條件的學生記錄讀出來。
4.以同一種語法結構提供兩種使用方式
SQL語言既是自含式語言,又是嵌入式語言。
作為自含式語言,它能夠獨立地用于聯機交互的使用方式,用戶可以在終端鍵盤上直接輸入SQL命令對數據庫進行操作。作為嵌入式語言,SQL語句能夠嵌入到高級語言(如C、PB)程序中,供程序員設計程序時使用。而在兩種不同的使用方式下,SQL語言的語法結構基本上是一致的。這種以統一的語法結構提供兩種不同的使用方式的做法,為用戶提供了極大的靈活性與方便性。
5.語言簡潔,易學易用
SQL語言非常簡潔。雖然SQL語言功能很強,但它只有為數不多的幾條指令,另外SQL語言也非常簡單,它很接近英語自然語言,因此容易學習、掌握。
正是由于SQL語言的這些優點,它才能被廣泛使用,目前所有的關系型數據管理系統都支持某些形式的SQL語言,它使全部用戶,包括應用程序員、數據庫管理員和終端用戶。
3.1.2 如何分類SQL語言
在上一節中我們提到了SQL語言具有強大的功能,這些功能可以歸納為數據查詢、數據定義、數據操縱及數據控制,而我們給SQL語言分類也是從SQL語言所起的作用的角度進行的,所以我們可以將SQL語言分為以下幾類。
1.數據查詢語言(DQL,Data Query Language)
數據查詢語言是在SQL語言中,負責進行數據查詢而不會對數據本身進行修改的語句,這是最基本的SQL語句。
DQL的主要功能是查詢數據,本身內核指令為SELECT,為了進行精細的查詢,加入了各類輔助指令,其主條目包含SELECT、FROM、WHERE、GROUP BY和ORDER BY。
SELECT是查詢的指令,其語法結構為:
SELECT [要提取的字段,或是用 "*" 代表全部的字段] FROM [要提取的數據來源對象,包含數據表、檢視表與表格型使用者函數等] WHERE [提取的過濾條件] GROUP BY [要進行匯總的群組字段] HAVING [要作為條件的匯總字段] ORDER BY [要排序的字段與方向]
2.數據定義語言(DDL,Data Definition Language)
數據定義語言是在SQL語言集中,負責數據結構定義與數據庫對象定義的語言,由CREATE、ALTER與DROP 3個語法所組成,最早是由CODASYL (Conference on Data Systems Languages)數據模型開始,現在被納入SQL指令中作為其中一個子集。
? CREATE:是負責數據庫對象的建立,主要包括數據庫、數據表、數據庫索引、預存程序、用戶函數、觸發程序或是用戶自定型別等對象,都可以使用CREATE指令來建立,而為了各式數據庫對象的不同,CREATE也有很多的參數。
? ALTER:是負責數據庫對象修改的指令,相較于CREATE需要定義完整的數據對象參數,ALTER則可依照要修改的幅度來決定使用的參數,因此在使用上并不會太困難。
? DROP:是刪除數據庫對象的指令,并且只需要指定要刪除的數據庫對象名稱即可,在DDL語法中算是最簡單的。
3.數據操縱語言(DML,Data Manipulation Language)
數據操縱語言是在SQL語言中,負責對數據庫對象運行數據訪問工作的指令集,以INSERT、UPDATE、DELETE 3種指令為內核,分別代表插入、更新與刪除,是開發以數據為中心的應用程序必定會使用到的指令。
? DML主要功能即是訪問數據,因此其語法都是以讀取與寫入數據庫為主,除了INSERT以外,其他指令都可能要搭配WHERE指令來過濾數據范圍,或是不加WHERE指令來訪問全部的數據。
? INSERT是將數據插入到數據庫對象中的指令,可以插入數據的數據庫對象有數據表、可更新查看表兩種。
? UPDATE指令是依給定條件,將符合條件的數據表中的數據更新為新的數值。
? DELETE指令為從數據庫對象中刪除數據的指令。
4.數據控制語言(DCL,Data Control Language)
數據控制語言在SQL語言中,是一種可對數據訪問權進行控制的指令,它可以控制特定用戶賬戶對數據表、查看表、預存程序、用戶自定義函數等數據庫對象的控制權。由GRANT和REVOKE兩個指令組成。
這兩個指令的語法結構大致是:
GRANT [權限] ON [要授予權限的數據庫對象] TO [使用者賬戶名稱] WITH [授權選項] DENY [權限] ON [要授予權限的數據庫對象] TO [使用者賬戶名稱]
通過上面的介紹我們可以簡單地了解SQL語言的簡單分類,雖然在文中可能出現了很多讓初學者理解起來有些困難的詞匯,但是隨著我們學習的深入,初學者就能夠更加深刻地理解這些詞匯的含義。
3.1.3 SQL語法簡介
其實SQL命令并不是非常多,如果要把SQL用到出神入化,則只需要短短幾個命令就夠了,因為SQL命令是針對關系型數據庫所建立的語法敘述,所以SQL在這類數據庫中所發揮的功能非常的強。下面將對SQL語法基本命令進行簡單的介紹,在后面的學習中我們將詳細地介紹SQL語法中涉及的內容。大致上SQL語法所使用到的類型,基本上可以概括為以下幾類:
? 類屬性(Predicates):在SQL命令中用來指明要選擇記錄的方式。如ALL、TOP、DISTINCT等。
? 聲明(Declaration):針對SQL Parameter或Parameter Query的名稱與數據類型做聲明,如PARAMETERS的聲明等。
? 條件字句(Clause):在SQL的查詢中,利用一些表達式定義查詢的條件,以縮小尋找的范圍,如WHERE。
? 運算符(Operator)與操作數(Operation):在SQL的查詢中,與Operation共同組成表達式(Expression),如BETWEEN…AND運算符與INNER JOIN操作數。
? 函數(Function):一些常見的函數,如AVG()是求算數平均數的函數。
? SQL語句(Statement):SQL的語句,可以說是SQL語法的主體,用來對某一個特定的數據庫發出指示,并返回相關的數據,而SQL的語法結構,基本上可以利用下面的式子來表示:命令+條件子句。例如,SELECT*FROM TAB WHERE TAB.NAME='A'。
3.1.4 如何給標識符起名
計算機語言發展至今,標識符命名逐漸擺脫了早期不區分大小寫的書寫樣式,以及微軟借Windows平臺推薦和推廣的匈牙利命名法(Hungarian Notation),形成目前主流的命名規則,包括以下4種樣式:完全大寫、完全小寫、Pascal大小寫和Camel大小寫。所謂Pascal大小寫即組成標識符的每個單詞的首字母大寫,其余字母小寫的書寫約定;而Camel大小寫與Pascal大小寫相似,區別僅在于其標識符的首字母恒為小寫。此外,作為上述規則的補充約定,對于雙字母的縮寫單詞,Pascal大小寫要求它們全部大寫,而Camel大小寫則要求它們出現在標識符首部時全部小寫,否則全部大寫。需要強調的是,這條規則僅適用于縮寫的雙字母單詞,如“To”、“Is”、“As”這樣原生的雙字母單詞。
為了提供完善的數據庫管理機制,SQL Server設計了嚴格的命名規則。在創建或引用數據庫實體,如表、索引、約束等時,必須遵守SQL Server的命名規則,否則有可能發生一些難以預料和檢查的錯誤。
1.標識符分類
SQL Server的所有對象,包括服務器、數據庫及數據庫對象,如表、視圖、列、索引、觸發器、存儲過程、規則、默認值和約束等都可以有一個標識符。對絕大多數對象來說,標識符是必不可少的,但對某些對象(如約束)來說,是否規定標識符是可選擇的。對象的標識符一般在創建對象時定義,作為引用對象的工具使用。
SQL Server一共定義了兩種類型的標識符:規則標識符(Regular identifier)和界定標識符(Delimited identifier)。
2.規則標識符
規則標識符嚴格遵守標識符有關格式的規定,所以在Transact_SQL中凡是規則運算符都不必使用界定符。對于不符合標識符格式的標識符要使用界定符[]或‘’。
3.界定標識符
界定標識符是那些使用了如[]和‘’等界定符號來進行位置限定的標識符,使用界定標識符,既可以遵守標識符命名規則,也可以不遵守標識符命名規則。
4.標識符格式
? 標識符的首字母必須是以下兩種情況之一:
第一種情況是,所有在統一碼(Unicode)2.0標準規定的字符,包括26個英文字母a~z和A~Z,以及其他一些語言字符,如漢字。例如,可以給一個表格命名為“學生基本情況”。
第二種情況是, “ ”、“@”或“#”。
? 標識符首字母后的字符可以是下面3種情況:
第一種情況是,所有在統一碼(Unicode)2.0標準規定的字符,包括26個英文字母a~z和A~Z,以及其他一些語言字符,如漢字。
第二種情況是, “ ”、“@”、“$”或“#”。
第三種情況是,0,1,2,3,4,5,6,7,8,9。
?標識符不允許是T-SQL的保留字:由于T-SQL不區分大小寫,所以無論是保留字的大寫還是小寫都不允許使用。T-SQL的保留字如表3.1所示。
表3.1 T-SQL保留字

(續表)

? 標識符內部不允許有空格或特殊字符:最后還要說明的是,以某些特殊符號開頭的標識符在SQL Server系統中具有特定的含義。如“@”開頭的標識符表示這是一個局部變量或是一個函數的參數;以“#”開頭的標識符表示這是一個臨時表或存儲過程;一個以“##”開頭的標識符表示這是一個全局的臨時數據庫對象。T-SQL的全局變量以標識符“@@”開頭。為避免同這些全局變量混淆,建議不要使用“@@”作為標識符的開始。
無論是界定標識符還是規則標識符都最多只能容納128個字符,對于本地的臨時表最多可以有116個字符。
5.對象命名規則
SQL Server數據庫管理系統中的數據庫對象名由1~128個字符組成,不區分大小寫。在一個數據庫中創建了一個數據庫對象后,數據庫對象的全名應該由服務器名、數據庫名、擁有者名和對象名這4個部分組成,格式如下:
[[[server.][database].][owner_name].]object_name
命名必須都要符合標識符的規定。在實際引用對象時,可以省略其中某部分的名稱,只留下空白的位置。
6.實例的命名習慣
在SQL Server數據庫管理系統中默認實例的名字采用計算機名,實例的名字一般由計算機名和實例名兩部分組成。
總之,正確掌握數據庫的命名和引用方式是用好SQL Server數據庫管理系統的前提,也有助于用戶理解SQL Server數據庫管理系統中的其他內容。
3.2 數據類型大家族
任何一種高級語言都有數據類型的概念,SQL語言也不例外,在數據結構中數據類型的定義為一個值的集合及定義在這個值集上的一組操作。下面我們將對SQL語言的數據類型進行詳細的介紹,讀者在學習的時候可以和學過的其他高級語言中的數據類型進行比較學習。
3.2.1 SQL Server數據類型概述
在本節中我們可能會遇到一些以前沒有接觸到的概念,如表的創建,對于這些我們現在不用太關心,我們只要能夠理解什么時候需要用到數據類型,以及怎樣使用數據類型就可以了,至于具體的操作流程會在后面的章節中進行具體的介紹。
在計算機中數據有兩種特征,即類型和長度。所謂數據類型就是以數據的表現方式和存儲方式來劃分的數據種類。在SQL Server中每個變量、參數、表達式都有數據類型。
我們在對數據庫進行一些定義操作時需要指定數據類型,如定義表列就是一個典型的操作。Transact-SQL可以定義幾種數據類型,包括字符型、數字型和比特型的數據類型,在SQL Server的操作中需要用到數據類型的地方還有很多,例如,我們在定義存儲過程和表的時候都會用到。
使用文本和圖像數據類型定義2K字節以上的列并可以存儲多余2000000字節的數據。
我們在創建表時使用的度量單位稱為一個區域(extent)。當創建一個新表時,為表最初分配的空間設置為一個區域,它包括8個數據頁,每個數據頁的尺寸為2K字節,當表填滿類分配的區域后,會為表自動分配另外的存儲空間。
使用系統存儲過程或使用SQL企業管理器可以得到關于分配給某個表的存儲空間報告。
數據類型是在定義表列時需要考慮的第一個特性,表列的數據類型控制著可以存儲在表列中的信息類型。一旦定義了表列的數據類型,它就作為表列的一個永久性特征存儲起來而不能改變了。
還可以使用數據類型定義其他的數據存儲結構,如參數和本地變量,參數和本地變量結構的數據存儲在RAM中而不是在磁盤上,可以用于定義參數和本地變量的數據類型是數據類型的一個子集。
SQL Server還能夠自動限制每個數據類型的值的范圍。例如,我們在一個表列中定義了一個列的數據類型為int類型,但是我們在插入數據時插入的數據在smallint和tinyint范圍之內,SQL Server會自動將我們的類型轉化為smallint或者是tinyint,這樣使用tinyint或smallint數據類型存儲數據只需要int數據類型1/4或1/2的存儲空間,這對于使用作為標志、狀態指示等類型的數據非常有用。
SQL Server數據庫管理系統將數據類型大致分為了兩類,一類是系統默認的數據類型,另一類是用戶自定義數據類型。下面將對這兩類數據類型進行詳細的闡述。
3.2.2 系統數據類型
SQL Server中的數據類型大致分為以下7種類型:整數數據類型、浮點數據類型、二進制數據類型、邏輯數據類型、字符數據類型、文本和圖像數據類型、日期和時間數據類型。下面我們對這幾種數據類型進行逐一介紹,以便讀者對SQL Server數據類型有一個充分的認識。
1.整數數據類型
整數數據類型可以存儲整個數字,你可以在整數上直接操作算術運算符,而不是使用函數轉換,存儲在整數數據類型中的數據占據的存儲空間一樣,而不管其具體的數字位數是多少。
數據類型的名字,如integer,是大小寫敏感的。整數數據類型主要分為以下幾類:
? int數據類型:數據類型int或integer int(或integer)可以存儲在-(2E31)~2E31范圍內的任意整數。以int數據類型存儲的數據每一個占據4個字節的空間,使用31位存儲數字的絕對值,使用一位存儲正負號。
? smallint數據類型:存儲-32768~32767之間的整數。存儲在smallint數據類型中的值占據2個字節其中15位存儲絕對值,使用一位存儲正負號。
? tinyint數據類型:只能存儲0~255之間的整數,每個數據占據1個字節。
2.浮點數據類型
浮點數據類型是另一組數據類型,他不像整數型的數據類型,浮點數據類型可以存儲小數。
不幸的是,浮點數據類型要受到舍入誤差的限制,舍入誤差的浮點數據類型的精確度受指定的數據位數的影響。例如,如果指定數據類型位數是15位,則位數大于15的數據可以存儲,但是大于15的數位就不能精確地表達出來,還有因為誤差的存在計算返回的結果可能也不準確,舍入誤差會影響數的最低位。在浮點數據類型允許的位數范圍內,你可以精確存儲數據。
像浮點數據類型這樣的近似數值型的數據類型,因為存儲在其中的值只能在某個精度范圍內準確,要避免比較存儲在近似數值型的數據類型中的數據,因為原有的大于精度范圍位數的數據會經過舍入后進行處理。
浮點數據類型大致可以分為以下幾類:
? real數據類型:是浮點數據類型的一種,它存儲數據在4個字節中,在這個數據類型中可以存儲正數和負數,可以達到7個數字的精度,這個數據類型的值的范圍在3.4E-38~3.4E+38之間。
? float[(n)]數據類型:如果忽略參數n,需要8個字節的存儲空間,可以在其中存儲多達15個數字的正負數,其值的參數在1.7E-308~1.7E+308之間。
? 如果指定n值為1到7,則實際上是定義了一個real數據類型。如果指定n值在8~15之間,則這個數據類型的特性和忽略參數n是一樣。
? decimal[(p[,s])]和numeric[(p[,s])]數據類型:這兩個數據類型不像float或real數據類型,它們允許按指定的值精確分配給數據存儲空間,值的位數和精度由給定的參數指定,可以使用2~17個字節的存儲空間存儲-10~10之間的值。使用p定義小數點左右兩邊的位數和,而使用s定義小數點右邊的小數位數,s總小于等于p,如果忽略p,則指定為18;s的默認值為0。表3.2所示為分配給指定精度的字節數。
表3.2 分配給指定精度的字節數

3.二進制數據類型
? binary(n)數據類型:可以使用binary數據類型存儲由多達255個字節組成的bit形式的數據。使用在括號中的整數指定數據的長度,從1~255。binary列中的尺寸至少為1個字節,但你可以將這些字節存為0。在輸入第一個binary值時,你必須在他前面帶0x。你可以使用字符0~9和A~F輸入binary數據,如輸入0xA0代表A0。如果輸入的值大于定義的長度,則會將長出的部分截斷。
? varbinary(n)數據類型:可以使用varbinary數據類型存儲由多達255個字節組成的bit形式的數據。使用在括號中的整數指定數據的長度,從1~255。varbinary列中的尺寸至少為1個字節,但你可以將這些字節都存為0。
與binary數據類型不同的是,varbinary數據類型的存儲限制為實際值使用相同的存儲空間。就像binary數據類型,你必須在第一個輸入的值前加上0x。你可以使用字符從0~9和A~F輸入varbinary數據,如果輸入的值大于定義的長度,則會將長出的部分截斷。
4.邏輯數據類型
在SQL Server中邏輯數據類型只有一種,那就是bit數據類型,我們可以使用bit數據類型代表兩個狀態的數據信息。一個bit數據類型的數據存儲在一個位中,這時只有兩個可能的狀態——0或1。如果輸入的值不是0或1,則當做1存儲。不能定義bit數據類型允許為null值。
我們還可以使用單個字節定義多達8個不同的bit表列。分配給一個或多個bit的存儲空間是單個字節且bit表列不必是連續的。如果你定義了9個使用bit數據類型的表列,則需要2個字節存儲所有bit型數據。值的注意的是,我們不能在使用bit數據類型的表列上定義一個索引。
5.貨幣數據類型
? money數據類型:存儲貨幣值,存儲在money數據類型中的數據值分為兩部分存儲,一個是整數部分,一個是小數部分,這兩部分都是4個字節的整數,存儲在money數據類型中的值的范圍在-922337203685477.5808~922337203685477.5807之間。
? smallmoney數據類型:存儲的貨幣值的范圍比money數據類型小得多,其范圍在-214748.3648~214748.3647之間。這個數據類型的整數部分和小數部分存儲在4個字節中,所以,如果使用smallmoney而不是money,就可以節約一半的存儲空間。
當向表列中插入smallmoney或money數據類型的值時,必須在數據前加上美元符號($)或其他定義貨幣符號,如人民幣符號(¥)。
6.字符數據類型
字符數據類型可以存儲包括數字在內的許多符號,字符數據類型可以存儲字母、數字和特殊符號,如”[“,”]”號等。當向表列等存儲結構輸入數據時,可以使用單引號或雙引號輸入字符數據。
字符數據類型大致分為以下幾類。
? char數據類型:這個數據類型中的每個字符都使用一個字節的存儲空間。括號中的數字指定整個字符串的長度,如果輸入字符長度小于15個字節,則用空格補足。一個char(n)數據類型的數據最多可用255個字符。如果某表列定義char且允許null值,則它作為varchar數據類型的表列對待。
? varchar數據類型:這個數據類型存儲一個可變長度的字符串,最多可達255個字節,不像char數據類型,這個數據類型的存儲空間可以根據實際需要變化。
例如我們定義一個表列為varchar(15),則最大可以存儲的字符串長度為15,而如果不足15個字節,則不會分配額外的空間給這個數據,所以,可以使用varchar數據類型節約存儲空間。
在使用char或varchar數據類型時,都會制定要輸入數據的最大長度。SQL Server會自動截斷長于最大長度的字符,但它不會提醒你進行截斷操作。
當使用char數據類型時,會使用空格填滿少于制定長度的空間,這些空格會根據不同應用程序顯示不同的表現形式。如果這些空格為報表的應用帶來了麻煩,則可以在查詢語句中使用截斷函數或使用varchar數據類型。
7.文本和圖像數據類型
可以使用文本和圖像數據類型存儲大量字符數據和二進制數據。在文本和圖像數據類型中可以存儲2000000個以上的字節,預先為文本和圖像數據類型分配極大的存儲空間是一種浪費,所以一般先為它們分配一部分空間,其余的進行動態分配。
圖像數據類型有時用于作為行的一部分的內嵌OLE對象。
? text數據類型:使用text數據類型存儲大量的文本信息。存儲在text數據類型中的字符是可以直接輸出到設備或打印設備的字符。在text數據類型中可以存儲1~2147483647個字節的數據。數據存儲在最初分配為2K字節固定長度的單元中,而其他2K字節的單元是動態加入并連接的。2K的數據頁是指邏輯頁,而不是指物理頁。使用INSERT語句向文本列插入數據時,必須使用單引號引起數據。
? image數據類型:可以使用image數據類型存儲1~2147483467個字節的比特類型的數據。例如,可以在一行的單列中存儲圖片、照片、畫片等。
? 文本和圖像列的限制:使用存儲在文本或圖像列中的數據時,可能會遇到幾個限制。只可以使用文本和圖像數據類型定義表列,而不能用他們定義其他的數據結構,如本地變量或參數。
存儲在文本和圖像列中的數據量使得在許多SQL語句中使用和操作這些數據類型時都不太方便,這是因為他們存儲的數據量太大了。不能在ORDER BY、GROUP BY或計算從句中指定文本或圖像數據類型的表列,SQL Server不會使用包括4000000個字節的列來排序或分組。
再就是,不能在UNION中使用文本或圖像數據類型的列,除非是一個UNION ALL。也不能使用一個文本或圖像數據類型返回數據值的子查詢。在WHERE或HAVING從句中,不能使用文本或圖像列,除非使用了比較操作符LIKE。也不能在文本或圖像列上指定DISTICT。
最后,不能在文本或圖像列上創建索引、主鍵或外鍵。
8.日期和時間數據類型
有兩個數據類型存儲日期和時間的組合信息,你會發現將日期和時間數據存儲在這些數據類型中比將它們存儲在字符型數據類型中要方便,如果將日期和時間存儲在這兩個數據類型中顯示他們非常方便,因為SQL Server可以自動按熟悉的形式對它們進行格式化,你還可以使用特殊的日期和時間函數操作存儲在這些數據類型中的值。
如果使用字符數據類型存儲日期和時間,則SQL Server就不會自動對它們進行格式化。
日期和時間數據類型主要包括:
1)datetime數據類型
可以使用這個數據類型定義表列的存儲結構。在這個數據類型中可以存儲從1/11753AD~12/31/ 9999AD的日期和時間。
這個數據類型的總存儲空間為8個字節。SQL Server使用前4個字節存儲在1900年1月1日前或后的天數。作為負數存儲的值代表這個日期前的天數,作為正數存儲的值代表這個日期后的天數,時間存儲在后4個字節中。
數據類型datetime的值存儲精度為每秒的1/300。例如,1~3毫秒的值都表示為0毫秒;4~6毫秒的值表示為3毫秒。
當檢索在datetime數據類型中的值時,顯式的默認值為MMM DD YYYY hh : mm AM/PM,如OCT 23 1985 1:00 PM。當這個數據類型的值用于SQL語句時,必須用單引號將他們括起來,因為這樣SQL Server才會重新組織各個部分和準確存儲值。
當輸入datatime值時,可以使用大小寫的形式輸入日期,并在月、日和年間使用一個或多個空格,如果輸入日期而沒有時間,默認時間為12:00 AM,如果你忽略日期和時間,則默認值為January 1,1900 12:00 AM。
可以以幾種方法輸入日期。每種都可以由SQL Server正確組織和存儲。例如,可以以字母格式輸入日期,使用月的縮寫或全名。
如果輸入的日期是忽略的世紀部分,則小于50年的時間在21世紀,而大于50年的時間在20世紀,如果輸入的世紀值和默認值不一樣,則必須輸入指定的世紀值;當輸入一個沒有天的日期時,默認輸入值是月的第一天。
為了能夠讓讀者清楚地了解哪些輸入方式是正確的,下面列舉幾種正確的輸入方式:
? Sep 23 1983。
? SEP 23 1983。
? September 23 1983。
? sep 1983 23。
? 1983 sep 23。
? 19883 23 sep。
? 23 sep 1983。
datetime數據類型值的數字格式允許在不同時間單位使用斜線(/),劃線(-)和小數點(.)。當使用帶格式的datetime值時,必須指定這個值的月、日和年各部分。
以數字格式輸入datetime值時,需要以正確的順序輸入日期的各個部分,否則可能返回錯誤消息告訴你輸入的日期超出了實際的日期范圍。
在下面的例子中,輸入了幾個數字形式的datetime數據類型的日期值,設置的日期格式為月、日和年,設置的語言為US-English。
? 6/24/71。
? 06/24/71。
? 6-24-1971。
? 6.24.1971。
如果你輸入一個6位或8位沒有分開的數字的值,總是按年、月、日的順序進行解釋的。月和日總是解釋為兩個數字。
如果在向表中輸入一個新行時,忽略一個定義為datetime數據類型列的輸入,則在這個新行中,列顯示的值為January 1,1900,12 midnight。
必須按以下的順序輸入時間部分的值:小時、分鐘、秒、毫秒。在各個時間部分間必須有分隔符號以識別時間部分的各個數字。可以使用AM或PM指定上午或下午。
我們還可以使用小數點或劃線部分,它會影響毫秒單位的解釋。
2)smalldatetime數據類型
Smalldatetime是另外一種存儲日期和時間的數據類型,在這個數據類型中,你可以存儲從1/11900AD~6/6/2709AD的日期和時間。
這個數據類型的總存儲空間是4個字節。SQL Server使用兩個字節存儲January 1,1900后的天數。時間存儲在另外兩個字節中,按照零后的分鐘數計算。所以這個數據類型的精度是1分鐘,你可以使用這個數據類型存儲比datetime數據類型精度稍低的時間值。使用smalldatetime數據類型所花費的存儲空間是datetime數據類型的一半。
3.2.3 自定義數據類型
我們在對表列的數據類型進行定義時,除了可以使用系統提供的數據類型外,還可以根據需要用自定義的數據類型來進行定義。
用戶自定義數據類型和系統的標準數據類型最大的區別在于,用戶自定義數據類型是以標準系統數據類型為基礎的,也就是說我們在自定義自己的數據類型時必須使用標準的系統數據為前提,在它們的基礎上加一些限制條件創造出屬于自己的一種數據類型。這種用戶自定義數據類型只是對已有數據的一種描述方式,并不是一種新的數據類型,利用它可以加強對數據庫字段數據類型的一致性維護,它在整個數據庫中有效,不過很遺憾的是,在用戶自定義數據類型建立之后其屬性就不能直接更改,我們需要先刪除之后再進行創建,但是如果該自定義數據類型已經被引用,我們就無法執行刪除操作。下面介紹用戶自定義數據類型的創建和刪除。
我們可以使用兩種方式來對用戶自定義數據類型進行創建,一種方法是使用對象資源管理器進行可視化創建,另外一種是通過SQL編程的方式來進行創建,其實后面的很多操作都是使用這兩種方式完成的。
1.使用對象資源管理器創建用戶自定義數據類型
我們前面已經了解了對象資源管理器,它的主要作用就是給數據庫管理系統提供一個用戶界面,利用這個界面對數據庫進行一系列的操作,下面看一下我們使用對象資源管理器進行用戶自定義數據類型創建的主要過程。
(1)單擊當前數據庫節點下的“類型”節點。然后用鼠標右鍵單擊該節點下的“用戶定義數據類型”節點,在彈出的快捷菜單中選擇“新建用戶定義數據類型”命令,如圖3.1所示。

圖3.1 選擇“用戶新建用戶定義數據類型”命令
(2)彈出“新建用戶定義數據類型”對話框,可以在該對話框中創建自己所需的數據類型。例如,通過該對話框創建數據類型TestType,如圖3.2所示。

圖3.2 創建數據類型TestType
(3)單擊“確定”按鈕,完成用戶自定義數據類型的創建。
2.通過SQL編程方式來創建用戶自定義數據類型
我們可以使用系統存儲過程sp_addtype來創建自定義數據類型,至于什么是存儲過程,讀者在這里不必深究,在后面的章節中我們會對它進行詳細介紹。下面先了解該存儲過程的使用語法。
sp_addtype type, [ system_data_type ] [ ,'nulltype' ]
? type:用戶定義數據類型的名稱。數據類型名稱必須遵循標識符規則,并且在每個數據庫中必須是唯一的。
? system_data_type:SQL server提供的數據類型,用戶定義的數據類型即基于該類型。
? nulltype:指定如何處理null值。設置null默認、not null或nonull。
例如,我們要建立自定義數據類型TestType,就可以使用以下語句進行操作。
sp_addtype TestType, 'NUMERIC (4,0)','NONULL'
那么我們怎樣運行這句代碼讓它在指定數據庫中發揮作用呢?當然這里就要用到SQL Server 2005給我們提供的另外一個組件工具——查詢編輯器。具體的操作步驟如下:
(1)單擊“新建查詢”按鈕,新建一個SQL查詢,并且選擇要進行操作的數據庫,如圖3.3所示。

圖3.3 新建SQL查詢
(2)將操作腳本書寫到新建的查詢界面中,并且單擊“執行”按鈕即可完成用戶自定義數據類型的添加。如圖3.4所示。

圖3.4 執行操作腳本
同樣刪除用戶自定義數據類型也有兩種方式,在使用對象資源管理器進行操作時,直接用鼠標右鍵單擊已經創建的用戶自定義數據類型,然后選擇“刪除”命令即可,如圖3.5所示。

圖3.5 利用對象資源管理器刪除用戶自定義數據類型
我們還可以利用SQL腳本對用戶自定義數據類型進行刪除操作,基本的SQL語法為:
sp_droptype type
type即為用戶定義數據類型的名稱。
具體執行過程和創建自定義數據類型類似,我們也是利用查詢分析器來進行操作的。
在執行用戶自定義的刪除操作時還有一個值得注意的地方,那就是如果用戶自定義數據類型在數據庫中的某個地方使用,就不能執行刪除操作。
3.3 變量
變量是一種語言中必不可少的組成部分。在SQL Server依賴的Transact-SQL語言中有兩種形式的變量,一種是用戶自己定義的局部變量,另一種是系統提供的全局變量。在SQL語言中和變量相關的概念還有批和腳本的概念,下面我們就先介紹批和腳本的概念,然后再介紹變量。
3.3.1 批和腳本
在SQL Server中為了方便變量及函數的處理提出了批和腳本的概念,批就是一條或者多條SQL語句的集合,而腳本則是按照一系列順序提交的批。通過這兩個概念我們可以非常清晰地了解SQL語句之間的關系,便于我們對SQL語句的管理。
1.批
一個批是由一條或多條SQL語句組成的語句集,這些語句一起提交并作為一個組來執行。SQL Server將批中的語句作為一個整體編譯為一個執行計劃。因為批中的語句是一起提交給服務器的,所以可以節省系統開銷。
在查詢分析器中,可以用GO命令標志一個批的結束。GO不是一個執行語句,是通知查詢分析器有多少語句要包含在當前的批中。查詢分析器將兩個GO之間的語句組成一個字符串交給服務器去執行。
如,以下代碼包含3個批:
USE Test GO CREATE VIEW V_STUDENTS AS SELECT id,name FROM students WHERE id='001' GO SELECT * FROM V_STUDENTS GO
也就是每個GO的位置就是一個批結束的位置。
因為SQL Server為一個批生成一個單獨的執行計劃,所以一個批本身應該是完整的,不能在一個批中引用其他批定義的變量,也不能將注釋從一個批開始,在另一個批中結束。
如果批中的語句出現編譯錯誤,那么將不能生成執行計劃,批中的任何一個語句都不會執行。
批運行時期的錯誤,如果是多數,則終止當前語句和批中后繼語句的執行,少數運行時期錯誤(如違反約束),只會影響當前造成錯誤的語句,而其后的語句仍可以正常執行。不論是哪種運行時期錯誤,出錯之前的語句的執行結果不會受到影響,除非該批位于一個事務中,而且在出現錯誤之后明確地將事務回滾。
批有如下限制:
? CREATE DEFAULT、CREATE PROCEDURE、CREATE RULE、CREATE TRIGGER和CREATE VIEW語句不能與其他語句位于同一個批中。
? 不能在一個批中修改一個表的結構,然后在同一個批中引用剛修改的新列。
? 如果批的第一條語句是EXECUTE,則EXECUTE關鍵字可以省略。否則,不能省略。
2.腳本
腳本是一系列順序提交的批。腳本可以直接在查詢分析器等工具中輸入并執行,也可以保存在文件中,再由查詢分析器等工具執行。
一個腳本可以包含一個或多個批,腳本中的GO命令標志一個批的結束,如果一個腳本沒有包含任何GO命令,那么它被視為一個批。
腳本可用于:
? 將服務器上創建一個數據庫的步驟永久地記錄在腳本文件中。
? 將語句保存為腳本文件,從一臺計算機傳遞到另一臺計算機,這樣可以方便地使兩臺計算機執行同樣的操作。
3.3.2 局部變量
局部變量是用戶自定義的變量。使用范圍是定義它的批、存儲過程或觸發器。局部變量的作用范圍僅限制在程序內部。局部變量可以作為計數器來計算循環執行的次數,或是控制循環執行的次數。另外,利用局部變量還可以保存數據值,以供控制流語句測試及保存由存儲過程返回的數據值等。局部變量前面通常加上“@”標識。用DECLARE對局部變量進行定義,并指明此變量的數據類型,用SET或SELECT命令對其賦值。局部變量的數據類型可以是用戶自定義的數據類型,也可以是系統數據類型,但不能將其定義為TEXT或IMAGE數據類型。
1.定義局部變量
定義局部變量的語法如下:
DECLARE @local_variable data_type [,local_variable data_type]…
其中local_variable代表定義的局部變量的名稱。
data_type代表定義的變量類型。
可以看出,DECLARE命令可以定義多個局部變量,之間用逗號分隔。
2.用SELECT為局部變量賦值
用SELECT為局部變量賦值的語法如下:
SELECT { @local_variable = expression } [ ,…n ]
其中參數@local_variable是給其賦值的聲明變量。expression是任何有效的SQL Server表達式,包括變量子查詢。
SELECT命令可以將一個表達式的值賦給一個局部變量,也可以將一個SELECT查詢的結果賦給一個局部變量。
SELECT命令通常返回一個值給局部變量。但當返回多個值時也不會出現錯誤。例如,當expression為一個表列的名字時,SELECT命令可能會返回多個值,則變量的值為最后一個返回值。如果SELECT命令沒有返回值,則局部變量保持原值不變,如expression為—個分級查詢且沒有返回值時,變量被置為NULL。
3.用SET為局部變量賦值
SET命令的功能非常豐富,語法格式也靈活多樣,用SET為局部變量賦值的常用語法格式為:
SET @local_variable= expression
SET命令和SELECT命令都可以使用表達式為變量賦值。它們之間的主要異同在于:
? SELECT可以從表、子查詢或者視圖中查詢數據,并且也可以包含其他SELECT子句;而SET命令則只能從表達式中獲取數據。
? SET和SELECT命令中都可以使用函數。
? SELECT語句可以查詢多列,而每個列中的數據都可以賦值給一個變量。如果SELECT語句返回了多個行,將會把結果集中最后一行的數據賦值給變量,系統不會報告任何錯誤。
3.3.3 全局變量
全局變量是由SQL Server系統提供并賦值的變量。用戶不能建立全局變量,也不能修改全局變量的值。與局部變量不同,全局變量在所有存儲過程內均有效。通常將全局變量的值賦給局部變量,以便保存和處理。在使用全局變量時請注意以下規則:
? 全局變量是在服務器級定義的,不是由用戶例程定義的。
? 用戶只能使用系統預定義的全局變量。
? 引用全局變量時,前面一定加上“@@”標識。
? 用戶不能定義與系統全局變量同名的局部變量,否則將產生不可預測的結果。
? 全局變量以兩個at(@)開頭,下面我們對SQL Server中的預定義全局變量進行簡單的說明。
@@servername:返回運行SQL Server數據庫本地服務器的名稱。
@@remserver:返回登錄記錄中記載的遠程SQL Server服務器的名稱。
@@connections:返回自上次啟動SQL Server以來連接或試圖連接的次數,用其可讓管理人員方便地了解今天所有試圖連接服務器的次數。
@@cursor_rows:返回最后連接上并打開的游標中當前存在的合格行的數量。
@@erro:返回最后執行的Transact-SQL語句的錯誤代碼。
@@rowcount:返回受上一語句影響的行數,任何不返回行的語句將這一變量設置為0。
@@version:返回SQL Server當前安裝的日期、版本和處理器類型。
@@cup_busy:返回自SQL Server最近一次啟動以來CPU的工作時間,單位為毫秒。
@@datefirst:返回使用SET DATEFIRST命令而被賦值的DATAFIRST參數值。SET DATEFIRST命令用來指定每周的第一天是星期幾。
@@DBTS:返回當前數據庫的時間戳值必須保證數據庫中時間戳的值是唯一的。
@@FETCH_STATUS:返回上一次FETCH語句的狀態值。
@@IDENTITY:返回最后插入行的標識列的列值。
@@IDLE: 返回自SQL Server最近一次啟動以來CPU處于空閉狀態的時間長短,單位為毫秒。
@@IO_BUSY:返回自SQL Server最后一次啟動以來CPU執行輸入、輸出操作所花費的時間(毫秒)。
@@LANGID:返回當前所使用的語言ID值。
@@LANGUAGE:返回當前使用的語言名稱。
@@LOCK_TIMEOUT:返回當前會話等待鎖的時間長短,單位為毫秒。
@@MAX_CONNECTIONS:返回允許連接到SQL Server的最大連接數目。
@@MAX_PRECISION:返回decimal和numeric數據類型的精確度。
@@NESTLEVEL:返回當前執行的存儲過程的嵌套級數,初始值為0。
@@OPTIONS:返回當前SET選項的信息。
@@PACK_RECEIVED:返回SQL Server通過網絡讀取的輸入包的數目。
@@PACK_SENT:返回SQL Server寫給網絡的輸出包的數目。
@@PACKET_ERRORS:返回網絡包的錯誤數目。
@@PROCID:返回當前存儲過程的ID值。
@@SERVICENAME:返回SQL Server正運行于哪種服務狀態之下,如MS SQLServer、MSDTC、SQLServerAgent。
@@SPID:返回當前用戶處理的服務器ID值。
@@TEXTSIZE:返回SET語句的TEXTSIZE選項值,SET語句定義了SELECT語句中text或image。數據類型的最大長度基本單位為字節。
@@TIMETICKS:返回每一時鐘的微秒數。
@@TOTAL_ERRORS:返回磁盤讀寫錯誤的數目。
@@TOTAL_READ:返回磁盤讀操作的數目。
@@TOTAL_WRITE:返回磁盤寫操作的數目。
@@TRANCOUNT:返回當前連接中處于激活狀態的事務數目。
3.4 SQL的佐料——運算符
為了實現編程的功能,與其他高級語言一樣,Transact-SQL運用運算符和函數實現各種計算和處理功能。
Transact-SQL提供了如下幾種類型的運算符:算術運算符、比較運算符、字符連接運算符、邏輯運算符、按位運算符。
3.4.1 算術運算符
算術運算符對兩個表達式執行數學運算,這兩個表達式可以是數值數據類型類別的一個或多個數據類型,其種類和含義如表3.3所示。
表3.3 SQL語言中的算術運算符

對于算術運算符這里有兩點需要說明:
? 加(+)和減(-)運算符也可用于對datetime和smalldatetime值執行算術運算。
? 取模運算符的作用是返回一個除法運算的整數余數,例如,12%5=2,這是因為12除以5,余數為2。
3.4.2 比較運算符
在SQL語言中,比較運算符能夠進行除text、ntext和image數據類型之外的其他數據類型表達式的比較操作。比較運算表達式的返回值為布爾數據類型,即TRUE、FALSE。
SQL語言中的比較運算符主要包括等于、大于、小于、大于或等于、小于或等于、不大于、不小于、不等于,控制實行優先級——小括號。
1.=(等于)
比較兩個表達式(比較運算符)。當比較非空表達式時,如果左邊操作數的值等于右邊的操作數,則結果為TRUE,否則結果為FALSE。如果在兩個操作數中有一個或者兩個都為NULL,并且SET ANSI_NULLS被設置為ON,則結果為NULL。如果SET ANSI_NULLS被設置為OFF,則當一個操作數為NULL時結果為FALSE,當兩個操作數都為NULL時結果為TRUE。
2.>(大于)
比較兩個表達式(比較運算符)。當比較非空表達式時,如果左邊操作數的值大于右邊的操作數,則結果為TRUE;否則結果為FALSE。如果在兩個操作數中有一個或者兩個都為NULL,并且SET ANSI_NULLS被設置為ON,則結果為NULL。如果SET ANSI_NULLS被設置為OFF,則當一個操作數為NULL時結果為FALSE,當兩個操作數都為NULL時結果為TRUE。
3.<(小于)
比較兩個表達式(比較運算符)。當比較非空表達式時,如果左邊操作數的值小于右邊的操作數,則結果為TRUE;否則結果為FALSE。如果在兩個操作數中有一個或者兩個都為NULL,并且SET ANSI_NULLS被設置為ON,則結果為NULL。如果SET ANSI_NULLS被設置為OFF,則當一個操作數為NULL時結果為FALSE,當兩個操作數都為NULL時結果為TRUE。
4.>=(大于或等于)
比較兩個表達式(比較運算符)。當比較非空表達式時,如果左邊操作數的值大于或等于右邊的操作數,則結果為TRUE;否則結果為FALSE。如果在兩個操作數中有一個或者兩個都為NULL,并且SETANSI_NULLS被設置為ON,則結果為NULL。如果SET ANSI_NULLS被設置為OFF,則當一個操作數為NULL時結果為FALSE,當兩個操作數都為NULL時結果為TRUE。
5.<=(小于或等于)
比較兩個表達式(比較運算符)。當比較非空表達式時,如果左邊操作數的值小于或等于右邊的操作數,則結果為TRUE;否則結果為FALSE。如果在兩個操作數中有一個或者兩個都為NULL,并且SET ANSI_NULLS被設置為ON,則結果為NULL。如果SET ANSI_NULLS被設置為OFF,則當一個操作數為NULL時結果為FALSE,當兩個操作數都為NULL時結果為TRUE。
6.!>(不大于)
這個操作符的作用正好和>(大于)操作符的作用相反。
7.!<(不小于)
這個操作符的作用正好和<(小于)操作符的作用相反。
8.<>、!=(不等于)
比較兩個表達式(比較運算符)。當比較非空表達式時,如果左邊操作數的數值不等于右邊的操作數,則結果為TRUE;否則結果為FALSE。如果在兩個操作數中有一個或者兩個都為NULL,并且SET ANSI_NULLS被設置為ON,則結果為NULL。如果SET ANSI_NULLS被設置為OFF,則當一個操作數為NULL時結果為FALSE,當兩個操作數都為NULL時結果為TRUE。
9.()(控制實行優先級)
通過這個運算符可以提高表達式的優先級,使這個表達式的優先級達到最高。
3.4.3 邏輯運算符
邏輯運算符用于測試條件是否為真,根據測試結果返回布爾值TURE、FALSE或UNKNOWN。
? AND:對兩個布爾表達式的值進行邏輯與運算,如果其中有一個為TURE,另一個為UNKNOWN,或兩個都為UNKNOWN,則返回值為UNKNOWN。
? OR:對兩個布爾表達式的值進行邏輯或運算,如果其中有一個為FALSE,則另一個為UNKNOWN,或兩個都為UNKNOWN,則返回UNKNOWN。
? NOT:對布爾表達式的值進行取反運算,當其值為UNKNOWN時,返回值為UNKNOWN。
? ALL:如果一組的比較都為TRUE,那么就為TRUE。
? ANY:如果一組的比較中任何一個為TRUE,那么就為TRUE。
? BETWEEN:如果操作數在某個范圍之內,那么就為TRUE。
? EXISTS:如果子查詢包含一些行,那么就為TRUE。
? IN:如果操作數等于表達式表列中的一個,那么就為TRUE。
? LIKE:如果操作數與一種模式相匹配,那么就為TRUE。
? SOME:如果在一組比較中,有些為TRUE,那么就為TRUE。
3.4.4 連接運算符
連接運算符是指可以將一個或多個文本連接為一個組合文本的運算符號,在SQL語言中連接運算符只有一種,即“+”。但是這時“+”運算符的含義不是加法,而是字符串的連接,例如:
fullName=”givenName”+” ”+”familyName”
這句話我們就是使用了連接運算符“+”生成了一個新的字符串fullName,這個fullName的值就是“givenName familyName”。
3.4.5 按位運算符
按位運算符對整數或二進制數據進行按位與(&)、或(|)、異或(^)、求反(~)等邏輯運算。
1.&(位與)
上下運算,按照與的運算規則:0&0=0 ;0&1=0;1&1=1。
例如:
170 & 75結果為0000 0000 0000 1010。
再把二進制數轉換為十進制數10。
2.~(位非)
運算法則:0變1,1變0。
~170的二進制:1111 1111 0101 0101, 十進制為:-171。
~75的二進制:1111 1111 1011 0100, 十進制為:-76。
3.|(位或)
上下運算,按照與的運算規則:0&0=0 ;0&1=1;1&1=1。
例如:
170 & 75結果為0000 0000 1110 1011。
再把二進制數轉換為十進制數235。
4.^(位異或)
上下運算,按照與的運算規則:0&0=0 ;0&1=1;1&1=0。
例如:
170 & 75結果為0000 0000 1110 0001。
再把二進制數轉換為十進制數225。
3.4.6 運算符的優先級
在實際的SQL語言編程中,可能在一個運算符中出現多個運算符,那么在計算時,就按照優先級級別的高低進行計算,級別高的運算符先計算,級別低的運算符后計算,具體運算符的優先級如表3.4所示。
表3.4 SQL語言中的優先級級別

3.5 認識表達式
表達式在SQL語言中起著非常重要的作用,可以說是整個SQL語言的核心部分,因為SQL語言中的很多重要操作都需要表達式來完成,這一節我們主要目的就是讓讀者對表達式有一個大致的認識,關于表達式的詳細內容我們會在以后的章節中漸漸地深入了解。
3.5.1 什么是表達式
表達式是指用運算符和圓括號把常量、變量和函數等運算成分連接起來的有意義的式子,要特別指出的是單個的常量、變量、函數也可以看成是一個表達式。
SQL語言的核心就是SQL表達式,表達式可用于很多方面,如執行計算、檢索控件的值或向查詢提供條件等。 在后面的章節中SQL表達式會隨處可見,特別是下一章——“走進SQL語句的世界”中大部分SQL語句都是由SQL關鍵字加上SQL表達式組成的。在這里我們只需先了解SQL語句的簡單概念和分類,具體的介紹我們在下一章展開。
3.5.2 SQL表達式的分類
對于SQL表達式的分類我們可以有兩種分類方法,一種是按照連接表達式的運算符進行分類,我們可以將表達式分為算術表達式、比較表達式、邏輯表達式、按位表達式和混合表達式等;另一種分類方法是按照表達式的作用來進行分類,我們可以將表達式分為字段名表達式、目標表達式和條件表達式。
對于第一種分類方法就是按照連接運算因子的運算符進行劃分的,我們很容易就能夠理解,這里就不在進行過多的闡述,下面我們按照第二種分類方式簡單介紹SQL表達式。
1.字段名表達式
字段名表達式可以是單一的字段名或幾個字段的組合,還可以是由字段、作用于字段的集函數和常量的任意算術運算(+、-、*,/)組成的運算公式。主要包括數值表達式、字符表達式、邏輯表達式、日期表達式4種。
2.目標表達式
目標表達式有4種構成方式。
? *:表示選擇相應基表和視圖的所有字段。
? <表名>.*:表示選擇指定的基表和視圖的所有字段。
? 集函數():表示在相應的表中按集函數操作和運算。
? [<表名>.]<字段名表達式>[,[<表名>.]<字段名表達式>]…:表示按字段名表達式在多個指定的表中選擇。
3.條件表達式
條件表達式常用的有以下6種。
1)比較大小應用比較運算符構成表達式,主要的比較運算符有=、>、<、>=、<=、!=、<>、!>(不大于)、!<(不小于)、NOT+(與比較運算符同用,對條件求非)。
2)指定范圍
BETWEEN…AND… ,NOT BETWEEN…AND…
查找字段值在(或不在)指定范圍內的記錄。BETWEEN后是范圍的下限(即低值),AND后是范圍的上限(即高值)。
3)集合
IN…,NOT IN…
查找字段值屬于(或不屬于)指定集合內的記錄。
4)字符匹配
LIKE,NOT LIKE'<匹配串>'[ESCAPE'<換碼字符>']
查找指定的字段值與<匹配串>相匹配的記錄。<匹配串>可以是一個完整的字符串,也可以含有通配符“_”和“%”。其中“_”代表任意單個字符;“%”代表任意長度的字符串。
5)空值
IS NULL,IS NOT NULL
查找字段值為空(或不為空)的記錄。NULL不能用來表示無形值、默認值、不可用值,以及取最低值或取最高值。SQL規定,在含有運算符+、-、*、/的算術表達式中,若有一個值是空值,則該算術表達式的值也是空值;任何一個含有NULL比較操作結果的取值都為“假”。
6)多重條件
AND,OR
AND含義為查找字段值滿足所有與AND相連的查詢條件的記錄;OR含義為查找字段值滿足查詢條件之一的記錄。AND的優先級高于OR,但可通過括號改變優先級。
3.6 SQL利器——通配符
在搜索數據庫中的數據時,可以使用SQL通配符。SQL通配符在搜索數據庫中的數據時, SQL通配符可以替代一個或多個字符。需要特別注意的是,SQL通配符必須與LIKE運算符一起使用。在SQL語言中我們通常使用的通配符有以下幾種:
? %:包含零個或更多字符的任意字符串。例如:LIKE'%A%'可以查找任意位置的、包含字母A的所有項目。
? _(下畫線):任何單個字符。例如,LIKE'_B'將查找以b結尾的所有兩個字母的項目(如AB、CB等)。
? [ ]:指定范圍 ([a-f]) 或集合 ([abcdef]) 中的任何單個字符。例如,LIKE '[A-D]B' 將查找以字母B結尾且以介于A~D之間(包括起始字符)的任何單個字符開始的項目,如AB、CB等。
? [^]或[!]:不屬于指定范圍 ([a-f])或集合([abcdef])中的任何單個字符。例如,LIKE 'AB[^1]%'將查找以AB開始且其后的字母不為l的所有項目。
3.7 SQL語言中的注釋
和大多數的高級編程語言一樣,SQL語言也有自己的代碼注釋的標準與規則。注釋的好處是讓你的代碼變得更加清晰和易于理解,對SQL代碼加上注釋之后不僅能夠讓自己很容易地理解自己以前寫過的代碼,更重要的是在團隊協作開發的時候,確保你所交付給同伴的源碼能夠易于被讀懂,從而不必花費大量的精力在代碼的交接上。
SQL中的注釋方法大致分為以下兩種。
1.單行注釋
很容易理解單行注釋的作用,肯定是某一特定行的代碼注釋,指明該行代碼的作用。單行代碼的注釋是以“--”開頭的,如下所示:
--單行注釋內容
單行注釋在編譯的時候是被忽略的。
2.多行注釋
多行注釋是為了注釋某一代碼塊的作用,SQL語言的多行注釋是以“/*”開頭,以“*/”結束的,如下所示:
/*多行注釋內容*/
3.8 小結
通過本章的學習我們對SQL語言有一個大致的了解了,更加具體和詳細的內容我們會在后面的章節中進行詳細的闡述。
本章我們主要學習了SQL語言中的數據類型、變量、運算符、表達式,以及其他一些輔助的與SQL語言開發相關的內容。在本章的講述中讀者可以非常清楚地理清講解的思路,本章的講解思路清晰、重點突出,我們把SQL語言中的數據類型、運算符、表達式等內容進行了詳細的闡述,它們在我們今后的使用中會經常出現,是我們進行SQL編程的重點內容,也是基礎內容,我們只有充分地理解它們,才能在后面的學習中游刃有余。下一章我們將進行SQL語句的學習,這是SQL Server中一個非常中心的內容,SQL語句的編寫在很大程度上可以說是SQL語言的具體應用。
3.9 習題
1.簡述SQL語言的特點。
2.試論述SQL Server系統數據類型的分類,以及各種數據類型的特點。
3.使用對象資源管理器和SQL語句兩種方式創建一個自定義數據類型,讓這個自定義數據類型滿足:基本數據類型為varchar,長度為80,不能為空值。
4.區分局部變量和全局變量。
5.試論述SQL Server運算符的分類,以及每一種運算符的用途和特點。
- PPT,要你好看
- Canvas LMS Course Design
- Cinema 4D R13 Cookbook
- Circos Data Visualization How-to
- 反饋系統:多學科視角(原書第2版)
- 80x86/Pentium微型計算機原理及應用
- 愛犯錯的智能體
- Salesforce Advanced Administrator Certification Guide
- 計算機組成與操作系統
- Hands-On Dashboard Development with QlikView
- 寒江獨釣:Windows內核安全編程
- 3ds Max造型表現藝術
- Hands-On SAS for Data Analysis
- 與人共融機器人的關節力矩測量技術
- C#編程兵書