SQL 的資料型別 (Data Types)
SQL 基本上有下列幾種資料型別,我們必需了解儲存各類型資料值要分別採用何種資料型別欄位以便進行資料庫設計。
- 數值資料 (Numeric Types) – 11, 2.5492, -91
- 字串資料 (String Types) – ‘學習 SQL 語言’
- 空值 (NULL) – (欄位為空)
- 布林值 (Boolean) – true / false
數值資料 (Numeric Data)
SQL 的數值型態有 integer, float, money 等,使用數值資料有一個好處就是你能搭配內建的數值函數來做資料處理,例如 SUM() 函數即可直接獲得該數值欄位的總合。
字串(元)資料 (Character & Strings Data)
儲存字元或符號之資料型別。
日期/時間資料 (Date Data)
用來記錄日期/時間的資料型別,有 date, time, timestamp 等。
布林值 (Boolean Data)
true/false, Yes/No, 1/0。
空值 (NULL Data)
空值,沒有資料存在於欄位。通常在建立資料表時,你可以設定欄位是否允許空值。
CREATE TABLE customer (
C_id INT PRIMARY KEY,
Name VARCHAR(10) NOT NULL,
Address VARCHAR(255) NULL,
Phone VARCHAR(10) NULL
);
NULL 值和一個空字串 ” 是有不一樣意涵的。例如,下列 SQL 敘述句:
INSERT INTO customer (phone) VALUES (NULL);
INSERT INTO customer (phone) VALUES ('');
其中第一個敘述句的意味著不知道電話號碼;而第二個則是意味著沒有電話。
在大多的資料庫中,你不能索引允許有 NULL 值的欄位。你必須聲明要索引的欄位為 NOT NULL,此外,你也不能插入 NULL 到具有索引的欄位中。
另外值得注意的是,NULL 這字面常量 (Literal) 在某些特殊情形下使用代表著不同含意:
- 若你將 NULL 插入資料表中的 TIMESTAMP 欄位,則代表目前的日期和時間。
- 若你將 NULL 插入一個 AUTO_INCREMENT 欄位,則代表目前順序中的下一個號碼。
型別轉換 (CAST / CONVERT)
在實務開發中,我們經常需要將一種資料型別轉換為另一種,例如將字串轉為數值、將數值轉為日期等。SQL 提供了 CAST 和 CONVERT 兩個函數來進行型別轉換。
CAST 語法 (CAST Syntax)
CAST 是 SQL 標準語法,適用於大多數資料庫(MySQL、PostgreSQL、SQL Server、Oracle 等)。
CAST(expression AS data_type)
CONVERT 語法 (CONVERT Syntax)
CONVERT 的語法依據資料庫不同而有所差異:
SQL Server 語法:
CONVERT(data_type, expression [, style])
MySQL 語法:
CONVERT(expression, data_type)
-- 或
CONVERT(expression USING charset_name)
型別轉換用法 (Example)
假設我們有一個員工資料表 employees,其中 salary 欄位為 VARCHAR 型別,我們想要對其進行數值運算:
-- 使用 CAST 將字串轉為數值
SELECT Name, CAST(salary AS INT) AS salary_int
FROM employees;
-- 使用 CAST 將數值轉為字串
SELECT CAST(12345 AS VARCHAR(10));
-- 使用 CAST 轉換日期格式
SELECT CAST('2024-01-15' AS DATE);
執行結果:
| Name | salary_int |
|---|---|
| 張一 | 35000 |
| 王二 | 42000 |
| 李三 | 28000 |
在 SQL Server 中,CONVERT 還可以搭配 style 參數來指定日期格式:
-- SQL Server:將日期轉換為不同格式
SELECT CONVERT(VARCHAR, GETDATE(), 111) AS date_format;
-- 結果:2024/01/15
SELECT CONVERT(VARCHAR, GETDATE(), 23) AS date_format;
-- 結果:2024-01-15
CAST 與 CONVERT 的差異
| 比較項目 | CAST | CONVERT |
|---|---|---|
| SQL 標準 | 是(ANSI SQL 標準) | 否(各資料庫自行實作) |
| 跨資料庫相容性 | 高,大多數資料庫皆支援 | 低,語法因資料庫而異 |
| 日期格式化 | 不支援指定格式 | SQL Server 支援 style 參數 |
| 字元集轉換 | 不支援 | MySQL 支援 USING 語法 |
一般建議優先使用 CAST,因為它是 SQL 標準語法,具有較好的跨資料庫相容性。只有在需要特定資料庫的進階功能(如 SQL Server 的日期格式化或 MySQL 的字元集轉換)時,才使用 CONVERT。