SQL 基礎介紹:DDL、DML、TCL、DCL 與交易管理

閱讀時間約 13 分鐘

** 提醒自己要練習 SQL,本篇為作者自學筆記,圖與資源來自各大神和ChatGPT

SQL(結構化查詢語言)可以按照功能分成四種主要的語言類別,每一類別負責不同的資料庫操作。

1. DDL(Data Definition Language,資料定義語言)

功能: 用來定義資料庫的結構,例如建立、修改或刪除資料表和其他結構。

常見操作:

  • CREATE:建立新的資料表或資料庫。
  • ALTER:修改現有的資料表結構。
  • DROP:刪除資料表或資料庫。
  • TRUNCATE:清空資料表內容,但保留結構。

例子:(參考 ChatGPT)

建立名為 users 的表格
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);

-- 新增欄位 age 到 users 表格
ALTER TABLE users ADD age INT;

-- 刪除 users 表格
DROP TABLE users;

2. DML(Data Manipulation Language,資料操作語言)

功能: 用來處理資料庫中的資料,主要是查詢、插入、更新和刪除資料。

常見操作:

  • SELECT:查詢資料。
  • INSERT:插入新資料。
  • UPDATE:更新已存在的資料。
  • DELETE:刪除資料。

例子:

-- 插入一筆新資料到 users 表格
INSERT INTO users (id, name, email, age)
VALUES (1, 'Alice', 'alice@example.com', 25);

-- 更新 users 表格中 id 為 1 的資料
UPDATE users
SET age = 26
WHERE id = 1;

-- 刪除 users 表格中 age 小於 18 的資料
DELETE FROM users
WHERE age < 18;

3. TCL(Transaction Control Language,交易控制語言)

功能: 用來管理交易(transaction),確保資料的一致性與完整性,常用於多步驟的操作中。

常見操作:

  • COMMIT:提交交易,使修改永久生效。
  • ROLLBACK:回復上一個交易,取消之前的修改。
  • SAVEPOINT:設定交易的保存點,允許回復到某一特定階段。

例子:

-- 開始交易
BEGIN;

-- 插入資料
INSERT INTO users (id, name, email, age)
VALUES (2, 'Bob', 'bob@example.com', 30);

-- 由於發現錯誤,回復交易
ROLLBACK;

-- 重新插入正確的資料
INSERT INTO users (id, name, email, age)
VALUES (2, 'Bob', 'bob.correct@example.com', 30);

-- 提交交易
COMMIT;

4. DCL(Data Control Language,資料控制語言)

功能: 用來控制資料庫的存取權限,保障資料的安全性。

常見操作:

  • GRANT:授權給使用者特定的操作權限。
  • REVOKE:收回使用者的操作權限。

例子:

-- 給某使用者讀取和插入資料的權限
GRANT SELECT, INSERT ON users TO 'username';

-- 收回該使用者的插入權限
REVOKE INSERT ON users FROM 'username';

Transaction & ACID (dirty read, non-repeatable read, phantom read)

什麼是交易(Transaction)?

在 SQL 中,交易是一組邏輯操作單位,通常包含多個步驟(如插入、更新、刪除)。交易的目標是確保這些操作要麼全部成功,要麼全部失敗,保證資料的一致性和正確性。

範例:銀行轉帳

假設 A 要轉帳 200 元給 B,這筆交易包含以下兩個步驟:

  1. 從 A 的帳戶扣除 200 元。
  2. 增加 B 的帳戶 200 元。

為了保證這筆交易的完整性,這兩個步驟必須:

  • 要麼一起成功(完成轉帳)。
  • 要麼一起失敗(如果出錯,A 和 B 的餘額保持原樣)。

ACID 特性

為了設計可靠的交易系統,關聯交易必須具備以下四個特性,稱為 ACID

1. Atomicity(原子性)

定義:

交易中的所有操作必須視為一個整體(原子單位)。交易是一個大動作,要嘛成功要嘛失敗,沒有成功一半。

  • 若交易成功,所有操作都會執行。
  • 若交易失敗,所有操作都會回復(Rollback),不留下任何痕跡。

例子:

  • 若扣除 A 的 200 元成功,但新增 B 的 200 元失敗,則交易將完全回復,A 的餘額也會回復到初始狀態。

