讀古今文學網 > SQL入門經典 > 第一部分 SQL概念綜述 >

第一部分 SQL概念綜述

第1章 歡迎來到SQL世界

第1章 歡迎來到SQL世界

本章的重點包括:

SQL歷史簡介

介紹數據庫管理系統

一些基本術語和概念

介紹本書所使用的數據庫

歡迎來到SQL的世界,體驗當今世界龐大的不斷發展的數據庫技術。通過閱讀本書,我們可以獲得很多的知識,而這些是在當今關係型數據庫和數據管理領域生存所必需的。由於首先必須要介紹SQL的背景知識和一些預備知識,本章的主要內容是對後續章節的概述,這顯得有些單調,但這些貌似無聊的內容卻是體會本書後續精彩內容的基礎。

1.1 SQL定義及歷史

當今時代的任何事務都涉及數據,人們需要使用某種有組織的方法或機制來管理和檢索數據。如果數據被保存在數據庫中,這種機制便被稱為數據庫管理系統(DBMS)。數據庫管理系統已經產生多年了,其中大多數源自於大型機上的平面文件系統。隨著技術的發展,在不斷增長的商業需要、不斷增加的共享數據和互聯網的推動下,數據庫管理系統的使用已經偏離了其原始方向。

信息管理的現代浪潮主要是由關係型數據庫管理系統(RDBMS)實現的,後者是從傳統DBMS派生出來的。

現代數據庫與客戶端/服務器或Web技術相結合在當今是很常見的模式,公司使用這些方式來管理數據,從而在相應的市場保持競爭力。很多公司的趨勢是從客戶端/服務器模式轉移到Web模式,從而避免用戶在訪問重要數據時受到地點的限制。下面幾個小節將討論SQL和關係型數據庫,後者是當今最通用的DBMS實現。很好地理解關係型數據庫,以及如何在當今信息技術世界利用SQL來管理數據,對於理解SQL語言是十分重要的。

1.1.1 什麼是SQL

“結構化查詢語言(SQL)”是與關係型數據庫進行通信的標準語言,最初是由IBM公司以E.F. Codd博士的論文《A Relational Model of Data for Large Shared Data Banks》為原型開發出來的。在之後不久的 1979年,Relational Software公司(後來更名為Oracle公司)發佈了第一個SQL產品:ORACLE,現在已經成為關係型數據庫技術的領軍者。

當我們去別的國家旅行時,需要瞭解其語言才能更加方便。舉例來說,如果服務員只能使用其本國語言,那我們用母語點菜可能就會有麻煩。如果把數據庫看作一個要從中進行信息搜索的外國,那麼SQL就是我們向數據庫表達需求的語言,我們可以利用SQL進行查詢,從數據庫裡獲得特定的信息。

1.1.2 什麼是ANSI SQL

“美國國家標準化組織(ANSI)”是一個核准多種行業標準的組織。SQL作為關係型數據庫所使用的標準語言,最初是基於IBM的實現在1986年被批准的。1987年,“國際標準化組織(ISO)”把ANSI SQL作為國際標準。這個標準在 1992年進行了修訂(SQL-92),1999年再次修訂(SQL-99)。目前最新的標準是2008年7月開始採用的SQL-2008。

1.1.3 新標準:SQL-2008

SQL-2008由9個相關的文檔組成,在不遠的將來還可能增加其他文檔,以擴展標準來適應新出現的技術。

第1部分——SQL/架構:指定實現一致性的一般性需求,定義SQL的基本概念。

第2部分——SQL/基礎:定義SQL的語法和操作。

第3部分——SQL/調用級接口:定義程序編程與SQL的接口。

第4部分——SQL/持久存儲模塊:定義控制結構,進而定義SQL例程。還定義了包含SQL例程的模塊。

第9部分——外部數據管理(SQL/MED):定義SQL的擴展,用於通過使用數據包裹支持外部數據管理;還定義了數據鏈類型。

第10部分——對像語言綁定:定義 SQL 的擴展,支持把 SQL 語句內嵌到用 Java編寫的程序。

第11部分——信息和定義方案:定義信息方案和定義方案的規範,提供與SQL數據相關的結構和安全信息。

第13部分——使用 Java 編程語言的例程和類型:定義以 SQL 例程形式調用 Java靜態例程和類的功能。

第14部分——XML相關規範:定義SQL使用XML的方式。

對於新的ANSI標準(SQL-2008),DBMS聲稱的兼容有兩個級別:核心SQL支持和增強 SQL 支持。在下面這個網頁上可以找到 ANSI SQL 標準的超級鏈接:www.informit. com/title/9780672335419。

