SQL 表的建立(CREATE TABLE)
學習要點
表通過
CREATE TABLE
語句建立而成。表和列的命名要使用有意義的文字。
指定列的資料型別(整數型、字元型和日期型等)。
可以在表中設定約束(主鍵約束和
NOT NULL
約束等)。
一、表的內容的建立
我們將從下一章開始學習針對表的查詢,以及資料變更等 SQL 語句。本節將會建立學習這些 SQL 語句所需的資料庫和表。
表 2 是 資料庫的結構 舉例時使用的商品表。
表 2 商品表
商品編號 | 商品名稱 | 商品種類 | 銷售單價 | 進貨單價 | 登記日期 |
---|---|---|---|---|---|
0001 | T 恤衫 | 衣服 | 1000 | 500 | 2009-09-20 |
0002 | 打孔器 | 辦公用品 | 500 | 320 | 2009-09-11 |
0003 | 運動 T 恤 | 衣服 | 4000 | 2800 | |
0004 | 菜刀 | 廚房用具 | 3000 | 2800 | 2009-09-20 |
0005 | 高壓鍋 | 廚房用具 | 6800 | 5000 | 2009-01-15 |
0006 | 叉子 | 廚房用具 | 500 | 2009-09-20 | |
0007 | 擦菜板 | 廚房用具 | 880 | 790 | 2008-04-28 |
0008 | 圓珠筆 | 辦公用品 | 100 | 2009-11-11 |
該表是某家小商店銷售商品的一覽表。商品的數量不多,不過我們可以把它想象成大量資料中的一部分(畢竟這只是為了學習 SQL 而建立的表)。像 0003 號商品的登記日期以及 0006 號商品的進貨單價這樣的空白內容,我們可以認為是由於店主疏忽而忘記輸入了。
大家可以看到表 2 由 6 列 8 行所組成。最上面一行是資料的專案名,真正的資料是從第 2 行開始的。
備忘
接下來,我們會逐步學習建立資料庫和表所使用的 SQL 語句的書寫方式。還沒有準備好學習環境(PostgreSQL)的讀者,請按照 搭建 SQL 的學習環境 的內容進行準備。
二、資料庫的建立(CREATE DATABASE
語句)
前面提到,在建立表之前,一定要先建立用來儲存表的資料庫。執行 CREATE DATABASE
語句就可以在 RDBMS 上建立資料庫了。CREATE DATABASE
語句的語法如下所示 [1]。
KEYWORD
CREATE DATABASE
語句
語法 1 建立資料庫的 CREATE DATABASE
語句
CREATE DATABASE <資料庫名稱>;
這裡我們將資料庫命名為 shop
,然後執行程式碼清單 1 中的 SQL 語句 [2]。
程式碼清單 1 建立資料庫 shop
的 CREATE DATABASE
語句
CREATE DATABASE shop;
此外,資料庫名稱、表名以及列名都要使用半形字元(英文字母、數字、符號),具體內容隨後會進行介紹。
三、表的建立(CREATE TABLE
語句)
建立好資料庫之後,接下來我們使用 CREATE TABLE
語句在其中建立表。CREATE TABLE
語句的語法如下所示 [3]。
KEYWORD
CREATE TABLE
語句
語法 2 建立表的 CREATE TABLE
語句
CREATE TABLE <表名>
(<列名1> <資料型別> <該列所需約束>,
<列名2> <資料型別> <該列所需約束>,
<列名3> <資料型別> <該列所需約束>,
<列名4> <資料型別> <該列所需約束>,
.
.
.
<該表的約束1>, <該表的約束2>,……);
該語法清楚地描述了我們要建立一個包含 <列名 1>、<列名 2>、……的名稱為 <表名> 的表,非常容易理解。每一列的資料型別(後述)是必須要指定的,還要為需要的列設定約束(後述)。約束可以在定義列的時候進行設定,也可以在語句的末尾進行設定 [4]。
在資料庫中建立表 2 中的商品表(Product
表)的 CREATE TABLE
語句,如程式碼清單 2 所示。
程式碼清單 2 建立 Product
表的 CREATE TABLE
語句
CREATE TABLE Product
(product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER ,
purchase_price INTEGER ,
regist_date DATE ,
PRIMARY KEY (product_id));
備忘
本教程將陸續創建出
Product
表等學習中用到的一些示例表。建立這些表的 SQL 語句儲存在示例\CreateTable\<rdbms 名="">
資料夾下的CreateTable<表名>.sql
檔案中。例如在 >PostgreSQL 中建立Product
表所使用的 SQL 語句,就儲存在示例程式碼\CreateTable\PostgreSQL
資料夾下的CreateTableProduct.sql
檔案中。
CreateTableProduct.sql
檔案包含了建立Product
表時用到的 SQL 語句(程式碼清單 2),以及向Product
表中插入資料的 SQL 語句(程式碼清單 6)。這樣就可以在建立表的同時向表中>預先插入資料了。示例程式碼請從這裡下載。
四、命名規則
我們只能使用半形英文字母、數字、下劃線(_)作為資料庫、表和列的名稱。例如,不能將 product_id
寫成 product-id
,因為標準 SQL 並不允許使用連字元作為列名等名稱。$
、#
、?
這樣的符號同樣不能作為名稱使用。
儘管有些 RDBMS 允許使用上述符號作為列的名稱,但這也僅限於在該 RDBMS 中使用,並不能保證在其他 RDBMS 中也能使用。雖然大家可能會覺得限制有點太多了,但還是請遵守規則使用半形英文字母、數字和下劃線(_)吧。
法則 9
資料庫名稱、表名和列名等可以使用以下三種字元。
半形英文字母
半形數字
下劃線(_)
此外,名稱必須以半形英文字母開頭。以符號開頭的名稱並不多見,但有時會碰到類似 1product
或者 2009_sales
這樣以數字開頭的名稱。雖然可以理解,但這在標準 SQL 中是被禁止的。請大家使用 product1
或者 sales_2009
這樣符合規則的名稱。
法則 10
名稱必須以半形英文字母作為開頭。
最後還有一點,在同一個資料庫中不能建立兩個相同名稱的表,在同一個表中也不能建立兩個名稱相同的列。如果出現這樣的情況,RDBMS 會返回錯誤資訊。
法則 11
名稱不能重複。
接下來我們根據上述規則,使用程式碼清單 2 中的 CREATE TABLE
語句來建立表 2 中的商品表。表名為 Product
,表中的列名如表 3 所示。
表 3 商品表和 Product
表列名的對應關係
商品表中的列名 | Product 表定義的列名 |
---|---|
商品編號 | product_id |
商品名稱 | product_name |
商品種類 | product_type |
銷售單價 | sale_price |
進貨單價 | purchase_price |
登記日期 | regist_date |
五、資料型別的指定
Product
表所包含的列,定義在 CREATE TABLE Product( )
的括號中。列名右邊的 INTEGER
或者 CHAR
等關鍵字,是用來宣告該列的資料型別的,所有的列都必須指定資料型別。
資料型別表示資料的種類,包括數字型、字元型和日期型等。每一列都不能儲存與該列資料型別不符的資料。宣告為整數型的列中不能儲存 'abc'
這樣的字串,宣告為字元型的列中也不能儲存 1234
這樣的數字。
KEYWORD
資料型別
數字型
字元型
日期型
資料型別的種類很多,各個 RDBMS 之間也存在很大差異。根據業務需要實際建立資料庫時,一定要根據不同的 RDBMS 選用最恰當的資料型別。在學習 SQL 的時候,使用最基本的資料型別就足夠了。下面我們就來介紹四種基本的資料型別。
-
INTEGER
型用來指定儲存整數的列的資料型別(數字型),不能儲存小數。
KEYWORD
INTEGER
型
-
CHAR
型CHAR
是CHARACTER
(字元)的縮寫,是用來指定儲存字串的列的資料型別(字元型)。可以像CHAR(10)
或者CHAR(200)
這樣,在括號中指定該列可以儲存的字串的長度(最大長度)。字串超出最大長度的部分是無法輸入到該列中的。RDBMS 不同,長度單位也不一樣,既存在使用字元個數的情況,也存在使用位元組長度 [5] 的情況。KEYWORD
CHAR
型
字串以定長字串的形式儲存在被指定為
CHAR
型的列中。所謂定長字串,就是當列中儲存的字串長度達不到最大長度的時候,使用半形空格進行補足。例如,我們向CHAR(8)
型別的列中輸入'abc'
的時候,會以'abc '
(abc 後面有 5 個半形空格)的形式儲存起來。KEYWORD
- 定長字串
另外,雖然之前我們說過 SQL 不區分英文字母的大小寫,但是表中儲存的字串卻是區分大小寫的。也就是說,
'ABC'
和'abc'
代表了兩個不同意義的字串。 -
VARCHAR
型同
CHAR
型別一樣,VARCHAR
型也是用來指定儲存字串的列的資料型別(字串型別),也可以通過括號內的數字來指定字串的長度(最大長度)。但該型別的列是以可變長字串的形式來儲存字串的 [6]。定長字串在字元數未達到最大長度時會用半形空格補足,但可變長字串不同,即使字元數未達到最大長度,也不會用半形空格補足。例如,我們向VARCHAR(8)
型別的列中輸入字串'abc'
的時候,儲存的就是字串'abc'
。KEYWORD
-
VARCHAR 型
-
可變長字串
該型別的列中儲存的字串也和
CHAR
型別一樣,是區分大小寫的。特定的 SQL
Oracle 中使用
VARCHAR2
型(Oracle 中也有 VARCHAR 這種資料型別,但並不推薦使用)。KEYWORD
VARCHAR2
型
-
-
DATE
型
用來指定儲存日期(年月日)的列的資料型別(日期型)。
KEYWORD
DATE
型
特定的 SQL
除了年月日之外,Oracle 中使用的
DATE
型還包含時分秒,但在本教程中我們只學習日期部分。
六、約束的設定
約束是除了資料型別之外,對列中儲存的資料進行限制或者追加條件的功能。Product
表中設定了兩種約束。
KEYWORD
- 約束
Product
表的 product_id
列、product_name
列和 product_type
列的定義如下所示。
product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
資料型別的右側設定了 NOT NULL
約束。NULL
是代表空白(無記錄)的關鍵字 [7]。在 NULL
之前加上了表示否定的 NOT
,就是給該列設定了不能輸入空白,也就是必須輸入資料的約束(如果什麼都不輸入就會出錯)。
KEYWORD
NOT NULL
約束
NULL
這樣一來,Product
表的 product_id
(商品編號)列、product_name
(商品名稱)列和 product_type
(商品種類)列就都成了必須輸入的專案。
另外,在建立 Product
表的 CREATE TABLE
語句的後面,還有下面這樣的記述。
PRIMARY KEY (product_id)
這是用來給 product_id
列設定主鍵約束的。所謂鍵,就是在指定特定資料時使用的列的組合。鍵種類多樣,主鍵(primary key)就是可以特定一行資料的列 [8]。也就是說,如果把 product_id
列指定為主鍵,就可以通過該列取出特定的商品資料了。
KEYWORD
主鍵約束
鍵
主鍵
反之,如果向 product_id
列中輸入了重複資料,就無法取出唯一的特定資料了(因為無法確定唯一的一行資料)。這樣就可以為某一列設定主鍵約束了。
請參閱
(完)
這裡我們僅指定了使用該語法所需的最少專案,實際開發資料庫時還需要指定各種其他專案。 ↩︎
搭建 SQL 的學習環境 中介紹了在 PostgreSQL 中執行 SQL 語句的方法。執行了 搭建 SQL 的學習環境 內容的讀者應該已經建立好了名為 shop 的資料庫。接下來請繼續完成建立表的工作。 ↩︎
這裡我們僅指定了使用該語法所需的最少專案,實際開發資料庫時還需要指定各種其他專案。 ↩︎
但是
NOT NULL
約束只能以列為單位進行設定。 ↩︎位元組是計算機內部的資料單位。一個字元通常需要 1 到 3 個位元組來表示(根據字元的種類和表現方式有所不同)。 ↩︎
VARCHAR
中的VAR
是VARING
(可變的)的縮寫。 ↩︎NULL
這個詞是無或空的意思,NULL
是使用 SQL 時的常見關鍵字,請大家牢記。 ↩︎特定一行資料,也可以說是唯一確定一行資料。 ↩︎