第2章 主要的關系數據庫與SQL
SQL Server是目前應用最廣泛的大型關系數據庫系統。本章主要介紹它們的基本概念以及執行SQL語句的交互環境,最后簡單介紹一下SQL Server對SQL的擴展語言。
2.1 SQL Server
SQL Server是一個后臺數據庫管理系統,它功能強大,操作簡便,日益為廣大數據庫用戶所喜愛,越來越多的開發工具提供了SQL Server的接口。作為微軟公司的產品之一,SQL Server能夠很好地與微軟的其他產品集成,如Office下的Excel、Access等,都可以用表的形式轉換到SQL Server數據庫中。
2.1.1 SQL Server的結構
SQL Server采用單進程多線程的系統結構、客戶端/服務器體系結構,并且支持分布式數據庫結構。
1.單進程多線程的系統結構
SQL Server采用單進程、多線程結構,由執行核心即線程來分配多用戶對數據庫的存取,這樣減少了多進程方式對數據庫存取時的協調時間,提高了執行效率。由于是單進程,它就不需要進程之間的通信機制。線程的操作由數據庫引擎來指定,在執行時把這些指令發送給操作系統。SQL Server單進程多線程的系統結構如圖2-1所示。

圖2-1 SQL Server單進程多線程的系統結構
2.客戶端/服務器體系結構
SQL Server是按客戶端/服務器體系結構設計的。需要用戶頻繁干預的任務,如輸入、顯示數據等,由客戶端完成;而對于數據庫的存取和控制任務,則由服務器完成。當用戶需要讀取數據庫中的數據時,就會通過網絡向服務器提出申請,服務器對客戶端的數據庫請求做出相應的處理,然后僅將結果傳給客戶端,這樣就大大減少了網絡流量。
在SQL Server中,有一個包含1024個工作線程的線程池,用以響應用戶的連接請求。SQL Server為不同的用途準備了不同的線程池,包括磁盤備份管理、用戶連接等。
3.支持分布式數據庫結構
一個網絡中可以有多個SQL Server,用戶可以將數據分別存放在各個SQL Server上,成為分布式數據庫結構??蛻舳丝梢苑謩e或同時向多個SQL Server存取數據,這樣可以降低單個SQL Server的處理負擔,提高系統的執行效率。
2.1.2 數據庫訪問標準化接口——ODBC
SQL Server是按客戶端/服務器體系結構設計的,客戶端可以通過ODBC與SQL Server連接。
ODBC(Open Database Connection,開放數據庫互連標準),實際上是一個數據庫的訪問庫,適用于客戶端/服務器體系結構,定義客戶程序用于連接到數據庫系統和發出SQL命令的API。
ODBC有一個驅動程序管理器,驅動程序管理包含在ODBC.DLL中,可連接到所有的應用程序中,它負責管理應用程序中ODBC函數與DLL中函數的綁定。對于大型的客戶端/服務器數據庫管理系統,其支持的ODBC驅動程序并不直接訪問數據庫,這些驅動程序實際上是數據庫用于遠程操作網絡通信協議的一個界面,如圖2-2所示。

圖2-2 ODBC與數據庫的連接
2.1.3 使用查詢分析器執行SQL語句
在SQL Server中,我們可使用查詢分析器(Query Analyzer)來執行SQL Server支持的任何SQL語句。查詢分析器具有圖形用戶界面(GUI),可用來提出交互式的查詢,并向SQL Server發送SQL命令。下面我們說明如何使用查詢分析器執行SQL語句。
1.啟動查詢分析器
當用戶單擊查詢分析器運行程序時,Windows將顯示連接SQL Server對話框,如圖2-3所示。在SQL Server連接對話框中,我們鍵入想要連接的SQLServer名稱、設定登錄方式后,單擊“確定”按鈕,即可進入查詢分析器的查詢窗口,如圖2-4所示。

圖2-3 連接SQL Server對話框

圖2-4 查詢分析器的查詢窗口
在安裝SQLServer時,安裝程序創建了幾個數據庫,如圖2-4查詢窗口工具欄右側的DB下拉列表所示。在使用查詢分析器向SQL Server發送SQL語句之前,我們必須選擇一個數據庫。
2.查詢分析器執行SQL語句
假設在msdb數據庫中有一個數據庫表TEACHER,我們要查詢表中的所有數據,步驟如下。
(1)單擊DB下拉列表,從列表中選擇要操作的數據庫,這里選擇“msdb”。
(2)在查詢分析器查詢窗口中鍵入SQL語句,這里鍵入的內容是“SELECT * FROM TEACHER”,可以在一行鍵入,也可以使用“Enter”鍵將其分成多行。
注意
多行鍵入時,每行的結果不要加任何符號。
(3)執行SQL語句。SQL語句可以通過單擊“查詢”|“執行”菜單命令執行,也可以通過快捷鍵F5或Ctrl+E來實現。查詢分析器將在查詢窗口下面的窗格中顯示SQL語句的執行結果,如圖2-5所示。

