【MySQL】資料表、資料型態與欄位限制


https://www.flickr.com/photos/8058098@N07/2718571627/

關聯式資料庫不僅是大學資料庫課程的使用對象,也是業界的主流選擇。雖然也有非關聯式的(被稱為 NoSQL,如 MongoDB),然而根據筆者觀察,NoSQL 通常是職缺的加分項目,或者與關聯式的 SQL 同為必備項目。因此基本上還是要會 SQL,求職時才能有更多選擇。

接下來的幾篇文章,是筆者複習 MySQL 資料庫的筆記整理,方便日後查閱。也適合以前有學過 SQL,但太久未使用,現在只記得一點點,仍有些概念的讀者。

此篇內容轉載自本人在 iThome 的文章


主要參考的學習資源為以下影片:


一、環境準備

(一)安裝 MySQL

我們透過 Docker 啟動 MySQL 的服務。

以下指令會下載 MySQL 8.2.0 版的映像檔,並建立名為「TestMySQL」的容器。而 root 使用者的密碼為「123456」。

docker run --name TestMySQL -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.2.0

(二)安裝 GUI 工具

為了方便撰寫與執行 SQL 指令,可安裝 GUI 工具,筆者使用「Workbench」。

在 SQL 指令撰寫視窗上方的按鈕中,閃電符號代表執行全部或是已反白的指令。閃電符號 + 鍵盤游標代表執行游標所在位置的指令。

(三)建立資料庫

透過 Workbench 工具,可預先建立一個資料庫,如下圖。

而以下是相關的指令,假設資料庫名稱為「company」。

建立資料庫:

CREATE DATABASE `company`;

列出現有資料庫:

SHOW DATABASES;

指定使用資料庫,讓之後執行的指令都作用於它:

USE `company`;

二、資料型態

參考影片:
https://www.youtube.com/watch?v=bAwO9fvlEio

(一)數值

型態儲存空間範圍(有符號)範圍(無符號)對應 Java 型態
TINYINT1 byte-128 ~ 1270 ~ 255byte
SMALLINT2 bytes-32768 ~ 327670 ~ 65535short
INT / INTEGER4 bytes約正負 21.4 億0 ~ 約 42.9 億int
BIGINT8 bytes正負 2^630 ~ 2^64 - 1long
DOUBLE8 bytes約正負 1.79E+308約 2.22E-308 ~ 1.79E+308double
DECIMAL----

其中 DECIMAL 比較特別,它具有「精度」(M)與「標度」(D)。宣告方式為 DECIMAL(M, D),M 代表該值有幾個數字,D 代表小數點占幾位。

(二)文字

型態占用空間(英、數、半形符號)占用空間(其他字)是否補空白
CHAR1 byte2 bytes
VARCHAR1 byte2 bytes
NCHAR2 bytes2 bytes
NVARCHAR2 bytes2 bytes

宣告方式為 CHAR(2)NVARCHAR(300) 等,會定義位元數。

這四種型態,差別在於是否有「VAR」與「N」。前者代表變動長度,若無 VAR,則當資料未達該長度,會在後方填補半形空白。後者代表是否使用 Unicode 編碼。

固定長度的效能比變動長度來得好,因此如身分證字號、學生學號等固定長度的資料,可採用 CHAR 型態。而姓名、自我介紹等,可考慮 NVARCHAR 型態。

(三)日期時間

型態範圍
DATE1000-01-01 ~ 9999-12-31
TIME-838:59:59 ~ 838:59:59
YEAR1901 ~ 2155
DATETIME1000-01-01 00:00:00 ~ 9999-12-31 23:59:59

三、資料表的設計

(一)建立與刪除

以下指令建立一個儲存員工資料的表,叫做「employee」。

若數值欄位已知不會出現負數,則可於型態後方加上 UNSIGNED,讓值的範圍往正方向平移,相當於正數範圍擴大一倍。

建立後,可確認資料表目前的設計。

DESC `employee`;

DESC 是描述(describe)的意思,指令亦可直接寫 DESCRIBE

而刪除資料表的指令如下。

DROP `employee`;

(二)欄位限制

建立資料表時,在資料型態後方可加上一些限制,確保不會存入不合理的資料。

以上添加了一些關鍵字。

  • PRIMARY KEY:設定主鍵,可給予一至多個欄位。
  • AUTO_INCREMENT:未來新增資料時,該欄位不必給值,直接讓 MySQL 由 1 開始遞增。
  • NOT NULL:必填欄位。
  • UNIQUE:規定資料表中,該欄位的值不可重複。
  • DEFAULT:設定預設值。亦可搭配函數,如「CURDATE()」(今天日期)。
  • CHECK:規定欄位值需符合某些條件。寫法如同查詢時的「WHERE」條件子句。

四、增刪與修改欄位

假設員工資料表中還要有一個欄位,用來代表部門。現在我們有「branch_id」與「dept_id」這兩個名稱可選擇。

(一)新增

ALTER TABLE `employee` ADD COLUMN `dept_id` TINYINT;

(二)刪除

ALTER TABLE `employee` DROP COLUMN `dept_id`;

(三)改名

以下指令是將叫做「dept_id」的欄位,改名為「branch_id」。

ALTER TABLE `employee` RENAME COLUMN `dept_id` TO `branch_id`;

(四)改型態

以下指令是將叫做「branch_id」的欄位,更改資料型態為「INT」。

ALTER TABLE `employee` MODIFY COLUMN `branch_id` INT;

(五)改名兼改型態

以下指令是將叫做「branch_id」的欄位,改名為「dept_id」,且資料型態改為無號「TINYINT」。

ALTER TABLE `employee` CHANGE COLUMN `branch_id` `dept_id` TINYINT UNSIGNED;

下一篇:【MySQL】資料的增刪改查與條件撰寫

留言