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. 特定一行數據,也可以說是唯一確定一行數據。 ↩︎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM