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 型態 |
---|---|---|---|---|
TINYINT | 1 byte | -128 ~ 127 | 0 ~ 255 | byte |
SMALLINT | 2 bytes | -32768 ~ 32767 | 0 ~ 65535 | short |
INT / INTEGER | 4 bytes | 約正負 21.4 億 | 0 ~ 約 42.9 億 | int |
BIGINT | 8 bytes | 正負 2^63 | 0 ~ 2^64 - 1 | long |
DOUBLE | 8 bytes | 約正負 1.79E+308 | 約 2.22E-308 ~ 1.79E+308 | double |
DECIMAL | - | - | - | - |
其中 DECIMAL 比較特別,它具有「精度」(M)與「標度」(D)。宣告方式為 DECIMAL(M, D),M 代表該值有幾個數字,D 代表小數點占幾位。
(二)文字
型態 | 占用空間(英、數、半形符號) | 占用空間(其他字) | 是否補空白 |
---|---|---|---|
CHAR | 1 byte | 2 bytes | 是 |
VARCHAR | 1 byte | 2 bytes | 否 |
NCHAR | 2 bytes | 2 bytes | 是 |
NVARCHAR | 2 bytes | 2 bytes | 否 |
宣告方式為 CHAR(2)、NVARCHAR(300) 等,會定義位元數。
這四種型態,差別在於是否有「VAR」與「N」。前者代表變動長度,若無 VAR,則當資料未達該長度,會在後方填補半形空白。後者代表是否使用 Unicode 編碼。
固定長度的效能比變動長度來得好,因此如身分證字號、學生學號等固定長度的資料,可採用 CHAR 型態。而姓名、自我介紹等,可考慮 NVARCHAR 型態。
(三)日期時間
型態 | 範圍 |
---|---|
DATE | 1000-01-01 ~ 9999-12-31 |
TIME | -838:59:59 ~ 838:59:59 |
YEAR | 1901 ~ 2155 |
DATETIME | 1000-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;
留言
張貼留言