結構化查詢語言/建立簡單的表
讓我們從一個簡單的例子開始。假設我們想要收集有關人員的資訊 - 他們的姓名、出生日期、以及一些其他資訊。起初,我們可能考慮在一個簡單的電子表格中收集這些資料。但是,如果我們發展成一家成功的公司,需要處理數百萬條這樣的資料項呢?電子表格能否處理如此龐大的資訊量?多個員工或程式能否同時插入新的資料、刪除或更改資料?當然不行。這就是資料庫管理系統 (DBMS) 相對於電子表格程式的顯著優勢之一:我們可以將表的結構想象成一個簡單的電子表格,但對它的訪問是內部組織的,從而使大量使用者能夠同時訪問海量資料。
總之,可以說,我們可以將表想象成一個針對大量資料和併發訪問而最佳化的電子表格。
為了保持控制並確保良好的效能,表格需要遵守一些嚴格的規則。每個表格列都具有固定的名稱,並且每列的值必須屬於相同的型別。此外,強烈建議(雖然不是強制性的)每行可以透過唯一的值來標識。包含此標識值的列稱為主鍵。在這本華夏公益教科書中,我們始終將其命名為id。但每個人都可以自由選擇其他名稱。此外,我們可以使用多個列的組合作為主鍵。
在開始之前,我們需要確定以下問題
- 我們想要儲存有關人員(在這個第一個示例中)的哪些資料?當然,有關人員的資訊有很多(例如,眼睛顏色、星座等),但每個應用程式只需要其中一部分。我們需要確定哪些資訊在我們特定的場景中感興趣。
- 我們將為所選資料分配哪些名稱?每個識別出的資料都將進入表格的一列,這列需要有一個名稱。
- 資料的型別是什麼?同一列中的所有資料值必須屬於相同的型別。我們不能將任意字串放入資料型別為
DATE的列中。
在我們的示例中,我們決定儲存名字、姓氏、出生日期、出生地點、社會保障號碼以及人員的體重。顯然,出生日期的資料型別為DATE,體重為數字,所有其他資訊都是某種字串。對於字串,我們需要區分具有固定長度的字串和長度通常在行之間差異很大的字串。前者稱為CHAR(<n>),其中<n>是固定長度,後者稱為VARCHAR(<n>),其中<n>是最大長度。
之前做出的決策必須用機器可以理解的語言表達。這種語言是 SQL,它充當終端使用者(或特殊程式)與 DBMS 之間的介面。
-- comment lines start with two consecutive minus signs '--'
CREATE TABLE person (
-- define columns (name / type / default value / nullable)
id DECIMAL NOT NULL,
firstname VARCHAR(50) NOT NULL,
lastname VARCHAR(50) NOT NULL,
date_of_birth DATE,
place_of_birth VARCHAR(50),
ssn CHAR(11),
weight DECIMAL DEFAULT 0 NOT NULL,
-- select one of the defined columns as the Primary Key and
-- guess a meaningful name for the Primary Key constraint: 'person_pk' may be a good choice
CONSTRAINT person_pk PRIMARY KEY (id)
);
我們選擇person作為表的名稱,它包含七列。id列被分配為主鍵角色。我們可以在id和weight列中專門儲存數字,在firstname、lastname和place_of_birth列中儲存最大長度為 50 個字元的字串,在date_of_birth列中儲存日期,在ssn列中儲存長度正好為 11 個字元的字串。短語 NOT NULL 是id、firstname、lastname和weight定義的一部分。這意味著在每行中,這些四列都必須有值。在這些列中儲存任何值都不可能,但允許使用 8 個字元的字串“no value”或數字“0”,因為它們都是值。換句話說,可以省略date_of_birth、place_of_birth和ssn的值。
主鍵的定義被稱為“約束”(稍後我們將瞭解更多型別的約束)。每個約束都應該有一個名稱 - 在此示例中為person_pk。
在執行上述“CREATE TABLE”命令後,DBMS 將建立一個物件,可以將其想象成以下維基表格
id firstname lastname date_of_birth place_of_birth ssn weight
此維基表格顯示了 4 行。第一行代表列的名稱 - 而不是值!接下來的 3 行只是為了演示目的。但在資料庫表中,目前沒有任何行!它是完全空的,沒有任何行,沒有任何值!資料庫中唯一存在的是表的結構。
也許我們有一天想要刪除該表。為此,我們可以使用DROP命令。它會完全刪除該表:所有資料和整個結構都將被丟棄。
DROP TABLE person;
不要將 DROP 命令與 DELETE 命令混淆,我們將在下一頁介紹 DELETE 命令。DELETE 命令僅刪除行 - 可能刪除所有行。但是,包含結構定義的表本身將保留下來。