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';

小結

正規化的優點:

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

反正規化適用於:

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



留言
avatar-img
留言分享你的想法!
avatar-img
越南放大鏡 X 下班資工系
49會員
95內容數
雙重身份:越南放大鏡 X 下班資工系 政大東南亞語言學系是我接觸越南語的起點,畢業後找越南外派工作的生活跟資訊時,發現幾乎都是清單式的分享,很難身歷其境。所以我希望「越南放大鏡」可以帶讀者看到更多細節和深入的觀察。 - 下班資工系則是自學資工系的課程內容,記錄實際操作的過程,學習理論的過程。希望可以跟讀者一起成長。
2025/04/24
本系列文章將循序漸進地介紹 JavaScript 的核心概念,從基礎語法到進階應用,例如非同步程式設計和 React 基礎。內容淺顯易懂,並使用生活化的比喻幫助讀者理解,搭配程式碼範例,適合 JavaScript 初學者學習。
Thumbnail
2025/04/24
本系列文章將循序漸進地介紹 JavaScript 的核心概念,從基礎語法到進階應用,例如非同步程式設計和 React 基礎。內容淺顯易懂,並使用生活化的比喻幫助讀者理解,搭配程式碼範例,適合 JavaScript 初學者學習。
Thumbnail
2025/04/21
本文介紹行動通訊網路的演進歷史,從1G到5G,並說明ITU與3GPP在制定通訊規格上的重要角色,以及5G的三大關鍵應用場景:URLLC、eMBB和mMTC。
Thumbnail
2025/04/21
本文介紹行動通訊網路的演進歷史,從1G到5G,並說明ITU與3GPP在制定通訊規格上的重要角色,以及5G的三大關鍵應用場景:URLLC、eMBB和mMTC。
Thumbnail
2025/04/11
這篇文章說明網路的七層模型、IP 位址、通訊埠、TCP/UDP 協定、HTTP 協定、HTTP 狀態碼以及 WebSocket,並解釋它們之間的關係與互動方式。文中包含許多圖表和範例,幫助讀者理解這些網路概念。
Thumbnail
2025/04/11
這篇文章說明網路的七層模型、IP 位址、通訊埠、TCP/UDP 協定、HTTP 協定、HTTP 狀態碼以及 WebSocket,並解釋它們之間的關係與互動方式。文中包含許多圖表和範例,幫助讀者理解這些網路概念。
Thumbnail
看更多
你可能也想看
Thumbnail
投資人必看!投資系統化課程(六)之一,價差交易最基礎理論建構。
Thumbnail
投資人必看!投資系統化課程(六)之一,價差交易最基礎理論建構。
Thumbnail
第一種課程:台指選擇權期貨課程大綱 目錄 第一篇  基礎篇 第一章 怎麼挑履約價?做多與做空?(圖例) 第二章  什麼是選擇權的買方與賣方,sell call ,buy call ,sell put, buy put是什麼? 第三章 期貨的世界觀與選擇權的世界觀(二
Thumbnail
第一種課程:台指選擇權期貨課程大綱 目錄 第一篇  基礎篇 第一章 怎麼挑履約價?做多與做空?(圖例) 第二章  什麼是選擇權的買方與賣方,sell call ,buy call ,sell put, buy put是什麼? 第三章 期貨的世界觀與選擇權的世界觀(二
Thumbnail
前言: 投資人在進場任何交易商品之前,建議務必讀過篇,以免落入風險管理不佳的模型而不自知。 對於金融投資理財不知從何開始的人,你需要的都在這裡了!幾乎網羅所有投資書籍的精華! 此為作者經過大量閱讀及實戰操盤23年,整理出市場唯一的投資理財系統化課程。
Thumbnail
前言: 投資人在進場任何交易商品之前,建議務必讀過篇,以免落入風險管理不佳的模型而不自知。 對於金融投資理財不知從何開始的人,你需要的都在這裡了!幾乎網羅所有投資書籍的精華! 此為作者經過大量閱讀及實戰操盤23年,整理出市場唯一的投資理財系統化課程。
Thumbnail
這篇文章深入淺出地解釋了存貨在財務分析中的重要性,涵蓋存貨的定義、成本計算方法(FIFO, LIFO, 加權平均法)、LIFO儲備、存貨周轉率、存貨減記等關鍵概念。 文章並提供實際案例參考,以及其他相關文章連結,有助於讀者更全面地瞭解存貨管理對企業財務健康及投資決策的影響。
Thumbnail
這篇文章深入淺出地解釋了存貨在財務分析中的重要性,涵蓋存貨的定義、成本計算方法(FIFO, LIFO, 加權平均法)、LIFO儲備、存貨周轉率、存貨減記等關鍵概念。 文章並提供實際案例參考,以及其他相關文章連結,有助於讀者更全面地瞭解存貨管理對企業財務健康及投資決策的影響。
Thumbnail
本篇文章是作者自學 SQL 的筆記,詳述資料庫中的四種主要語言類別:DDL、DML、TCL 及 DCL,每類別對應的功能與常見操作一一列舉,並深入探討交易的特性及其 ACID 原則。此外,文章還解釋了資料庫的正規化及反正規化的必要性,對於學習 SQL 的讀者有很大的幫助。
Thumbnail
本篇文章是作者自學 SQL 的筆記,詳述資料庫中的四種主要語言類別:DDL、DML、TCL 及 DCL,每類別對應的功能與常見操作一一列舉,並深入探討交易的特性及其 ACID 原則。此外,文章還解釋了資料庫的正規化及反正規化的必要性,對於學習 SQL 的讀者有很大的幫助。
Thumbnail
※ 為什麼我們需要 Transaction? 當我們談到 Transaction(交易)時,指的是一組不可分割的 SQL 操作。這些操作結果只能成功或失敗,以確保資料庫的一致性和完整性。Transaction 是資料庫操作中的一個「邏輯單位」,包含多個操作步驟。如果其中任何一個步驟失敗,整個 Tr
Thumbnail
※ 為什麼我們需要 Transaction? 當我們談到 Transaction(交易)時,指的是一組不可分割的 SQL 操作。這些操作結果只能成功或失敗,以確保資料庫的一致性和完整性。Transaction 是資料庫操作中的一個「邏輯單位」,包含多個操作步驟。如果其中任何一個步驟失敗,整個 Tr
Thumbnail
【工欲善其事,必先利其器】 在進入交易或交易練習前, 必定要先熟悉操作的工作介面
Thumbnail
【工欲善其事,必先利其器】 在進入交易或交易練習前, 必定要先熟悉操作的工作介面
Thumbnail
#好書分享 樂金文化贈書,於 8/10號上市的《技術交易系統原理》(New Concepts in Technical Trading Systems) 此書自1978年出版至今已長銷45年。本書是也是《亞當理論》作者威爾斯.威爾德Welles J. Wilder所著。先前威利也有分享過《亞當理論》
Thumbnail
#好書分享 樂金文化贈書,於 8/10號上市的《技術交易系統原理》(New Concepts in Technical Trading Systems) 此書自1978年出版至今已長銷45年。本書是也是《亞當理論》作者威爾斯.威爾德Welles J. Wilder所著。先前威利也有分享過《亞當理論》
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News