圖2-5 查詢分析器執行SQL語句及結果顯示
使用時我們需要注意:無論何時執行SQL語句,查詢分析器都會向SQL Server發送查詢窗口中的所有語句,以便處理。
如果在查詢窗口中有多條語句,我們既可以刪除那些不想執行的語句,也可以選中需要向SQL Server發送用于處理的語句,而后執行即可。
2.2 Transact-SQL
SQL屬于第四代語言(4GL),其執行特點是非過程化,即不用指明執行的具體方法和途徑,而是簡單地調用相應語句來直接取得結果。顯然,這種不關注任何實現細節的語言對于開發者來說有著極大的便利。然而,對于有些復雜的業務流程,又要求相應的程序來描述,那么4GL就有些無能為力了。
Transact-SQL是ANSI SQL的加強版語言,提供了標準的SQL命令,另外還對SQL命令做了許多擴充,提供類似BASID、Pascal、C等第三代語言的基本功能,如變量說明、程序流程控制語言、功能函數等。
2.2.1 Transact-SQL概述
Transact-SQL是一套定義完善的語言,開發人員可以通過這種語言來進行應用程序和數據庫服務器之間的通信,并能夠對數據庫服務器進行編程處理。Transact-SQL是ANSI-SQL的一個超集,利用Transact-SQL,我們可以使服務器執行一些定制的事務邏輯處理。Transact-SQL由多種應用程序生成,包括以下幾種。
? 通用辦公生產應用程序。
? 使用圖形用戶界面(GUI)的應用程序,使用戶得以選擇包含要查看數據的表和列。
? 使用通用語言語句,確定用戶所要查看數據的應用程序。
? 將其數據存儲于SQL Server數據庫中的商用應用程序。這些應用程序既可以是來自其他廠商的應用程序,也可以是內部編寫的應用程序。
? 由開發系統,如Visual C++、Visual Basic或Visual J++等,使用數據庫應用程序接口(API),如ADO、OLE DB以及ODBC等,創建的應用程序。
2.2.2 Transact-SQL的主要組成
在Transact-SQL中,標準的SQL語句暢通無阻。Transact-SQL也有類似于SQL語言的分類,不過做了許多擴充。Transact-SQL的分類如下。
? 數據定義語言(DDL,Data Definition Language)
? 數據操縱語言(DML,Data Manipularion Language)
? 數據控制語言(DCL,Data Control Language)
? 系統存儲過程(System Stored Procedure)
? 一些附加的語言元素
數據定義語言、數據操縱語言和數據控制語言與第1章介紹的標準SQL的數據定義語言、數據操縱語言和數據控制語言相差不大,這里不再介紹。
系統存儲過程在本書第15章存儲過程中會有詳細介紹。下面我們主要介紹一下附加的語言元素,主要包括以下幾部分。
1.注釋
注釋是程序代碼中不執行的文本字符串(也稱為注解)。在SQL Server中,我們可以使用兩種類型的注釋字符,一種是ANSI標準的注釋符“--”,用于單行注釋;另一種是與C語言相同的程序注釋符號,即“/* */”,可用于多行注釋。
2.變量
變量是一種語言中必不可少的組成部分。Transact-SQL中有兩種形式的變量,一種是用戶自己定義的局部變量,另外一種是系統提供的全局變量。
局部變量是一個能夠擁有特定數據類型的對象,它的作用范圍僅限于程序內部。局部變量可以作為計數器來計算循環執行的次數,或是控制循環執行的次數。
全局變量是SQL Server系統內部使用的變量,作用范圍并不僅僅局限于某一程序,而是任何程序都可以隨時調用。全局變量通常存儲一些SQL Server的配置設定值和統計數據。使用全局變量時,我們應該注意以下幾點:
? 全局變量不是由用戶的程序定義的,是在服務器級定義的。
? 用戶只能使用預先定義的全局變量。
? 引用全局變量時,必須以標記符“@@”開頭。
? 局部變量的名稱不能與全局變量的名稱相同,否則會在應用程序中出現不可預測的結果。
3.運算符
運算符是一些符號,能夠用來執行算術運算、字符串連接、賦值以及在字段、常量和變量之間進行比較。在SQL Server中,運算符主要有以下6大類:算術運算符、賦值運算符、位運算符、比較運算符、邏輯運算符以及字符串串聯運算符。
4.函數
在Transact-SQL中,函數用來執行一些特殊的運算以支持SQL Server的標準命令。Transact-SQL編程語言提供了3種函數。
? 行集函數:行集函數可以在Transact-SQL語句中當作表引用。
? 聚合函數:聚合函數用于對一組值執行計算并返回一個單一的值。
? 標量函數:標量函數用于對傳遞給它的一個或者多個參數值進行處理和計算,并返回一個單一的值。
5.流程控制語句
流程控制語句是指那些用來控制程序執行和流程分支的命令。在SQL Server中,流程控制語句主要用來控制SQL語句、語句塊或者存儲過程的執行流程。
2.2.3 Transact-SQL的一些重要命令
本節介紹幾個Transact-SQL中常用的命令,這些命令在通用SQL語句中是不支持的。
1.使用COMPUTE命令創建匯總報表
Transact-SQL也有創建數據庫報表的機制,即使用COMPUTE命令。比如,我們要從Teacher表中產生一個報表,顯示所有教師的姓名、工資以及平均工資信息,其報表生成代碼可表示如下。
SELECT Name, Wage FROM Teacher COMPUTE AVG(Wage)
在該例中,COMPUTE命令將整個報表作為一個整體執行運算,而COMPUTE BY命令則在指定的組或整個報表上執行運算。
2.PRINT命令
PRINT命令向客戶端返回一個用戶自定義的信息,即顯示一個字符串。顯示字符串的最大長度為255個字符、局部變量或全局變量。如果變量值不是字符串,必須先用數據類型轉換函數CONVERT將其轉換為字符串。
語法表示如下。
PRINT 'any ASCII text' | @local_variable | @@FUNCTION | string_expression
string_expression是可返回一個字符串的表達式,表達式的長度可以超過8000個字符,但超過8000的字符將不會顯示。
3.DECLARE命令
DECLARE命令用于聲明一個或多個局部變量、游標變量或表變量。在用DECLARE命令聲明之后,所有的變量都被賦予初值NULL。我們需要用SELECT或SET命令來給變量賦值。變量類型可為系統定義的或用戶定義的類型,但不能為TEXT、NTEXT、IMAGE類型。
語法表示如下。
DECLARE {{ @local_variable data_type }| { @cursor_variable_name CURSOR } | { table_type_definition }} [ ...n]]
CURSOR指明變量是局部的游標變量。
4.EXECUTE/KILL命令
EXECUTE命令用來執行存儲過程,KILL命令用于終止某一過程的執行,具體用法請參見第15章。
5.SQL Server的診斷工具—SET命令
Transact-SQL提供了一組SET命令,我們使用這些命令能設置某些選項,幫助分析Transact-SQL語句。這里我們介紹幾個常用的SET命令。
? SET STATISTICS IO ON:使服務器返回所請求的物理和邏輯頁數。
? SET STATISTICS TIME ON:使服務器顯示一條SQL語句的執行時間。
? SET SHOWPLAN ON:使服務器顯示指定查詢的執行計劃。
? SET NOEXEC ON:使服務器從語法上分析指定的查詢,但不執行該查詢。
? SET PARSONLY ON:使服務器檢查指定查詢的格式(句法),但不執行該查詢。Transact-SQL還具有下列控制查詢結果顯示方式的命令。
? SET ROWCOUNT n:使服務器僅顯示查詢結果中的前n行,即在返回指定結果行后便停止查詢處理。
? SET NOCOUNT ON:使服務器不報告查詢返回的結果的行數。
當然,我們可以通過SET…OFF命令取消選項的設置。下面我們以SET ROWCOUNT命令為例,介紹一下使用過程。
實例1 使用查詢分析器
這里通過SET ROWCOUNT命令,使服務器僅顯示查詢結果中的前3行,在查詢分析器中鍵入如下命令。
SET ROWCOUNT 3 SELECT * FROM Department
運行結果如圖2-6所示。

