1 SQL 的哲學 形如 Linux 哲學一切都是文件,在 SQL 領域也有這樣一條至理名言 2 關係資料庫 所謂關係資料庫(Relational database)是創建在關係模型基礎上的資料庫,藉助於集合代數等數學概念和方法來處理資料庫中的數據。 現實世界中的各種實體以及實體之間的各種聯繫均用關 ...
1 SQL 的哲學
形如 Linux 哲學一切都是文件,在 SQL 領域也有這樣一條至理名言
一切都是關係
2 關係資料庫
所謂關係資料庫(Relational database)是創建在關係模型基礎上的資料庫,藉助於集合代數等數學概念和方法來處理資料庫中的數據。
現實世界中的各種實體以及實體之間的各種聯繫均用關係模型表示。現如今雖然對此模型有一些批評意見,但它還是數據存儲的傳統標準。標準數據查詢語言SQL就是一種基於關係資料庫的語言,這種語言執行對關係資料庫中數據的檢索和操作。
關係模型由關係數據結構、關係操作集合、關係完整性約束三部分組成。
2.1 數據結構
- 表(關係Relation)
以列(值組Tuple)和行(屬性Attribute)的形式組織起來的數據的集合。一個資料庫包括一個或多個表(關係Relation)。例如,可能有一個有關作者信息的名為authors的表(關係Relation)。每行(屬性Attribute)都包含特定類型的信息,如作者的姓氏。每列(值組Tuple)都包含有關特定作者的所有信息:姓、名、住址等等。在關係型資料庫當中一個表(關係Relation)就是一個關係,一個關係資料庫可以包含多個表(關係Relation) - 行
也稱為記錄(Record),代表了關係中的單個實體。 列
也稱為欄位(Field),表示實體的某個屬性。表中的每個列都有一個對應的數據類型,常見的數據類型包括字元類型、數字類型、日期時間類型等。2.2 操作集合
關係模塊中常用的操作包括:- 增加(Create)
- 查詢(Retrieve)
- 更新(Update)
刪除(Delete)
其中,使用最多、也最複雜的操作就是數據查詢,具體來說包括
- 選擇(Selection)
- 投影(Projection)
- 並集(Union)
- 交集(Intersection)
- 差集(exception)
- 笛卡兒積(Cartesian product)
- ...
2.3 完整性約束
完整性約束包括
2.3.1 實體完整性(Entity integrity)
實體完整性(是關係模型中資料庫完整性三項規則的其中之一。實體完整性這項規則要求每個數據表都必須有主鍵,而作為主鍵的所有欄位,其屬性必須是獨一及非空值。
在關係資料庫中,唯一標識每一行數據的欄位稱為主鍵(Primary Key),主鍵欄位不能為空。每個表有且只能有一個主鍵。
2.3.2 參照完整性
又稱引用完整性,是數據的屬性,用以表明引用的有效。參照的完整性不允許關係中有不存在的實體引用。參照完整性與實體完整性二者,皆是關係模型必須滿足的完整性約束條件,其目的在於保證數據的一致性。
外鍵的參照完整性。
- 外鍵(Foreign Key)代表了兩個表之間的關聯關係
比如員工屬於某個部門;因此員工表中存在部門編號欄位,引用了部門表中的部門編號欄位。對於外鍵引用,被引用的數據必須存在,員工不可能屬於一個不存在的部門;刪除某個部門之前,也需要對部門中的員工進行相應的處理。
2.3.3 用戶定義完整性
基於業務需要自定義的約束。
非空約束(NOT NULL)
確保了相應的欄位不會出現空值,例如員工一定要有姓名唯一約束(UNIQUE)
用於確保欄位中的值不會重覆,每個員工的電子郵箱必須唯一- 檢查約束(CHECK)
可以定義更多的業務規則,例如,薪水必須大於 0 ,字元必須大寫等 預設值(DEFAULT)
用於向欄位中插入預設的數據。
MySQL 中只有 InnoDB 存儲引擎支持外鍵約束;MySQL 8.0.16 增加了對檢查約束的支持。因此我們強大的 MySQL 支持以上所有約束。
從 MySQL 5.5 開始預設使用 InnoDB 存儲引擎,支持事務處理(ACID)、行級鎖定、故障恢復、多版本併發控制(MVCC)以及外鍵約束等
3 SQL:面向集合編程
3.1 語法特性
SQL 是一種聲明性的編程語言,語法接近於自然語言(英語)。通過幾個簡單的英文單詞,例如 SELECT、INSERT、UPDATE、CREATE、DROP 等,完成大部分的資料庫操作。
簡單的查詢示例
可以看出,SQL 簡單直觀。- 以上查詢中的 SELECT、FROM 等稱為關鍵字(也稱為子句),一般大寫
- 表名、列名等內容一般小寫
分號(;)表示語句的結束
SQL 語句不區分大小寫,但是遵循一定的規則可以讓代碼更容易閱讀。
SQL 是一種聲明式的語言,聲明式語言的主要思想是告訴電腦想要什麼結果(what),但不指定具體怎麼做。這類語言還包括 HTML、正則表達式以及函數式編程等。
3.2 面向集合
對於 SQL 語句而言,它所操作的對象是一個集合(表),操作的結果也是一個集合(表)。例如以下查詢:
SELECT emp_id, emp_name, salary
FROM employee;
其中 employee 是一個表,它是該語句查詢的對象;同時,查詢的結果也是一個表。所以,我們可以繼續擴展該查詢:
SELECT emp_id, emp_name, salary
FROM (
SELECT emp_id, emp_name, salary
FROM employee
) dt;
我們將括弧中的查詢結果(取名為 dt)作為輸入值,傳遞給了外面的查詢;最終整個語句的結果仍然是一個表。
SQL 中的查詢可以完成各種數據操作,例如過濾轉換、分組彙總、排序顯示等;但是它們本質上都是針對錶的操作,結果也是表。
不僅僅是查詢語句,SQL 中的插入、更新和刪除都以集合為操作對象。我們再看一個插入數據的示例:
CREATE TABLE t(id INTEGER);
-- 適用於 MySQL、SQL Server 以及 PostgreSQL
INSERT INTO t(id)
VALUES (1), (2), (3);
我們首先使用 CREATE TABLE 語句創建了一個表,然後使用 INSERT INTO 語句插入數據。在執行插入操作之前,會在記憶體中創建一個包含 3 條數據的臨時集合(表),然後將該集合插入目標表中。由於我們通常一次插入一條數據,以為是按照數據行進行插入;實際上,一條數據也是一個集合,只不過它只有一個元素而已。
UNION ALL 是 SQL 中的並集運算,用於將兩個集合組成一個更大的集合。此外,SQL 還支持交集運算(INTERSECT)、差集運算(EXCEPT)以及笛卡兒積(Cartesian product)
4 資料庫案例
包含 3 個表:員工表(employee)、部門表(department)和職位表(job)。
結構圖,也稱為實體-關係圖(Entity-Relational Diagram)
5 總結
關係模型中定義了一個簡單的數據結構,即關係(表),用於存儲數據。SQL 是關係資料庫的通用標準語言,通過聲明的方式執行數據定義、數據操作、訪問控制等。
記住,對於 SQL,一切都是關係(表)。