2. Consistency(一致性)

定義:

交易開始前和結束後,資料必須保持一致。換句話說,交易完成後,資料庫的狀態必須符合業務規則和約束條件。

例子:

  • A 和 B 的總金額在交易前後不能為負。例如:
    • 交易前:A = 100 元,B = 100 元。
    • 交易後:A = -100 元,B = 200 元。 這個狀況就不能成立。

3. Isolation(隔離性)

定義:

多個交易同時進行時,彼此之間的操作不應互相影響。交易在提交前,它的中間狀態對其他交易是不可見的。這會衍伸出

例子:

  • A 正在轉帳 200 元給 B,這筆交易尚未提交時:
    • 其他交易無法看到 A 和 B 的餘額已經改變。
    • 只有當這筆交易成功提交後,其他交易才能看到更新後的結果。
  • Dirty read, non-repeatable read, phantom read 的討論。

假設現在有兩個交易正在進行,如果沒有設計好關聯式資料庫的隔離性就會出現以下問題:

Dirty read:其中一個 Transcation 沒有 commit (完成) 另外一個 Transcation 就讀到了。

raw-image

Non-repeatable read : 

在同一個 transaction 裡面連續使用相同的 Query 讀取了多次資料,但是相同的 Query 卻回傳了不同的結果,這就是 Non-repeatable reads。Dirty read 也是 non-repeatable read 的一種。

raw-image

Phantom read:

連續搜尋兩次範圍內的筆數,結果不一樣。如 SELECT ... WHERE時,因為其他交易插入或刪除了符合範圍條件的數據,導致相同範圍查詢在同一交易中執行兩次時,結果不同。

  • 交易 A:正在查詢一個條件範圍內的數據,例如:
    SELECT * FROM orders WHERE amount > 100;
    查詢結果返回 5 筆資料。
  • 交易 B:在此期間插入了一筆新的資料,其 amount > 100,例如:
    INSERT INTO orders (id, amount) VALUES (6, 150);
  • 交易 A:再次執行相同的查詢:
    SELECT * FROM orders WHERE amount > 100;
    此時查詢結果返回 6 筆資料,比第一次多出了一筆。

小結:

  • Dirty Read: 一個交易讀取到其他交易未提交的數據,可能會讀到錯誤或不穩定的數據。
  • Non-Repeatable Read: 在同一交易中,兩次讀取相同條件的資料時,結果不同(通常因其他交易更新或刪除現有數據導致)。
  • Phantom Read: 兩次範圍查詢時,結果不同(因其他交易新增或刪除符合條件的數據)。




4. Durability(持久性)

定義:

交易提交後,其結果必須永久保存在資料庫中,即使系統發生故障(如斷電、崩潰),提交的數據也不會不見。

例子:

  • A 成功轉帳 200 元給 B,交易提交後,即使伺服器突然重啟,資料庫中 A 和 B 的餘額仍然正確反映交易結果。

交易的操作指令

在 SQL 中,交易可以使用以下指令進行控制:

  • BEGINSTART TRANSACTION:開始交易。
  • COMMIT:提交交易,將變更永久保存。
  • ROLLBACK:回復交易,取消所有操作。
  • SAVEPOINT:設定保存點,允許回復到特定階段。

為了避免關聯式資料庫出現資料不對稱等問題,在資料庫設計結構時出現「正規化」的要求,拆分資料、消除冗餘、避免異常(例如插入、刪除、更新異常),來確保數據的一致性和完整性。

正規化過程遵循一系列規則(1NF、2NF、3NF 等),每個階段都對表結構有不同的要求。

正規化 Normalization & 反正規化 Denormalization

正規化是分階段進行的,必須先滿足前一階段的要求才能進入下一階段。以下介紹最常用的 1NF2NF3NF

1NF

目標:確保「每個欄位都只能存放一個值」,即消除「重複組」或「多值欄位」。

要求:

  1. 表格中的數據是原子性的,每個欄位值不能再進一步分割。
  2. 沒有重複的欄位組(row, tuples)。

我們先來看以下的舉例,這份表格哪裡不符合第一正規化(1NF)

圖片來源:影片 1st, 2nd and 3rd Normal Form (Database Normalisation)

