DB2 採用標準 SQL (ANSI/ISO),語法口語化、易學。核心分三大類:DDL (資料定義)、資料型別、DML (資料操作)。
CREATE TABLE table_name(
column1 DATATYPE [NOT NULL] [PRIMARY KEY],
column2 DATATYPE [NOT NULL],
...
);
NOT NULL:禁止空值PRIMARY KEY:主鍵約束 (單欄或多欄)-- 新增欄位
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,需重建表或使用遷移工具。
CREATE INDEX index_name ON table_name (column_name);
提升查詢速度,維護成本隨寫入量增加。
DROP TABLE table_name;
DROP INDEX index_name;
| 型別 | 說明 | 範圍/限制 |
|---|---|---|
| SMALLINT | 16 位元整數 | -32,768 ~ 32,767 |
| INTEGER | 32 位元整數 | -2,147,483,648 ~ 2,147,483,647 |
| DECIMAL(p,s) | 定點數 | p 精度 (總位數),s 小數位;預設 p=5, s=0 |
| FLOAT | 單精度浮點數 | 32 位元 |
| DOUBLE | 雙精度浮點數 | 64 位元 |
| CHAR(n) | 固定長度字串 | n ≤ 254 |
| VARCHAR(n) | 可變長度字串 | n ≤ 4000 |
| GRAPHIC(n) | 固定長度雙位元組字串 | n ≤ 127 (支援中日韓文字) |
| VARGRAPHIC(n) | 可變長度雙位元組字串 | n ≤ 2000 |
| DATE | 日期 (年月日) | |
| TIME | 時間 (時分秒) | |
| TIMESTAMP | 時間戳記 (年月日時分秒毫秒) |
-- 明確欄位
INSERT INTO table_name (col1, col2) VALUES (val1, val2);
-- 子查詢新增
INSERT INTO table_name (col1, col2)
SELECT colx, coly FROM another_table WHERE ...;
-- 基本查詢
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 t1, t2 WHERE t1.col1 = t2.col1;
-- 聚合查詢
SELECT COUNT(*) FROM table_name WHERE col = 'xxx';
SELECT SUM(col1) FROM table_name;
SELECT AVG(col2), MAX(col3), MIN(col4) FROM table_name GROUP BY col1 HAVING AVG(col2) > 50;
-- 子查詢 / EXISTS / IN
SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t1.id = t2.id);
SELECT * FROM t1 WHERE col1 IN (SELECT col1 FROM t2 WHERE ...);
-- 模糊 / 範圍 / 集合
SELECT * FROM t WHERE col LIKE 'prefix%';
SELECT * FROM t WHERE col IN ('a','b','c');
SELECT * FROM t WHERE col BETWEEN 10 AND 20;
UPDATE table_name SET col1 = 'new_val' WHERE condition;
-- 無 WHERE 將更新全表,謹慎使用
DELETE FROM table_name WHERE condition;
| 資料庫 | 日期字面值語法 | 範例 |
|---|---|---|
| Access | #YYYY-MM-DD# | WHERE mydate > #2000-01-01# |
| Oracle | DATE 'YYYY-MM-DD' 或 TO_DATE | WHERE mydate > DATE '2000-01-01'WHERE mydate > TO_DATE('2000-01-01','YYYY-MM-DD') |
| SQL Server | 'YYYY-MM-DD' (隱含轉換) | WHERE mydate > '2000-01-01' |
| DB2 | DATE 'YYYY-MM-DD' | WHERE mydate > DATE '2000-01-01' |
| PostgreSQL | DATE 'YYYY-MM-DD' | WHERE mydate > DATE '2000-01-01' |
| MySQL | 'YYYY-MM-DD' | WHERE mydate > '2000-01-01' |
-- Oracle
WHERE mydt > TO_TIMESTAMP('2000-01-01 10:00:01','YYYY-MM-DD HH24:MI:SS')
-- DB2
WHERE mydt > TIMESTAMP('2000-01-01 10:00:01')
-- SQL Server
WHERE mydt > '2000-01-01 10:00:01'
theDate := '2000-01-01';
Query1.SQL.Add('SELECT * FROM abc WHERE mydate > CAST(' + QuotedStr(theDate) + ' AS DATE)');
-- 或 Oracle
Query1.SQL.Add('SELECT * FROM abc WHERE mydate > TO_DATE(' + QuotedStr(theDate) + ', ''YYYY-MM-DD'')');
DB2 SQL 高度符合 ANSI 標準,遷移至 PostgreSQL/Oracle 相對平滑。重點注意:不支援 DROP COLUMN、GRAPHIC/VARGRAPHIC 雙位元組型別、日期字面值標準化為 DATE '...'。建立跨平台 SQL 範本庫,集中管理方言差異,降低遷移風險。