1. 程式人生 > 其它 >SQL 表的建立(CREATE TABLE)

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 建立資料庫 shopCREATE 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

    CHARCHARACTER(字元)的縮寫,是用來指定儲存字串的列的資料型別(字元型)。可以像 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 列中輸入了重複資料,就無法取出唯一的特定資料了(因為無法確定唯一的一行資料)。這樣就可以為某一列設定主鍵約束了。

請參閱

(完)


  1. 這裡我們僅指定了使用該語法所需的最少專案,實際開發資料庫時還需要指定各種其他專案。 ↩︎

  2. 搭建 SQL 的學習環境 中介紹了在 PostgreSQL 中執行 SQL 語句的方法。執行了 搭建 SQL 的學習環境 內容的讀者應該已經建立好了名為 shop 的資料庫。接下來請繼續完成建立表的工作。 ↩︎

  3. 這裡我們僅指定了使用該語法所需的最少專案,實際開發資料庫時還需要指定各種其他專案。 ↩︎

  4. 但是 NOT NULL 約束只能以列為單位進行設定。 ↩︎

  5. 位元組是計算機內部的資料單位。一個字元通常需要 1 到 3 個位元組來表示(根據字元的種類和表現方式有所不同)。 ↩︎

  6. VARCHAR 中的 VARVARING(可變的)的縮寫。 ↩︎

  7. NULL 這個詞是無或空的意思,NULL 是使用 SQL 時的常見關鍵字,請大家牢記。 ↩︎

  8. 特定一行資料,也可以說是唯一確定一行資料。 ↩︎