圖片來源:影片 1st, 2nd and 3rd Normal Form (Database Normalisation)

  1. 重複的值,解決方式是加上唯一值的 ID 當主鍵。
  2. Order 裡面有多個值,解決方是另外建一個表再連結
raw-image

2NF

目標:消除「部分依賴」,即所有 key 要完全依賴整個 Primary Key。

要求:

  1. 必須先符合 1NF。
  2. 所有非Primary Key 欄位必須依賴於「整個 Primary Key」,而不是只有一部份的 Primary Key

下圖是違反 2NF 的案例Student ID 跟 Course ID 是複合鍵,兩個一組是 Primary Key。但學費(Course Fee)跟 Student ID 沒有關係,所以只有依賴 Course ID。

raw-image

解決方是一樣是分成兩個表格:

raw-image

3NF

目標:消除「Transitvie Dependency」,即非主鍵欄位不應依賴於其他非主鍵欄位,每個欄位都要跟主鍵有「直接」關係。

要求:

  1. 必須先符合 2NF。
  2. 非主鍵欄位只依賴於主鍵,而不能通過其他非主鍵欄位間接依賴。

下圖中,班級名稱和學生ID完全沒有關係,班級名稱是依賴在班級ID上,這就出現Transitvie Dependency 傳遞依賴,我的理解是「間接相關」。 ​

raw-image

解法:

raw-image

正規化的壞處是找資料需要連結多個表格,查找效率低弱。於是誕生

反正規化 (Denormalization)

例如:訂單表和商品價格表以正規化分開如下

此表由 ChatGPT 生成

此表由 ChatGPT 生成

如果我們需要查詢訂單的總金額(數量 × 商品價格)需要用JOIN 把兩個表合起來,如果是上千萬筆的電商資料可能就會使查詢效率變慢。

SELECT 
o.訂單ID,
o.客戶ID,
o.購買數量 * p.商品價格 AS 總金額
FROM
Orders o
JOIN
Products p
ON
o.商品ID = p.商品ID;

所以這時候使用反正規化的作法,可以將程式碼節省成

SELECT 訂單ID, 客戶ID, 總金額 FROM Orders WHERE 訂單日期 = '2024-11-25';

小結

正規化的優點:

  • 數據容易維護。
  • 更新只需要更新一個表。

反正規化適用於:

  • 查詢頻繁且要求回復速度的系統。
  • 需要頻繁計算的數據(如總金額、總銷量),而數據更新相對較少的情況。