圖2-6 查詢分析器運行結果
與圖2-5對比不難發現,此時服務器確實只查詢了3列信息就停止查詢了。而如果要取消設置的SET ROWCOUNT命令,我們只需要執行SET ROWCOUNT 0即可。取消SET ROWCOUNT命令后的執行結果如圖2-7所示。

圖2-7 查詢分析器運行結果
6.SHUTDOWN命令關閉數據庫
SHUTDOWN命令用于停止SQL Server的執行。語法表示如下。
SHUTDOWN [WITH NOWAIT]
當使用NOWAIT參數時,SHUTDOWN命令立即停止SQL Server,在終止所有的用戶過程并對每一現行的事務發生一個回滾后,退出SQL Server。當沒有用NOWAIT參數時,SHUTDOWN命令將按以下步驟執行。
(1)終止任何用戶登錄SQL Server。
(2)等待尚未完成的Transact-SQL命令或存儲過程執行完畢。
(3)在每個數據庫中執行CHECKPOINT命令,將當前數據庫中被更改過的數據頁或日志頁,從數據緩沖器中強制寫入硬盤。
(4)停止SQL Server的執行。
7.USE命令
USE命令將當前使用的數據庫為指定數據庫。用戶必須是目標數據庫的用戶成員,或目標數據庫建有GUEST用戶賬號時,使用USE命令才能成功切換到目標數據庫。
當然,Transact-SQL提供的命令遠不只是這些,還包括BACKUP命令備份數據庫,DBCC命令驗證數據庫完整性、查找錯誤、分析系統使用情況,READTEXT、WRITETEXT命令讀寫TEXT、NTEXT或IMAGE類型的數據等。
說明
本節只是對Transact-SQL作一下簡單介紹,因為本書的一些章節要用到Transact-SQL的有關知識。關于Transact-SQL的詳細信息,讀者可參閱SQL Server數據庫系統的手冊。