ANSI表示“美國國家標準化組織”,負責規劃各種產品和概念的標準。

標準顯然是有好處的,當然有時也有不足之處。最重要的是,標準指引廠商沿著恰當的開發方向前進。就SQL來說,標準提供了必要基本原則的骨架,從而最終讓不同的實現之間保持一致性,更好地實現可移植性(不僅是對於數據庫編程,而且是對於數據庫整體和管理數據庫的個人而言)。

有人認為標準並不是那麼好,它限制了靈活性和特定實現的功能。然而,大多數遵循標準的廠商都在特定產品裡實現了對標準SQL的增強,從而彌補了這種問題。

綜合考慮正反兩方面的因素,標準還是好的。標準定義了在任何SQL完整實現中都應該具有的功能,規劃的基本概念不僅讓各種相互競爭的 SQL 實現保持一致性,也提高了 SQL程序員的價值。

所謂SQL實現是指特定廠商的SQL產品或關係型數據庫管理系統。需要說明的是,SQL實現之間的差別是很大的。雖然有些實現的大部分是與ANSI兼容的,但沒有任何一種實現完全遵循標準。另外,ANSI 標準裡為了保持兼容性而必須遵守的功能列表在近些年並沒有太大改變,因此,新版本的RDBMS也必將保持與ANSI SQL的兼容性。

1.1.4 什麼是數據庫

簡單來說,數據庫就是數據集合。我們可以把數據庫看成這樣一種有組織的機制:它能夠存儲信息,用戶能夠以有效且高效的方式檢索其中的信息。

事實上,人們每天都在使用數據庫,只是沒有察覺到。電話簿就是個數據庫,其中的數據包括個人的姓名、地址和電話號碼。這些數據是按字母排序或是索引排序的,讓用戶能夠方便地找到特定的本地居民。實際上,這些數據保存在計算機上的某個數據庫裡。畢竟這些電話簿的每一頁都不是手寫的,而且每年都會發佈一個新版本。

數據庫必須被維護。由於居民會搬到其他城市或州,電話簿裡的項目就需要刪除或添加。類似地,當居民更改姓名、地址、電話號碼等信息時,相應的項目也要被修改。圖1.1 展示了一個簡單的數據庫。

圖1.1 數據庫

1.1.5 關係型數據庫

關係型數據庫由被稱為表的邏輯單元組成,這些表在數據庫內部彼此關聯。關係型數據庫可以將數據分解為較小的、可管理的邏輯單元,從而在公司這一級別上更易維護,並提供更優化的數據庫性能。如圖1.2所示,表之間通過共同的關鍵字(數據值)彼此關聯。

圖1.2 關係型數據庫

由於關係型數據庫裡的表是相互關聯的,所以通過一個查詢可以獲取足夠的數據(雖然需要的數據可能處於多個表裡)。由於關係型數據庫的表之間可以具有共同的關鍵字或字段,所以多個表裡的數據可以結合在一起形成一個數據集。本書後續內容會不斷展示關係型數據庫的優越之處,包括整體性能和方便的數據訪問。

1.1.6 客戶端/服務器技術

過去,計算機業由大型機統治著,它們是體積龐大、功能強悍的系統,具有大容量存儲和高速數據處理能力。用戶通過啞終端與主機通信,所謂啞終端就是沒有處理能力的終端,依靠主機的CPU、外設和內存進行工作。每個終端通過一個數據鏈連接到主機。主機模式能夠很好地實現其設計目的,並且在當今很多領域還在發揮作用,但另一種更偉大的技術出現了:客戶端/服務器模型。

在客戶端/服務器系統裡,主機被稱為服務器,可以通過網絡進行訪問(通常是局域網或廣域網)。訪問服務器的通常是個人計算機(PC)或其他服務器,而不是啞終端。每台個人計算機被稱為客戶端,通過網絡與服務器進行通信。這也就是“客戶端/服務器”名稱的由來。客戶端/服務器模型與主機模型之間最大的差別在於作為客戶端的個人計算機能夠自己“思考”,能夠利用自身的CPU和內存處理數據,並且能夠輕鬆地通過網絡訪問服務器。在大多數情況下,客戶端/服務器模型可以適用於當今全部商業需求。

現代數據庫系統位於多種不同的操作系統之上,而這些操作系統又運行在多種不同的計算機上。最常見的操作系統有基於Windows的系統、Linux和像UNIX這樣的命令行系統。數據庫主要位於客戶端/服務器和Web環境裡。不能實現數據庫系統的主要原因是缺乏培訓和經驗。對客戶端/服務器模型和基於Web的系統的理解已經與互聯網技術開發和網絡計算一起成為當今商業的強制要求(雖然有時顯得不合理)。圖1.3展示了客戶端/服務器技術的概念。

