SQL - RDBMS 概念

你好,有志於數據庫的愛好者們!我很興奮能夠成為你們在 SQL 和關係數據庫管理系統(RDBMS)精彩旅程中的導遊。作為一個教電腦科學多年的老師(就不說我記得軟盤實際上還是軟的時候了),我會盡力以淺顯易懂的方式解析這些概念,即使你從未寫過一行代碼也沒關係。所以,拿起你喜歡的飲料,放鬆一下,我們來一起深入探究吧!

SQL - RDBMS Concepts

什麼是 RDBMS?

RDBMS 是 Relational Database Management System 的縮寫。我知道這聽起來可能很囉嗦,但把它想成一個數字化的文件櫃,用於存放你的數據。就像你如何組織實體文件一樣,將它們放在文件夹和櫃子中,RDBMS 有助於你以結構化的方式組織和管理大量信息。

"關係"這部分是因為 RDBMS 中的數據是存放在表中,這些表之間可以相互關聯。想像你正在計劃一個大型派對(誰不喜歡一個好的派對呢?)。你可能會有一個賓客表、一個菜單項目表,還有一個座位安排表。這些表都與你的派對相關,而 RDBMS 有助於你高效地管理和連接這些信息。

一些流行的 RDBMS 示例包括:

  • MySQL
  • PostgreSQL
  • Oracle
  • Microsoft SQL Server

這些每個都有其獨特的風味和特性,但它們都遵循我們將討論的同一基本原則。

什麼是表?

在 RDBMS 的世界中,表是發生魔法的地點。它是數據庫的基本構建塊。將表想像成一個電子表格或網格,你可以在其中存儲特定類型的信息。

讓我們為我們假想的派對計劃創建一個簡單的表:

CREATE TABLE Guests (
GuestID INT,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Email VARCHAR(100),
AttendingStatus VARCHAR(20)
);

這段 SQL 代碼創建了一個名為 "Guests" 的表,其中有五個列。現在不必擔心語法;我們稍後會介紹。重要的是要理解這個表將存儲我們派對中每位受邀賓客的信息。

什麼是字段?

字段是表中的一個列,它保存特定 piece 的信息。在我們的 Guests 表中,我們有五個字段:

  1. GuestID
  2. FirstName
  3. LastName
  4. Email
  5. AttendingStatus

每個字段都有名稱和數據類型。數據類型告訴數據庫該字段可以存儲什麼類型的信息。例如,"GuestID" 是 INT(整數),因為我們將使用數字來識別我們的賓客,而 "FirstName" 是 VARCHAR(可變長度字符字符串),因為名字由字母組成。

什麼是記錄或行?

記錄,也稱為行,是表中的一個單一條目。它包含所有字段中一個項目的所有信息。在我們的 Guests 表中,一個單一的記錄可能如下所示:

INSERT INTO Guests (GuestID, FirstName, LastName, Email, AttendingStatus)
VALUES (1, 'John', 'Doe', '[email protected]', 'Confirmed');

這個 SQL 命令將一個新的記錄添加到我們的 Guests 表中。現在,讓我們分解一下:

  • GuestID: 1
  • FirstName: John
  • LastName: Doe
  • Email: [email protected]
  • AttendingStatus: Confirmed

每個記錄代表我們派對計劃數據庫中的一個賓客。

什麼是列?

列是一組垂直的數據值,所有這些值都是同一類型。它基本上是查看字段的另一種方式。當字段定義你的數據結構時,列是特定字段在所有記錄中的實際數據值集。

例如,如果我們的表中有一百位賓客,"FirstName" 列將包含所有一百個名字,每位賓客一個。

什麼是 NULL 值?

啊,NULL - 多少初學者的夢魘!NULL 不是零,不是空字符串,它是... 好吧,它什麼都不是。它表示值的缺失。

讓我們說我們還不知道 John Doe 是否會參加我們的派對。我們可能會這樣更新我們的記錄:

UPDATE Guests
SET AttendingStatus = NULL
WHERE GuestID = 1;

這將 John 的參加狀態設為 NULL,表示我們還沒有這個信息。

SQL 範圍約束

範圍約束就像是數據庫派對的保鏢。它們在表中的數據上實施規則,以保持準確性和可靠性。讓我們看看一些常見的範圍約束:

範圍約束 描述 示例
NOT NULL 確保列不能有 NULL 值 Email VARCHAR(100) NOT NULL
UNIQUE 確保列中的所有值都是不同的 Email VARCHAR(100) UNIQUE
PRIMARY KEY NOT NULL 和 UNIQUE 的組合。唯一識別表中的每條記錄 GuestID INT PRIMARY KEY
FOREIGN KEY 確保兩個表之間的引用完整性 PartyID INT, FOREIGN KEY (PartyID) REFERENCES Parties(PartyID)
CHECK 確保列中的所有值都滿足特定條件 CHECK (AttendingStatus IN ('Confirmed', 'Declined', 'Pending'))

讓我們修改我們的 Guests 表以包括一些這樣的範圍約束:

CREATE TABLE Guests (
GuestID INT PRIMARY KEY,
FirstName VARCHAR(50) NOT NULL,
LastName VARCHAR(50) NOT NULL,
Email VARCHAR(100) UNIQUE NOT NULL,
AttendingStatus VARCHAR(20) CHECK (AttendingStatus IN ('Confirmed', 'Declined', 'Pending'))
);

現在,我們的表更加健壯,更不易受到數據輸入錯誤的影響!

數據完整性

數據完整性是關於在數據的整個生命周期中維護和確保數據的準確性和一致性。這就像在開始烹飪之前,確保你所有的食材都是新鮮的和正確計量的。

數據完整性有四種類型:

  1. 實體完整性:確保表中的每行都是唯一可識別的。這通常通過使用主鍵來實現。
  2. 引用完整性:確保表之間的關係保持一致。這通過外鍵來管理。
  3. 域完整性:確保列中的所有值都在定義的範圍內(可接受的值集)。
  4. 用戶定義完整性:任何其他特定於你的業務或應用的規則或範圍約束。

我們修改後的 Guests 表與範圍約束是一個實現數據完整性的好例子。

數據庫規範化

數據庫規範化就像整理你的房間一樣 - 它是關於有效地組織你的數據並消除冗余。它是一種將關係數據庫結構化為一系列正規形以減少數據冗余和改善數據完整性的技術。

有幾種正規形,最常用的是:

  1. 第一正規形(1NF):每個表單元應包含一個單一值,每個記錄都需要是唯一的。
  2. 第二正規形(2NF):表符合 1NF,並且所有非鍵屬性完全依賴於主鍵。
  3. 第三正規形(3NF):表符合 2NF,並且所有屬性只依賴於主鍵。

例如,我們可以將單一的 "Parties" 表與重複的賓客信息拆分為兩個表: "Parties" 和 "Guests",它們之間存在關係。這樣做可以減少冗余並使我們的數據庫更高效。

至此,各位!我們已經介紹了 SQL 和 RDBMS 的基本概念。記住,學習數據庫是一個旅程,而不是一個目的地。起初它可能會讓人感到不知所措,但只要多加練習和堅持,你很快就會像專家一樣管理數據。

在我們結束之前,我想到計算機科學家格蕾丝·霍珀的一句話:"語言中最危險的短語是,'我們一直都是這樣做的。'" 所以,不要害怕嘗試,犯錯誤,並找到你自己的理解這些概念的方式。快樂編程,願你的查詢總是返回你期望的結果!

Credits: Image by storyset