一、資料定義語言 (DDL)
1. 建立資料表
CREATE TABLE table_name (
column1 datatype [NOT NULL] [PRIMARY KEY],
column2 datatype [NOT NULL],
...
);
datatype:資料型別 (詳見下表)。
NOT NULL:禁止空值。
PRIMARY KEY:定義主鍵。
2. 修改資料表
-- 新增欄位
ALTER TABLE table_name ADD COLUMN column_name datatype;
-- 設定主鍵
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
-- 移除主鍵
ALTER TABLE table_name DROP PRIMARY KEY;
注意:DB2 不支援直接 DROP COLUMN,需重建表或使用遷移工具。
3. 建立索引
CREATE INDEX index_name ON table_name (column_name);
4. 刪除物件
DROP TABLE table_name;
DROP INDEX index_name;
二、DB2 資料型別對照表
| 型別 | 說明 | 範圍/限制 |
| SMALLINT | 16 位元整數 | -32,768 ~ 32,767 |
| INTEGER | 32 位元整數 | -2,147,483,648 ~ 2,147,483,647 |
| DECIMAL(p,s) | 精確十進位 | p=總位數(預設5), s=小數位(預設0) |
| FLOAT / REAL | 32 位元浮點數 | 單精度 |
| DOUBLE | 64 位元浮點數 | 雙精度 |
| CHAR(n) | 固定長度字串 | n ≤ 254 |
| VARCHAR(n) | 變動長度字串 | n ≤ 4,000 |
| GRAPHIC(n) | 固定長度雙位元組字串 | n ≤ 127 (適合中文) |
| VARGRAPHIC(n) | 變動長度雙位元組字串 | n ≤ 2,000 |
| DATE | 年月日 | YYYY-MM-DD |
| TIME | 時分秒 | HH:MM:SS |
| TIMESTAMP | 日期時間+微秒 | YYYY-MM-DD-HH.MM.SS.ffffff |
三、資料操作語言 (DML)
1. 新增資料 (INSERT)
-- 指定欄位
INSERT INTO table_name (col1, col2, ...) VALUES (val1, val2, ...);
-- 從子查詢新增
INSERT INTO table_name (col1, col2, ...)
SELECT colx, coly, ... FROM another_table;
2. 查詢資料 (SELECT)
基本查詢
SELECT col1, col2 FROM table_name;
SELECT * FROM table_name WHERE col1 = 'xxx' AND col2 > 100;
SELECT col1, col2 FROM table_name ORDER BY col2 DESC;
聯結查詢
SELECT * FROM table1, table2 WHERE table1.col1 = table2.col1;
-- 建議使用 ANSI JOIN 語法
SELECT * FROM table1 INNER JOIN table2 ON table1.col1 = table2.col1;
彙總查詢
SELECT COUNT(*) FROM table_name WHERE col = 'xxx';
SELECT SUM(col1), AVG(col2), MAX(col3), MIN(col4) FROM table_name;
SELECT col1, AVG(col2) FROM table_name GROUP BY col1 HAVING AVG(col2) > 50;
子查詢與集合運算
-- EXISTS
SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE condition);
-- IN 子查詢
SELECT * FROM t1 WHERE col1 IN (SELECT col1 FROM t2 WHERE condition);
-- 模糊比對
SELECT * FROM t1 WHERE col1 LIKE 'prefix%';
SELECT * FROM t1 WHERE col1 LIKE '%keyword%';
-- 範圍
SELECT * FROM t1 WHERE col1 BETWEEN 10 AND 20;
SELECT * FROM t1 WHERE col1 IN ('A', 'B', 'C');
3. 更新資料 (UPDATE)
UPDATE table_name SET col1 = 'new_val' WHERE condition;
-- 省略 WHERE 將更新全表,謹慎使用!
4. 刪除資料 (DELETE)
DELETE FROM table_name WHERE condition;
四、日期時間比較的跨資料庫寫法差異
| 資料庫 | 語法範例 |
| Access | WHERE mydate > #2000-01-01# |
| Oracle | WHERE mydate > CAST('2000-01-01' AS DATE) 或 TO_DATE('2000-01-01','YYYY-MM-DD') |
| DB2 | WHERE mydate > '2000-01-01' (支援 ISO 格式字串隱含轉換) |
| 日期時間 | WHERE mydatetime > TIMESTAMP('2000-01-01-10.00.01') |
五、實務建議
- 慣用
VARCHAR 而非 CHAR 節省空間。
- 大量文字建議使用
CLOB / DBCLOB (DB2 專用大物件型別)。
- 主鍵、外鍵、索引設計直接影響查詢效能,務必依存取模式規劃。
- 參數化查詢 (PreparedStatement) 可防 SQL Injection 並重用執行計畫。