本文介紹資料庫的結構和基本理論,以及資料庫的實際應用。同時還介紹關係資料庫專用的 SQL 語句的書寫方法和規則。 一、資料庫是什麼 本節重點 資料庫是將大量數據保存起來,通過電腦加工而成的可以進行高效訪問的數據集合。 用來管理資料庫的電腦系統稱為資料庫管理系統(DBMS)。 通過使用 DBMS, ...
目錄
本文介紹資料庫的結構和基本理論,以及資料庫的實際應用。同時還介紹關係資料庫專用的 SQL 語句的書寫方法和規則。
一、資料庫是什麼
本節重點
資料庫是將大量數據保存起來,通過電腦加工而成的可以進行高效訪問的數據集合。
用來管理資料庫的電腦系統稱為資料庫管理系統(DBMS)。
通過使用 DBMS,多個用戶便可安全、簡單地操作大量數據。
資料庫有很多種類,本文將介紹如何使用專門的 SQL 語言來操作關係資料庫。
關係資料庫通過關係資料庫管理系統(RDBMS)進行管理。
1.1 我們身邊的資料庫
大家都有過下麵這樣的經歷吧?
-
收到曾經為自己診治過的牙醫寄來的明信片,上面寫著“距上次檢查已有半年,請您再來做個牙齒健康檢查”。
-
在生日的前一個月,收到曾入住過的旅店或賓館發來的“生日當月入住優惠”的郵件或者明信片。
-
在網上商城購物之後,收到內附“推薦商品列表”的郵件。
這可能是因為牙醫、旅店或商城的經營者掌握了顧客上一次的就診日期、生日和購買歷史等信息,並且擁有能夠從大量彙總信息中快速獲取所需信息(比如你的住址或愛好)的設備(電腦系統)。
如果利用人工完成同樣的工作,真不知道要多長時間呢。
另外,現在所有地區的圖書館都配備了電腦,實現了圖書的自動查詢。
使用該系統,可以通過檢索書名或出版年份快速查找出希望借閱的圖書的所在位置,以及是否已經借出等信息。
正是因為擁有了可以保存圖書名稱、出版年份以及保管位置和外借情況等信息,並且可以按需查詢的設備,才使這一切成為可能。
像這樣將大量數據保存起來,通過電腦加工而成的可以進行高效訪問的數據集合稱為資料庫(Database,DB)。
將姓名、住址、電話號碼、郵箱地址、愛好和家庭構成等數據保存到資料庫中,就可以隨時迅速獲取想要的信息了。
用來管理資料庫的電腦系統稱為資料庫管理系統(Database Management System,DBMS)[1]。
系統的使用者通常無法直接接觸到資料庫。因此,在使用系統的時候往往意識不到資料庫的存在。
其實大到銀行賬戶的管理,小到手機的電話簿,可以說社會的所有系統中都有資料庫的身影(圖 1)。
1.2 為什麼 DBMS 那麼重要
那麼,為什麼要使用專用系統(DBMS)來管理數據呢?我們通過電腦管理數據的時候,通常使用文本文件 [2] 或者 Excel 那樣的電子製表軟體就可以完成了,非常簡單。
確實,通過文本文件或者電子製表軟體來管理數據的方法非常簡便,但也有不足。下麵就舉幾個有代表性的例子。
-
無法多人共用數據
保存在已連接網路的電腦中的文件,可以通過共用設定實現多個用戶線上閱讀或編輯。但是,當某個用戶打開該文件的時候,其他用戶就無法進行編輯了。
如果是網上商城的話,當某個用戶購買商品的時候,其他用戶就無法購買了。
-
無法提供操作大量數據所需的格式
要想瞬間從幾十萬或者上百萬的數據中獲取想要的數據,必須把數據保存為適當的格式,但是文本文件和 Excel 工作表等無法提供相應的格式。
-
實現讀寫自動化需要編程能力
通過編寫電腦程式(以下簡稱程式)可以實現數據讀取和編輯自動化,但這必須以瞭解數據結構為前提,還需具備一定的電腦編程技術。
-
無法應對突發事故
當文件被誤刪、硬碟出現故障等導致無法讀取的時候,可能會造成重要數據丟失,同時數據還可能被他人輕易讀取或竊用。
DBMS 可以剋服這些不足,實現多個用戶同時安全簡單地操作大量數據(圖 2)。這也是我們一定要使用 DBMS 的原因。
1.3 DBMS 的種類
DBMS 主要通過數據的保存格式(資料庫的種類)來進行分類,現階段主要有以下 5 種類型。
-
層次資料庫(Hierarchical Database,HDB)
最古老的資料庫之一,它把數據通過層次結構(樹形結構)的方式表現出來。層次資料庫曾經是資料庫的主流,但隨著關係資料庫的出現和普及,現在已經很少使用了。
-
關係資料庫(Relational Database,RDB)
關係資料庫是現在應用最廣泛的資料庫。關係資料庫在 1969 年誕生,可謂歷史悠久。和 Excel 工作表一樣,它也採用由行和列組成的二維表來管理數據,所以簡單易懂(表 1)。
同時,它還使用專門的 SQL(Structured Query Language,結構化查詢語言)對數據進行操作。
表 1 關係資料庫中的數據
商品編號 商品名稱 商品種類 銷售單價 進貨單價 登記日期 0001 T 恤衫 衣服 1000 500 2009-09-20 0002 打孔器 辦公用品 500 320 2009-09-11 0003 運動 T 恤 衣服 4000 2800 0004 菜刀 廚房用具 3000 2800 2009-09-20 0005 高壓鍋 廚房用具 6800 5000 2009-01-15 0006 叉子 廚房用具 500 2009-09-20 0007 擦菜板 廚房用具 880 790 2008-04-28 0008 圓珠筆 辦公用品 100 2009-11-11 這種類型的 DBMS 稱為關係資料庫管理系統(Relational Database Management System,RDBMS)。比較具有代表性的 RDBMS 有如下 5 種。
-
Oracle Database :甲骨文公司的 RDBMS
-
SQL Server :微軟公司的 RDBMS
-
DB2 :IBM 公司的 RDBMS
-
PostgreSQL :開源的 RDBMS
-
MySQL :開源的 RDBMS
另外,Oracle Database 通常簡稱為 Oracle。
-
-
面向對象資料庫(Object Oriented Database,OODB)
編程語言當中有一種被稱為面向對象語言的語言 [3]。把數據以及對數據的操作集合起來以對象為單位進行管理,因此得名。面向對象資料庫就是用來保存這些對象的資料庫。
-
XML 資料庫(XML Database,XMLDB)
最近幾年,XML [4] 作為在網路上進行交互的數據的形式逐漸普及起來。XML 資料庫可以對 XML 形式的大量數據進行高速處理。
-
鍵值存儲系統(Key-Value Store,KVS)
這是一種單純用來保存查詢所使用的主鍵(Key)和值(Value)的組合的資料庫。具有編程語言知識的讀者可以把它想象成關聯數組或者散列(hash)。
近年來,隨著鍵值存儲系統被應用到 Google 等需要對大量數據進行超高速查詢的 Web 服務當中,它正逐漸為人們所關註。
本文向大家介紹使用 SQL 語言的資料庫管理系統,也就是關係資料庫管理系統(RDBMS)的操作方法。
接下來還會深入講解 RDBMS。如無特殊說明,本文所提到的資料庫以及 DBMS 都是指 RDBMS。
另外,有的 RDBMS 也可以像 XML 資料庫那樣操作 XML 形式的數據,或者具有面向對象資料庫的功能。
本文並不會介紹用於這些擴展功能的 SQL,如果要瞭解這些內容,請參考 RDBMS 附帶的 SQL 手冊或者針對不同的 RDBMS 介紹 SQL 的圖書。
二、資料庫的結構
本節重點
RDBMS 通常使用客戶端/伺服器這樣的系統結構。
通過從客戶端向伺服器端發送 SQL 語句來實現資料庫的讀寫操作。
關係資料庫採用被稱為資料庫表的二維表來管理數據。
資料庫表由表示數據項目的列(欄位)和表示一條數據的行(記錄)所組成,以記錄為單位進行數據讀寫。
本文將行和列交匯的方格稱為單元格,每個單元格只能輸入一個數據。
2.1 RDBMS 的常見系統結構
使用 RDBMS 時,最常見的系統結構就是 客戶端/伺服器類型(C/S 類型) 這種結構(圖 3)。
伺服器指的是用來接收其他程式發出的請求,並對該請求進行相應處理的程式(軟體),或者是安裝了此類程式的設備(電腦)。在電腦上持續執行處理,並等待接收下一條請求。
RDBMS 也是一種伺服器,它能夠從保存在硬碟上的資料庫中讀取數據並返回,還可以把數據變更為指定內容。
與之相對,向伺服器發出請求的程式(軟體),或者是安裝了該程式的設備(電腦)稱為客戶端。訪問由 RDBMS 管理的資料庫,進行數據讀寫的程式稱為 RDBMS 客戶端。
RDBMS 客戶端將想要獲取什麼樣的數據,或者想對哪些數據進行何種變更等信息通過 SQL 語句發送給 RDBMS 伺服器。
RDBMS 根據該語句的內容返回所請求的數據,或者對存儲在資料庫中的數據進行更新。
客戶端就如同委托方,而伺服器就像是受托方。由於兩者關係類似受托方執行委托方發出的指令,故而得名。
這樣就可以使用 SQL 語句來實現關係資料庫的讀寫操作了。
本文為了給大家講解 SQL,使用了可以顯示如何將 SQL 語句發送到 RDBMS,以及接收返回信息(數據)的客戶端。具體內容請參考 如何在 Windows 10 中安裝 PostgreSQL 和連接設置。
另外,RDBMS 既可以和其客戶端安裝在同一臺電腦上,也可以分別安裝在不同的電腦上。這樣一來,不僅可以通過網路使二者相互關聯,還可以實現多個客戶端訪問同一個 RDBMS(圖 4)。
客戶端沒有必要使用同樣的程式,只要能將 SQL 發送給 RDBMS,就可以操作資料庫了。並且,多個客戶端還可以同時對同一個資料庫進行讀寫操作。
另外,RDBMS 除了需要同時接收多個客戶端的請求之外,還需要操作存有大量數據的資料庫,因此通常都會安裝在比客戶端性能更優越的電腦上。
操作數據量特別巨大的資料庫時,還可以將多台電腦組合使用。
雖然 RDBMS 的系統結構多種多樣,但是從客戶端發來的 SQL 語句基本上都是一樣的。
2.2 表的結構
讓我們再具體瞭解一下 RDBMS 的結構。上一節我們講到了關係資料庫通過類似 Excel 工作表那樣的、由行和列組成的二維表來管理數據。用來管理數據的二維表在關係資料庫中簡稱為表。
表存儲在由 RDBMS 管理的資料庫中,如圖 5 所示。一個資料庫中可以存儲多個表。
根據 SQL 語句的內容返回的數據同樣必須是二維表的形式,這也是關係資料庫的特征之一。返回結果如果不是二維表的 SQL 語句則無法執行。
另外,圖 5 中只有一個資料庫,我們還可以創建多個資料庫分別用於不同用途。
圖 6 所示為之後的學習中實際用到的商品表的內容。
表的列(垂直方向)稱為欄位,它代表了保存在表中的數據項目。在表 2 的商品表中,從商品編號到登記日期一共有 6 列。
對於列的約束比 Excel 更加嚴格,定義為數字的列只能輸入數字,定義為日期的列只能輸入日期(在 SQL 如何對錶進行創建、更新和刪除操作 詳細介紹)。
與之相對,表的行(水平方向)稱為記錄,它相當於一條數據。商品表中總共有 8 行數據。關係資料庫必須以行為單位進行數據讀寫,請大家牢記。
法則 1
關係資料庫以行為單位讀寫數據。
本文將圖 6 所示的行和列交匯的方格稱為單元格。一個單元格中只能輸入一個數據。像圖 7 那樣,在一個單元格中輸入 2 個或 2 個以上的數據是不允許的,請大家牢記。
法則 2
一個單元格中只能輸入一個數據。
專欄
RDBMS 的用戶管理
為了防止重要數據被竊讀或篡改,RDBMS 只允許註冊用戶接觸資料庫。
這裡的用戶並不是指 Windows 等操作系統的註冊用戶,而是只能用於 RDBMS 的用戶。RDBMS 允許註冊多個用戶。
註冊用戶的時候除了設定用戶名(賬號),還需要設定密碼。雖然密碼並不是必需的,但為了防止重要信息的泄露,還是希望大家能夠設定密碼。
三、SQL 簡介
本節要點
SQL 是為操作資料庫而開發的語言。
雖然 SQL 也有標準,但實際上根據 RDBMS 的不同 SQL 也不盡相同。
SQL 通過一條語句來描述想要進行的操作,發送給 RDBMS。
原則上 SQL 語句都會使用分號結尾。
SQL 根據操作目的可以分為 DDL、DML 和 DCL。
3.1 標準 SQL
如前所述,本文所要學習的 SQL 是用來操作關係資料庫的語言。
它原本是為了提高資料庫查詢效率而開發的語言,但是現在不僅可以進行數據查詢,就連數據的插入和刪除等操作也基本上都可以通過 SQL 來完成了。
國際標準化組織(ISO)為 SQL 制定了相應的標準,以此為基準的 SQL 稱為標準 SQL(相關信息請參考專欄——標準 SQL 和特定的 SQL)。
以前,完全基於標準 SQL 的 RDBMS 很少,通常需要根據不同的 RDBMS 來編寫特定的 SQL 語句。
這樣一來,就會造成能夠在 Oracle 中使用的 SQL 語句卻無法在 SQL Server 中使用,反之亦然。
近來,對標準 SQL 的支持取得了一些進展,因此希望準備學習 SQL 的讀者們能夠從現在開始就牢記標準 SQL 的書寫方式。
原則上,本文介紹的都是標準 SQL [5] 的書寫方式,但是根據 RDBMS 的不同也會存在一些特殊的 SQL 語句。如果遇到這種情況,將會通過其他途徑對其進行說明。
法則 3
學會標準 SQL 就可以在各種 RDBMS 中書寫 SQL 語句了。
3.2 SQL 語句及其種類
SQL 用關鍵字、表名、列名等組合而成的一條語句(SQL 語句)來描述操作的內容。
關鍵字是指那些含義或使用方法已事先定義好的英語單詞,存在包含“對錶進行查詢”或者“參考這個表”等各種意義的關鍵字。
根據對 RDBMS 賦予的指令種類的不同,SQL 語句可以分為以下三類。
-
DDL
DDL(Data Definition Language,數據定義語言) 用來創建或者刪除存儲數據用的資料庫以及資料庫中的表等對象。DDL 包含以下幾種指令。
-
CREATE
:創建資料庫和表等對象 -
DROP
:刪除資料庫和表等對象 -
ALTER
:修改資料庫和表等對象的結構
-
-
DML
DML(Data Manipulation Language,數據操縱語言) 用來查詢或者變更表中的記錄。DML 包含以下幾種指令。
-
SELECT
:查詢表中的數據 -
INSERT
:向表中插入新數據 -
UPDATE
:更新表中的數據 -
DELETE
:刪除表中的數據
-
-
DCL
DCL(Data Control Language,數據控制語言) 用來確認或者取消對資料庫中的數據進行的變更。
除此之外,還可以對 RDBMS 的用戶是否有許可權操作資料庫中的對象(資料庫表等)進行設定。DCL 包含以下幾種指令。
-
COMMIT
:確認對資料庫中的數據進行的變更 -
ROLLBACK
:取消對資料庫中的數據進行的變更 -
GRANT
:賦予用戶操作許可權 -
REVOKE
:取消用戶的操作許可權
-
實際使用的 SQL 語句當中有 90% 屬於 DML,本文同樣會以 DML 為中心進行講解。
法則 4
SQL 根據功能不同可以分為三類,其中使用最多的是 DML。
3.3 SQL 的基本書寫規則
書寫 SQL 語句時必須要遵守一些規則。這些規則都非常簡單,接下來就讓我們逐一認識一下吧。
-
SQL 語句要以分號(
;
)結尾一條 SQL 語句可以描述一個資料庫操作。在 RDBMS 當中,SQL 語句也是逐條執行的。
眾所周知,我們在句子的句尾加註標點表示結束,中文句子以句號(。)結尾,英文以點號(.)結尾,而 SQL 語句則使用 分號(
;
) 結尾。法則 5
SQL 語句以分號(
;
)結尾。 -
SQL 語句不區分大小寫
SQL 不區分關鍵字的大小寫。例如,不管寫成
SELECT
還是select
,解釋都是一樣的。表名和列名也是如此。雖然可以根據個人喜好選擇大寫還是小寫(或大小寫混雜),但為了理解起來更加容易,本文使用以下規則來書寫 SQL 語句。
-
關鍵字大寫
-
表名的首字母大寫
-
其餘(列名等)小寫
法則 6
關鍵字不區分大小寫。
但是插入到表中的數據是區分大小寫的。例如,在操作過程中,數據
Computer
、COMPUTER
或computer
,三者是不一樣的。 -
-
常數的書寫方式是固定的
SQL 語句常常需要直接書寫字元串 [6]、日期或者數字。例如,書寫向表中插入字元串、日期或者數字等數據的 SQL 語句。
在 SQL 語句中直接書寫的字元串、日期或者數字等稱為常數。常數的書寫方式如下所示。
SQL 語句中含有字元串的時候,需要像
'abc'
這樣,使用單引號('
)將字元串括起來,用來標識這是一個字元串。SQL 語句中含有日期的時候,同樣需要使用單引號將其括起來。日期的格式有很多種(
'26 Jan 2010'
或者'10/01/26'
等),本文統一使用'2010-01-26'
這種'年-月-日'
的格式。在 SQL 語句中書寫數字的時候,不需要使用任何符號標識,直接寫成
1000
這樣的數字即可。法則 7
字元串和日期常數需要使用單引號(
'
)括起來。數字常數無需加註單引號(直接書寫數字即可)。
-
單詞需要用半形空格或者換行來分隔
SQL 語句的單詞之間需使用半形空格或換行符來進行分隔。如下這種未加分隔的語句會發生錯誤,無法正常執行。
○ CREATE TABLE Product
× CREATETABLE Product
× CREATE TABLEProduct
但是不能使用全形空格作為單詞的分隔符,否則會發生錯誤,出現無法預期的結果。
法則 8
單詞之間需要使用半形空格或者換行符進行分隔。
專欄
標準 SQL 和特定的 SQL
每隔幾年,ANSI(美國國家標準協會)或 ISO(國際標準化組織)等便會修訂 SQL 的標準,進行語法的修訂並追加新功能。
1986 年,ANSI 首次制定了 SQL 的標準,之後又進行了數次修訂。修訂後的標準以修訂年份來命名,例如 SQL:1999、SQL:2003、SQL:2008 等。以這些標準為基準的 SQL 就是標準 SQL。
但是,SQL 的標準並不強制“每種 RDBMS 都必須使用”。雖然支持標準 SQL 的 RDBMS 越來越多,但還是存在標準 SQL 無法執行的情況。這時就需要使用只能在特定 RDBMS 中使用的特殊 SQL 語句。
其實,這也是沒有辦法的事情,起初(大約在 20 世紀 80 年代到 90 年代),標準 SQL 能夠實現的功能非常有限,無法完全滿足實際需要。RDBMS 的供應商為了彌補這些不足,不得不再單獨追加所需要的功能。
儘管如此,這些特定的 SQL 所帶來的並不都是負面的影響。標準 SQL 將一些獨特的功能收錄其中,對其自身的發展起到了積極的推進作用。
過去,各個供應商為了展現本公司的優勢和獨特性,也曾不遺餘力地開發各自特定的 SQL。目前的標準 SQL 經過多次修訂,功能已經十分完善。
準備學習 SQL 的讀者們,就讓我們先從牢記標準 SQL 的書寫方法開始吧。
原文鏈接:https://www.developerastrid.com/sql/database-and-sql/
(完)