留言0
查看全部
avatar-img
發表第一個留言支持創作者!
本文將逐步拆解如何將 ER 圖轉換為 Schema,深入瞭解 ER 圖的意義以及其對於資料庫設計的重要性。透過影片內容,我們可以學習如何清晰地描述實體關係,並將複雜的資料結構轉化為易於管理的 Schema 形式。無論是初學者或有經驗的資料庫管理者,都能從中獲得實用的技巧和知識。
本文探討資料庫設計的基本概念,區別了 Flat-file 和 Database,並詳細介紹了資料庫設計的流程,包括需求分析、ER 圖概念設計、邏輯資料模型和物理模型的轉換。還介紹了關聯式資料庫的基本組成、五大鍵以及各種限制,希望對自學者理解資料庫設計有所幫助。
前一篇提到B樹和B+樹,這篇介紹AVL 樹和經典的紅黑樹。 在開始之前,可以看個輕鬆的影片,對於紅黑樹在真實商業案例的應用更有印象 學習資料結構、演算法在工作上真的有用嗎? 實際工作經歷不藏私! | 二元樹 | 雜湊 | 計算機概論 | 工程師 Nic
本文詳細介紹了雜湊表(Hash Table)及雜湊函數(Hash Function)的運作原理與應用,如何解決衝突(Collision)問題,並引入字典樹(Trie)作為另一種資料搜尋結構。透過簡單易懂的比喻和實例,幫助讀者理解這些資料結構的效能和實際用途。
樹是資料結構中的核心概念,尤其是當數據量龐大時,選擇適當的樹結構能顯著提升查找和管理效率。本文深入探討了B樹、B+樹、AVL樹及紅黑樹的特性、操作方法及其廣泛應用,並強調選擇自平衡樹的必要性,以確保資料讀取的快速與精確。本文也鼓勵讀者通過動畫學習以便更好地理解這些複雜的樹結構。
在 C 語言中,陣列的大小固定且使用連續記憶體空間,插入新元素可能不便。鏈結串列則提供了靈活性,可以在不需要連續記憶體的情況下,輕鬆插入新節點。本文將探討陣列與鏈結串列各自的特點,並對比它們在插入與查找操作上的 Big O 複雜度,讓讀者瞭解在不同情境下使用的最佳資料結構選擇。
本文將逐步拆解如何將 ER 圖轉換為 Schema,深入瞭解 ER 圖的意義以及其對於資料庫設計的重要性。透過影片內容,我們可以學習如何清晰地描述實體關係,並將複雜的資料結構轉化為易於管理的 Schema 形式。無論是初學者或有經驗的資料庫管理者,都能從中獲得實用的技巧和知識。
本文探討資料庫設計的基本概念,區別了 Flat-file 和 Database,並詳細介紹了資料庫設計的流程,包括需求分析、ER 圖概念設計、邏輯資料模型和物理模型的轉換。還介紹了關聯式資料庫的基本組成、五大鍵以及各種限制,希望對自學者理解資料庫設計有所幫助。
前一篇提到B樹和B+樹,這篇介紹AVL 樹和經典的紅黑樹。 在開始之前,可以看個輕鬆的影片,對於紅黑樹在真實商業案例的應用更有印象 學習資料結構、演算法在工作上真的有用嗎? 實際工作經歷不藏私! | 二元樹 | 雜湊 | 計算機概論 | 工程師 Nic
本文詳細介紹了雜湊表(Hash Table)及雜湊函數(Hash Function)的運作原理與應用,如何解決衝突(Collision)問題,並引入字典樹(Trie)作為另一種資料搜尋結構。透過簡單易懂的比喻和實例,幫助讀者理解這些資料結構的效能和實際用途。
樹是資料結構中的核心概念,尤其是當數據量龐大時,選擇適當的樹結構能顯著提升查找和管理效率。本文深入探討了B樹、B+樹、AVL樹及紅黑樹的特性、操作方法及其廣泛應用,並強調選擇自平衡樹的必要性,以確保資料讀取的快速與精確。本文也鼓勵讀者通過動畫學習以便更好地理解這些複雜的樹結構。
在 C 語言中,陣列的大小固定且使用連續記憶體空間,插入新元素可能不便。鏈結串列則提供了靈活性,可以在不需要連續記憶體的情況下,輕鬆插入新節點。本文將探討陣列與鏈結串列各自的特點,並對比它們在插入與查找操作上的 Big O 複雜度,讓讀者瞭解在不同情境下使用的最佳資料結構選擇。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
已經存在在table裡面的那些record做更新。 ※ 語法 UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name1 = expr1, column_name2 = expr2, … [WHERE
Thumbnail
商業簡報不僅僅是呈現數據,更需要深入瞭解數據分析及有效的工具運用。本文探討於Excel中使用不同函數來改善數據處理效率,包括IF、IFS、VLOOKUP、XLOOKUP及INDEX與MATCH的結合,幫助商業人士更好地從數據中提取洞見,助力業務增值,學習優化數據分析過程,讓您的商業簡報更具影響力。
Thumbnail
※ 把record加到table有兩種方式: VALUES • SELECT ※ 語法 INSERT INTO VALUES 語法: Record 代表一組值的集合,每個值對應到表格中的一個欄位(column)。 INSERT INTO 語法用來指定要插入資料的表格。 需要提供一個
Thumbnail
※ 何時該使用 JOIN? JOIN 使用的時機是:當你需要同時查詢一張以上的資料表的時候。 ※ SQL有哪些TABLE JOIN的方式? INNER JOIN LEFT JOIN RIGHT JOIN SELF JOIN ※ 使用 JOIN 的時候,我們需要考慮到: 我要使用哪一種
Thumbnail
※ 別名: 目的在於提高SQL查詢的可讀性和簡潔性。 ※ 別名有兩種: Column Alias(列別名):在查詢結果中的某一列,取一個臨時的新名字。 Table Alias(表別名):給查詢中的表取一個短暫的新名字。 ※ Column Alias ※ 為什麼需要 Column A
Thumbnail
※ GROUP BY 用於將數據表中的數據按照一個或多個列進行分組。例如在處理一個表格的資料時,可以指定欄位,一個或是多個,然後把將其視為ID進行分組處理。 ※ 語法 SELECT column1, column2, ..., aggregate_function(column) FROM
Thumbnail
※ 語法 SELECT select_list FROM table_name​ ※ 解析順序 From:從哪裡拿? SELECT:要 "拿什麼" 資料? ※ 使用場景: Single column(單一欄位): Multiple column(多個欄位): All colu
Thumbnail
※ 關聯式資料庫(RDBMS)是什麼? 關聯式資料庫(RDBMS)是一種傳統的資料庫系統,以結構化查詢語言(SQL)為基礎,將資料儲存於預定義的表格中。這些表格包括行和列,彼此之間存在明確的關聯性。 ※ 關聯式資料庫(RDBMS)有兩個重要元素: 關聯(Relational): 關聯式資料庫
Thumbnail
在進行SQL查詢邏輯更改時,需要適當地使用SubQuery和join來達到新的排序需求。本文將介紹原本的撈取邏輯、需求以及如何使用SubQuery來解決新的排序需求。
Thumbnail
本文將介紹 SQL 中的連接(JOIN),連接(JOIN)是用於結合來自兩個或多個資料表的相關數據,建議讀過我之前發佈的幾篇"SQL學習筆記"之後再來看這篇。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
已經存在在table裡面的那些record做更新。 ※ 語法 UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name1 = expr1, column_name2 = expr2, … [WHERE
Thumbnail
商業簡報不僅僅是呈現數據,更需要深入瞭解數據分析及有效的工具運用。本文探討於Excel中使用不同函數來改善數據處理效率,包括IF、IFS、VLOOKUP、XLOOKUP及INDEX與MATCH的結合,幫助商業人士更好地從數據中提取洞見,助力業務增值,學習優化數據分析過程,讓您的商業簡報更具影響力。
Thumbnail
※ 把record加到table有兩種方式: VALUES • SELECT ※ 語法 INSERT INTO VALUES 語法: Record 代表一組值的集合,每個值對應到表格中的一個欄位(column)。 INSERT INTO 語法用來指定要插入資料的表格。 需要提供一個
Thumbnail
※ 何時該使用 JOIN? JOIN 使用的時機是:當你需要同時查詢一張以上的資料表的時候。 ※ SQL有哪些TABLE JOIN的方式? INNER JOIN LEFT JOIN RIGHT JOIN SELF JOIN ※ 使用 JOIN 的時候,我們需要考慮到: 我要使用哪一種
Thumbnail
※ 別名: 目的在於提高SQL查詢的可讀性和簡潔性。 ※ 別名有兩種: Column Alias(列別名):在查詢結果中的某一列,取一個臨時的新名字。 Table Alias(表別名):給查詢中的表取一個短暫的新名字。 ※ Column Alias ※ 為什麼需要 Column A
Thumbnail
※ GROUP BY 用於將數據表中的數據按照一個或多個列進行分組。例如在處理一個表格的資料時,可以指定欄位,一個或是多個,然後把將其視為ID進行分組處理。 ※ 語法 SELECT column1, column2, ..., aggregate_function(column) FROM
Thumbnail
※ 語法 SELECT select_list FROM table_name​ ※ 解析順序 From:從哪裡拿? SELECT:要 "拿什麼" 資料? ※ 使用場景: Single column(單一欄位): Multiple column(多個欄位): All colu
Thumbnail
※ 關聯式資料庫(RDBMS)是什麼? 關聯式資料庫(RDBMS)是一種傳統的資料庫系統,以結構化查詢語言(SQL)為基礎,將資料儲存於預定義的表格中。這些表格包括行和列,彼此之間存在明確的關聯性。 ※ 關聯式資料庫(RDBMS)有兩個重要元素: 關聯(Relational): 關聯式資料庫
Thumbnail
在進行SQL查詢邏輯更改時,需要適當地使用SubQuery和join來達到新的排序需求。本文將介紹原本的撈取邏輯、需求以及如何使用SubQuery來解決新的排序需求。
Thumbnail
本文將介紹 SQL 中的連接(JOIN),連接(JOIN)是用於結合來自兩個或多個資料表的相關數據,建議讀過我之前發佈的幾篇"SQL學習筆記"之後再來看這篇。