1. 程式人生 > 其它 >資料庫和 SQL 是什麼關係

資料庫和 SQL 是什麼關係

目錄

本文介紹資料庫的結構和基本理論,以及資料庫的實際應用。同時還介紹關係資料庫專用的 SQL 語句的書寫方法和規則。

一、資料庫是什麼

本節重點

  • 資料庫是將大量資料儲存起來,通過計算機加工而成的可以進行高效訪問的資料集合。

  • 用來管理資料庫的計算機系統稱為資料庫管理系統(DBMS)。

  • 通過使用 DBMS,多個使用者便可安全、簡單地操作大量資料。

  • 資料庫有很多種類,本文將介紹如何使用專門的 SQL 語言來操作關係資料庫。

  • 關係資料庫通過關係資料庫管理系統(RDBMS)進行管理。

1.1 我們身邊的資料庫

大家都有過下面這樣的經歷吧?

  • 收到曾經為自己診治過的牙醫寄來的明信片,上面寫著“距上次檢查已有半年,請您再來做個牙齒健康檢查”。

  • 在生日的前一個月,收到曾入住過的旅店或賓館發來的“生日當月入住優惠”的郵件或者明信片。

  • 在網上商城購物之後,收到內附“推薦商品列表”的郵件。

這可能是因為牙醫、旅店或商城的經營者掌握了顧客上一次的就診日期、生日和購買歷史等資訊,並且擁有能夠從大量彙總資訊中快速獲取所需資訊(比如你的住址或愛好)的裝置(計算機系統)。

如果利用人工完成同樣的工作,真不知道要多長時間呢。

另外,現在所有地區的圖書館都配備了計算機,實現了圖書的自動查詢。

使用該系統,可以通過檢索書名或出版年份快速查找出希望借閱的圖書的所在位置,以及是否已經借出等資訊。

正是因為擁有了可以儲存圖書名稱、出版年份以及保管位置和外借情況等資訊,並且可以按需查詢的裝置,才使這一切成為可能。

像這樣將大量資料儲存起來,通過計算機加工而成的可以進行高效訪問的資料集合稱為資料庫(Database,DB)。

將姓名、住址、電話號碼、郵箱地址、愛好和家庭構成等資料儲存到資料庫中,就可以隨時迅速獲取想要的資訊了。

用來管理資料庫的計算機系統稱為資料庫管理系統(Database Management System,DBMS

[1]

系統的使用者通常無法直接接觸到資料庫。因此,在使用系統的時候往往意識不到資料庫的存在。

其實大到銀行賬戶的管理,小到手機的電話簿,可以說社會的所有系統中都有資料庫的身影(圖 1)。

圖 1 資料庫無處不在

1.2 為什麼 DBMS 那麼重要

那麼,為什麼要使用專用系統(DBMS)來管理資料呢?我們通過計算機管理資料的時候,通常使用文字檔案 [2] 或者 Excel 那樣的電子製表軟體就可以完成了,非常簡單。

確實,通過文字檔案或者電子製表軟體來管理資料的方法非常簡便,但也有不足。下面就舉幾個有代表性的例子。

  • 無法多人共享資料

    儲存在已連線網路的計算機中的檔案,可以通過共享設定實現多個使用者線上閱讀或編輯。但是,當某個使用者開啟該檔案的時候,其他使用者就無法進行編輯了。

    如果是網上商城的話,當某個使用者購買商品的時候,其他使用者就無法購買了。

  • 無法提供操作大量資料所需的格式

    要想瞬間從幾十萬或者上百萬的資料中獲取想要的資料,必須把資料儲存為適當的格式,但是文字檔案和 Excel 工作表等無法提供相應的格式。

  • 實現讀寫自動化需要程式設計能力

    通過編寫計算機程式(以下簡稱程式)可以實現資料讀取和編輯自動化,但這必須以瞭解資料結構為前提,還需具備一定的計算機程式設計技術。

  • 無法應對突發事故

    當檔案被誤刪、硬碟出現故障等導致無法讀取的時候,可能會造成重要資料丟失,同時資料還可能被他人輕易讀取或竊用。

DBMS 可以克服這些不足,實現多個使用者同時安全簡單地操作大量資料(圖 2)。這也是我們一定要使用 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)。

圖 3 使用 RDBMS 時的系統結構

伺服器指的是用來接收其他程式發出的請求,並對該請求進行相應處理的程式(軟體),或者是安裝了此類程式的裝置(計算機)。在計算機上持續執行處理,並等待接收下一條請求。

RDBMS 也是一種伺服器,它能夠從儲存在硬碟上的資料庫中讀取資料並返回,還可以把資料變更為指定內容。