圖1.3 客戶端/服務器模型

1.1.7 基於Web的數據庫系統

商業信息系統正在向Web遷移。現在我們能夠通過互聯網訪問數據庫,這意味著使用瀏覽器(比如 IE 和 Firefox)就能訪問公司的信息。顧客(數據的用戶)能夠定購貨物、查看存貨、查看訂單狀態、修改賬目、轉賬等。

顧客只需打開瀏覽器,訪問公司的站點、登錄,就可以利用公司頁面內置的程序訪問數據。大多數公司要求用戶註冊,並且為顧客提供登錄名和密碼。

當然,通過瀏覽器訪問數據庫的幕後工作並不像看上去這麼簡單。舉例來說,Web程序可以運行SQL,從而訪問公司的數據庫,向Web服務器返回數據,然後再將數據返回到顧客的瀏覽器。

從用戶的角度來說,基於 Web 的數據庫系統類似於客戶端/服務器系統。每個用戶擁有一台客戶機,安裝了瀏覽器程序,能夠連接到互聯網。圖1.3 所示的網絡是互聯網,這並不是必需的。在大多數情況下,客戶機訪問服務器是為了獲取信息,並不關心服務器是否位於另一個州,甚至是另一個國家。基於Web的數據庫系統的主要目的在於利用似乎沒有物理界限的數據庫系統,提高數據可訪問性,擴大公司的客戶群。

1.1.8 主流數據庫廠商

當今主流數據庫廠商包括Oracle、Microsoft、Informix、Sybase和IBM。這些廠商以昂貴的基本許可費用出售各種版本的關係型數據庫的閉源版本。其他一些廠商提供 SQL數據庫(關係型數據庫)的開源版本,這些廠商包括 MySQL、PostgresSQL 和 SAP。雖然還有其他很多廠商,但在此列出的這些名稱經常會出現在圖書、報紙、雜誌、股市和互聯網上。

每個廠商的SQL實現都是與眾不同、獨一無二的。數據庫服務器就是一個產品——像市場上的其他產品一樣,由多個不同的廠商生產。為了實現可移植性和易用性,廠商都保證其實現兼容於當前的ANSI標準。如果一家公司從一個數據庫服務器遷移到另一個時需要用戶學習另一種語言來保持數據庫功能,那就太糟糕了。

但是,每個廠商的SQL實現都針對其數據庫服務器進行了增強,這些增強,或稱之為擴展,是一些額外的命令和選項,附加於標準SQL軟件包上,由特定的實現提供。

1.2 SQL會話

SQL會話是用戶利用SQL命令與關係型數據庫進行交互時發生的事情。當用戶與數據庫創建連接時,會話就被創建了。在SQL會話範圍之內,用戶可以輸入有效的SQL命令對數據庫進行查詢,操作數據庫裡的數據,定義數據庫結構(比如表)。會話可以通過直接與數據庫創建連接來申請,也可以通過前端程序來申請。無論何種情況,會話通常是由通過網絡訪問數據庫的用戶在終端或工作站創建的。

1.2.1 CONNECT

當用戶連接到數據庫時,SQL會話就被初始化了。命令CONNECT用於創建與數據庫的連接,它可以申請連接,也可以修改連接。舉例來說,如果目前以 user1 的身份連接到數據庫,我們還可以用CONNECT命令以user2的身份連接到數據庫;連接成功之後,用於user1的SQL會話就被隱含地斷開了。連接數據庫通常需要用到以下命令:

在嘗試連接到數據庫時,用戶會看到一個提示,要求輸入與當前用戶名對應的密碼。用戶名用於向數據庫說明身份,而密碼是允許進行訪問的鑰匙。

1.2.2 DISCONNECT和EXIT

當用戶與數據庫斷開連接時,SQL會話就被結束了。命令DISCONNECT用於斷開用戶與數據庫的連接。當中斷與數據庫的連接之後,用戶所使用的程序可能顯得還在與數據庫通信,但實際上已經沒有連接了。當使用EXIT命令離開數據庫時,SQL會話就結束了,而且用於訪問數據庫的軟件通常會關閉。

1.3 SQL命令的類型

下面將討論執行各種功能的SQL命令的基本分類。這些功能包括綁定數據庫對像、操作對像、用數據填充數據庫表、更新表裡的現有數據、刪除數據、執行數據庫查詢、控制數據庫訪問和數據庫管理。

主要的分類包括:

數據定義語言(DDL);

數據操作語言(DML);

數據查詢語言(DQL);

數據控制語言(DCL);

數據管理命令;

事務控制命令。

1.3.1 定義數據庫結構

數據定義語言(DDL)用於創建和重構數據庫對象,比如創建和刪除表。

本書要討論的一些最基礎的DDL命令包括:

這些命令將在第3章、第17章和第20章中詳細討論。

1.3.2 操作數據

數據操作語言(DML)用於操作關係型數據庫對像內部的數據。

3個基本DML命令是:

這些命令將在第5章中詳細討論。

1.3.3 選擇數據

雖然只具有一個命令,但數據查詢語言(DQL)是現代關係型數據庫用戶最關注的部分,它的基本命令是SELECT。

這個命令具有很多選項和子句,用於構成對關係型數據庫的查詢。查詢是對數據庫進行的信息調查,一般通過程序界面或命令行提示符向數據庫發出。無論是簡單的還是複雜的查詢,含煳的還是明確的查詢,都可以輕鬆地實現。

這個命令將在第7章到第16章中充分介紹。

1.3.4 數據控制語言

SQL裡的數據控制語言用於控制對數據庫裡數據的訪問。這些數據控制語言(DCL)命令通常用於創建與用戶訪問相關的對象,以及控制用戶的權限。這些控制命令包括:

這些命令通常與其他命令組合在一起,在本書多個章節中都有介紹。

1.3.5 數據管理命令

數據管理命令用於對數據庫裡的操作進行審計和分析,還有助於分析系統性能。常用的兩個數據管理命令如下所示:

不要把數據管理與數據庫管理混為一談。數據庫管理是對數據庫的整體管理,它包括各級命令的使用。對於不同的SQL實現來說,數據管理與SQL語言的核心命令相比具有更明顯的獨特性。

1.3.6 事務控制命令

除了前面介紹的幾類命令,下面這些命令可以用於管理數據庫事務。

COMMIT:保存數據庫事務。

ROLLBACK:撤銷數據庫事務。

SAVEPOINT:在一組事務裡創建標記點以用於回退(ROLLBACK)。

SET TRANSACTION:設置事務的名稱。

事務命令將在第6章中詳細討論。

1.4 本書使用的數據庫

在繼續討論SQL基礎知識之前,我們先來介紹一下本書後續課程中要使用的數據庫。下面的小節會介紹所用的表,說明它們之間的關係、它們的結構,並展示其中包含的數據。

圖1.4 展示了本書範例、測驗和練習中所用的表的關係。每個表都有不同的名稱、包含一些字段。圖中的映射線表示了特定表之間通過共享字段(通常被稱為主鍵)創建的聯繫。

圖1.4 本書所用表之間的關係

1.4.1 表命名標準

像商業活動中的其他標準一樣,表命名標準對於保持良好的控制也是非常重要的。從前面對於表和數據的介紹可以看出,每個表的名稱都以_TBL 作為後綴,這種方式也是很多站點所採用的。後綴_TBL 說明這個對象是個表,而關係型數據庫裡存在著多種不同類型的對象。例如,在後續章節會出現後綴_INX,這說明對象是表的索引。命名標準幾乎存在於整個機制之內,對任何關係型數據庫的管理都起到了重要的輔助作用。需要說明的是,在命名數據庫對像時,並不是一定要使用後綴。所謂的命名標準,只是為了在創建對象的時候有一定的準則可以用來遵循。讀者可以根據自己的喜好來自由選擇命名標準。

注意:不僅要遵循 SQL 實現的對象命名規則,還要符合本地商業規則,從而創建出具有描述性的、與業務數據相關聯的名稱。

1.4.2 數據一瞥

下面將展示本書所用表裡包含的數據。請花一些時間來研究這些數據,觀察它們的區別,瞭解數據之間和表之間的關係。其中有些字段不是一定要包含數據,這是在創建表時指明的。

1.4.3 表的構成

存儲和維護有價值的數據是數據庫存在的原因。前面的數據是用來解釋本書中的SQL概念的,下面進一步詳細介紹表裡的元素。記住,表是數據存儲的最常見和最簡單的形式。

一、字段

每個表都可以分解為更小的項,這些項被稱為“字段”。字段是表裡的一列,用於保持每條記錄的特定信息。表PRODUCTS_TBL裡的字段包括PROD_ID、PROD_DESC和COST。這些字段對表中的信息進行分類保存。

二、記錄或一行數據

記錄,也被稱為一行數據,是表裡的各行。以表PRODUCTS_TBL為例,它的第一行記錄如下所示:

