學習要點
表通過
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 時的常見關鍵字,請大家牢記。 ↩︎特定一行數據,也可以說是唯一確定一行數據。 ↩︎