與之相對,向伺服器發出請求的程式(軟體),或者是安裝了該程式的裝置(計算機)稱為客戶端。訪問由 RDBMS 管理的資料庫,進行資料讀寫的程式稱為 RDBMS 客戶端。

RDBMS 客戶端將想要獲取什麼樣的資料,或者想對哪些資料進行何種變更等資訊通過 SQL 語句傳送給 RDBMS 伺服器。

RDBMS 根據該語句的內容返回所請求的資料,或者對儲存在資料庫中的資料進行更新。

客戶端就如同委託方,而伺服器就像是受託方。由於兩者關係類似受託方執行委託方發出的指令,故而得名。

這樣就可以使用 SQL 語句來實現關係資料庫的讀寫操作了。

本文為了給大家講解 SQL,使用了可以顯示如何將 SQL 語句傳送到 RDBMS,以及接收返回資訊(資料)的客戶端。具體內容請參考 如何在 Windows 10 中安裝 PostgreSQL 和連線設定

另外,RDBMS 既可以和其客戶端安裝在同一臺計算機上,也可以分別安裝在不同的計算機上。這樣一來,不僅可以通過網路使二者相互關聯,還可以實現多個客戶端訪問同一個 RDBMS(圖 4)。

圖 4 通過網路可以實現多個客戶端訪問同一個資料庫

客戶端沒有必要使用同樣的程式,只要能將 SQL 傳送給 RDBMS,就可以操作資料庫了。並且,多個客戶端還可以同時對同一個資料庫進行讀寫操作。

另外,RDBMS 除了需要同時接收多個客戶端的請求之外,還需要操作存有大量資料的資料庫,因此通常都會安裝在比客戶端效能更優越的計算機上。

操作資料量特別巨大的資料庫時,還可以將多臺計算機組合使用。

雖然 RDBMS 的系統結構多種多樣,但是從客戶端發來的 SQL 語句基本上都是一樣的。

2.2 表的結構

讓我們再具體瞭解一下 RDBMS 的結構。上一節我們講到了關係資料庫通過類似 Excel 工作表那樣的、由行和列組成的二維表來管理資料。用來管理資料的二維表在關係資料庫中簡稱為

表儲存在由 RDBMS 管理的資料庫中,如圖 5 所示。一個數據庫中可以儲存多個表。

圖 5 資料庫和表的關係

根據 SQL 語句的內容返回的資料同樣必須是二維表的形式,這也是關係資料庫的特徵之一。返回結果如果不是二維表的 SQL 語句則無法執行。

另外,圖 5 中只有一個數據庫,我們還可以建立多個數據庫分別用於不同用途。

圖 6 所示為之後的學習中實際用到的商品表的內容。

圖 6 表的示例(商品表)

表的(垂直方向)稱為欄位,它代表了儲存在表中的資料專案。在表 2 的商品表中,從商品編號到登記日期一共有 6 列。

對於列的約束比 Excel 更加嚴格,定義為數字的列只能輸入數字,定義為日期的列只能輸入日期(在 SQL 如何對錶進行建立、更新和刪除操作 詳細介紹)。

與之相對,表的(水平方向)稱為記錄,它相當於一條資料。商品表中總共有 8 行資料。關係資料庫必須以行為單位進行資料讀寫,請大家牢記。

法則 1

關係資料庫以行為單位讀寫資料。

本文將圖 6 所示的行和列交匯的方格稱為單元格。一個單元格中只能輸入一個數據。像圖 7 那樣,在一個單元格中輸入 2 個或 2 個以上的資料是不允許的,請大家牢記。

圖 7 一個單元格中只能輸入一個數據

法則 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

    關鍵字不區分大小寫。

    但是插入到表中的資料是區分大小寫的。例如,在操作過程中,資料 ComputerCOMPUTERcomputer,三者是不一樣的。

  • 常數的書寫方式是固定的

    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/

(完)


  1. 資料庫(DB)和 DBMS 經常被混淆。為了加以區別,本文將資料庫管理系統統稱為 DBMS。 ↩︎

  2. 儲存只通過文字記錄的資料的檔案。 ↩︎

  3. 主要的面嚮物件語言包括 Java 和 C++ 等。 ↩︎

  4. eXtensible Markup Language 的縮寫,一種使用 HTML 那樣的標籤來表現資料結構的語言。以 <name>鈴木</name> 這樣的形式來儲存資料。 ↩︎

  5. 本文將介紹以 [SQL :2003] 為基準的標準 SQL 的書寫方式。 ↩︎

  6. 一個以上的連續字元。 ↩︎