很明顯,這條記錄由產品標識、產品描述和單價組成,對於每一種不同的產品,表PRODUCTS_TBL裡都有一條相應的記錄。

在關係型數據庫的表裡,一行數據是指一條完整的記錄。

三、列

列是表裡垂直的一項,包含表裡特定字段的全部信息。舉例來說,表 PRODUCTS_TBL裡代表產品描述的一列包含以下內容:

這一列基於字段PROC_DESC,也就是產品描述。一列包含了表裡每條記錄中特定字段的全部信息。

四、主鍵

主鍵用於區分表裡每一條數據行。表 PRODUCTS_TBL 裡的主鍵是 PROD_ID,它通常是在表創建過程中初始化的。主鍵的特性確保了所有產品標識都是唯一的,也就是說表PRODUCTS_TBL裡每條記錄都具有不同的PROD_ID。主鍵避免了表中有重複的數據,並且還具有其他用途,具體介紹請見第3章。

五、NULL值

NULL是表示“沒有值”的專用術語。如果表中某個字段的值是NULL,其表現形式就是字段為空,其值就是沒有值。NULL並不等同於0或空格。值為NULL的字段在表創建過程中會保持為空。比如在表EMPLOYEE_TBL裡,並不是每個僱員的姓名裡都有中間名,其相應字段的值就是NULL。

後續兩章將詳細介紹表裡的其他元素。

1.4.4 範例和練習

本書中的很多練習使用MySQL、Microsoft SQL Server和Oracle數據庫來生成範例。這三種數據庫都具有免費版本,可以自由選擇一種來安裝,以便完成本書所設置的練習。但是由於這三種數據庫都不能與SQL-2008完全兼容,因此練習的結果可能會有一些細小的差別,不完全復合ANSI標準。不過,掌握了基本的ANSI標準以後,讀者就可以在不同的數據庫實現之間進行自由切換,以便解決大部分的問題了。

1.5 小結

前面介紹了SQL標準語言,簡要說明了其歷史,粗略展示了這個標準在過去是如何進化的。另外還討論了數據庫系統和當今技術,包括關係型數據庫、客戶端/服務器系統、基於Web的系統,這些對於理解SQL都是非常重要的。還介紹了SQL語言的主要組件,說明了關係型數據庫市場裡有眾多的廠商,當然也就有多種各具特色的SQL實現。雖然它們與ANSI SQL都略有不同,但大多數廠商都在一定範圍內遵循當前標準(SQL-2008),後者維護了SQL的一致性,讓SQL程序具有可移植性。

另外還介紹了本書所使用的數據庫。從前面的內容可以看到,數據庫由一些表組成,它們彼此有一定的關聯;我們也看到此時表中包含的數據。本章還介紹了SQL的一些背景知識,展示了現代數據庫的概念。在完成本章的練習之後,讀者會信心十足地繼續後面的課程。

1.6 問與答

問:如果要學習SQL,是不是可以使用SQL的任何一種實現呢?

答:是的,只要數據庫的實現是兼容ANSI SQL的,我們就可以與之交互。如果實現並不是完全兼容的,我們只需要稍作調整即可。

問:在客戶端/服務器環境裡,個人計算機是客戶端,還是服務器?

答:個人計算機被認為是客戶端,但有時服務器也可以充當客戶端的角色。

問:創建每一個表都必須使用_TBL作為名稱後綴嗎?

答:當然不是。使用_TBL 作為表名稱後綴是我們所選擇的一種命名方式,能夠方便地標識出數據庫裡的表。當然還可以把 TBL 完整拼寫為 TABLE,或是避免使用後綴,比如EMPLOYEE_TBL可以只命名為EMPLOYEE。

1.7 實踐

下面的內容包含一些測試問題和實戰練習。這些測試問題的目的在於檢驗對學習內容的理解程度。實戰練習是為了把學習的內容應用於實踐,並且鞏固對知識的掌握。在繼續學習之前請先完成測試與練習,答案請見附錄C。

1.7.1 測驗

1.縮寫“SQL”的含義是什麼?

2.SQL命令的6個主要類別是什麼?

3.4個事務控制命令是什麼?

4.對於數據庫訪問來說,客戶端/服務器模型與Web技術之間的主要區別是什麼?

5.如果一個字段被定義為NULL,這是否表示這個字段必須要輸入某些內容?

1.7.2 練習

1.說明下面的SQL命令分別屬於哪個類別:

2.觀察下面這個表,選出適合作為主鍵的列:

3.參考附錄B,選擇一種數據庫實現,下載並安裝好,為後面的練習做準備。