建庫
CREATE DATABASE TS1
AUTOMATIC STORAGE NO --是否自動存儲
ON 'D:\' --路徑
ALIAS test
USING CODESET GBK --設置編碼
TERRITORY CN COLLATE --設置地域
USING SYSTEM PAGESIZE 4096 --設置數據頁大小(4kb 8kb 16kb 32kb)
WITH 'aa' --注釋
建表-----------------------------------------------------------------------------------
CREATE TABLE AA
(
ID INT GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1), --標示
NAME VARCHAR(50) WITH DEFAULT 'BOB',--默認值
AGE INT NOT NULL CHECK(AGE > 0 AND AGE<200),--check約束
YEARS INT NOT NULL UNIQUE, --唯一
DAYS DECIMAL(8,1) NOT NULL,
BIO CLOB(100K) LOGGED,--計入日志
PIC BLOB(2M) NOT LOGGED COMPACT,--不計入日志
PRIMARY KEY(ID)--主鍵
)
IN USERSPACE1--指定存儲表空間
CREATE TABLE AA
(
ID INT GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1),
NAME VARCHAR(50) WITH DEFAULT 'BOB',
AGE INT NOT NULL CHECK(AGE > 0 AND AGE<200),
YEARS INT NOT NULL UNIQUE,
DAYS DECIMAL(8,1) NOT NULL,
BIO CLOB(100K) LOGGED,
PIC BLOB(2M) NOT LOGGED COMPACT,
PRIMARY KEY(ID)
)
IN USERSPACE1;
常規寫法:
主鍵
alter table AA
add primary key(id);
刪除主鍵
ALTER TABLE AA
DROP PRIMARY KEY
唯一
alter table AA
add CONSTRAINT SS UNIQUE(DAYS);
alter table AA
DROP CONSTRAINT SS;
外鍵:
外鍵約束(foreign key constraint)有時候稱作參照約束。 參照完整性(referential integrity)被定義為“數據庫的所有外鍵值都是有效的狀態”。那外鍵又是什么呢? 外鍵(foreign key)是指表中的一列或一組列,其值必須至少匹配其父表中一行的一個主鍵或惟一鍵值。這真正意味着什么呢?它實際上並非如聽起來那般復雜。簡單來說,它意味着如果表(T2)中的一列(C2)存在值匹配另一個表(T1)中的一列(C1)的值, 並且 C1 是 T1 的主鍵,那么 C2 就是 T2 中的外鍵列。將包含了父鍵(主鍵或惟一鍵)的表稱為 父表(parent table),而將包含了外鍵的表稱為 子表(dependent table)
alter table AA
ADD CONSTRAINT FK_ID FOREIGN KEY(ID)
references BB on delete cascade;
check:
alter table AA
add constraint name_length check (length(rtrim(name)) = 4)
使用 SET INTEGRITY/CONSTRAINTS 語句可以打開或者關閉表檢查約束。
SET CONSTRAINTS FOR EMP OFF
ALTER TABLE EMP ADD CONSTRAINT COMP CHECK (SALARY + COMM > 15000)
SET CONSTRAINTS FOR EMP IMMEDIATE CHECKED
ALTER TABLE stuMarks
CONSTRAINT FK_stuNo
FOREIGN KEY(stuNo) REFERENCES stuInfo(stuNo)
--添加外鍵約束(主表stuInfo和從表stuMarks建立關系,關聯字段為stuNo)
alter table AA
add sid int;
向AA表中添加一列
二進制大對象--BLOB,
字符大對象--CLOB,
雙字節字符大對象--DBCLOB。
系統目錄表-----------------------------------------------------------------------------------
SYSCAT.TABLES --所有表
SYSCAT.INDEXES --索引
SYSCAT.FUNCTIONS --函數
SYSCAT.PROCEDURES --存儲過程
SYSCAT.BUFFERPOOLS --緩沖池
序列-----------------------------------------------------------------------------------
序列對象產生整個數據庫的一個唯一值。跟標識列不一樣的是,序列獨立於數據表。
prevva提供序列的一個當前值,而nextval提供下一個值。
CREATE TABLE t1 (salary int)
CREATE SEQUENCE myseq
START WITH 10
INCREMENT BY 1
NO CYCLE
INSERT INTO t1 VALUES (nextval for myseq)
自定義數據類型-----------------------------------------------------------------------------------
create distinct type 自定義類型名
as 類型名
with comparisons --為自定義類型名創建一個轉換函數
Ex:create distinct type myint as integer with comparisons
建臨時表-----------------------------------------------------------------------------------
declare global temporary table 表名(模式名.表名)
like 模版表 --定義表的列和模版表的列一樣
on commit preserne rows --在處理COMMIT時,臨時表的行會被保留下來
not logged --不計入日志
in 臨時表空間
Ex:
declare global temporary table xabc."Man"
like staff
on commit preserne rows
not logged
in TEMPSPACE1;
插入-----------------------------------------------------------------------------------
insert into 表名(列名) values(值);
Ex:
insert into staff
(id,name,dept,job,years,salary,comm)
values(11,'dddddd',22,'aaa',1,200,300),
(11,'dddddd',22,'aaa',1,200,300);
刪除-----------------------------------------------------------------------------------
delete from staff where id in(1,3);
更新-----------------------------------------------------------------------------------
update staff set (dept,job)=(10,'aa');
查詢-----------------------------------------------------------------------------------
select * from staff
數值類型之間可以進行運算
Ex:select salary + comm as aa from staff;
as 用來指定列名
模糊查詢:
select name from staff where name like 'a%';
子查詢:
select * from staff where id in(select aid from AA);
fetch first子句用來限制結果集中的行數
Ex:select * from staff fetch first 10 rows only;
distinct 用來排除結果集中重復的行
Ex:select distinct name, job from staff;
連接查詢-----------------------------------------------------------------------------------
集合運算符-----------------------------------------------------------------------------------
把兩個或兩個以上的結果集合並成一個結果集,並去除重復結果。
UNION運算符:會把兩個或兩個以上的結果集合並成一個結果集
select * from staff where id > 200
union
select * from AA where id <100
后面跟上ALL,不去除重復結果
排序-----------------------------------------------------------------------------------
select * from staff where salary > 100 order by salary
默認升序,降序為DESC
視圖-----------------------------------------------------------------------------------
create view view_AA
as select s.id,a.name
from AA a,staff s
where a.id=s.id
with check option
通過 with check option可以將約束作用在視圖的列上,可以拒絕不合法的更新或插入
存儲過程-----------------------------------------------------------------------------------
CREATE PROCEDURE 存儲過程名稱 [( {可選變量} )]
[可選存儲過程屬性] <語句>
屬性:
language --指定存數過程所使用的語言。LANGUAGE SQL 是其默認值
result sets N --指定存儲過程將返回幾個結果集
specific name --指定存儲過程的唯一名稱
存儲過程可以被重載,也就是說許多個不同的存儲過程可以使用同一個名字,但這些存儲過程所包含的參數數量不同。
用 drop specific procedure name 來刪除重載過的過程
參數:
in 輸入
out 輸出
inout 輸入輸出
用call來調用過程 ?代表輸出參數
Ex: call(1,?);
當BEGIN 關鍵字后緊隨ATOMIC 關鍵字時,其封裝的復合語句就被當作一個處理單元,也就是說,復合語句中的所有程序指令和語句都必須成功運行,以保證整個復合語句的成功運行。如果其中的一個語句發生錯誤,那么這整個存儲過程所執行的結果都將回滾。
聲明變量:
declare 變量名 數據類型 default 值
Ex:declare name varchar(20) default 'bob';
賦值:
SET name = 'ss';
上面的語句等同於下面的:
VALUES('ss') into name;
除此之外,所有的變量都可以賦NULL 值:
SET name = NULL;
選擇表中的數據給變量賦值時,可能會將一個多行的集合賦予變量,如果只想取選擇結果的第一行數據時,可以使用
SET name = (select sum(c1) from T1)+"";
游標---------------------------------------------------------------------------------------
游標是保持SELECT 語句執行結果的集合
DECLARE <游標名稱> CURSOR [WITH RETURN <返回目標>]
<SELECT 語句>;
OPEN <游標名稱>;
FETCH <游標名稱> INTO <變量>;
CLOSE <游標名稱>;
CREATE PROCEDURE set()
DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN
DECLARE cur CURSOR WITH RETURN TO CLIENT
FOR SELECT name, dept, job
FROM staff
WHERE salary > 20000;
OPEN cur;
END
Ex:
CREATE PROCEDURE MEDIAN_RESULT_SET (OUT medianSalary DOUBLE)
RESULT SETS 1
LANGUAGE SQL
BEGIN
DECLARE v_numRecords INT DEFAULT 1;
DECLARE v_counter INT DEFAULT 0;
DECLARE c1 CURSOR FOR
SELECT CAST(salary AS DOUBLE)
FROM staff
ORDER BY salary;
DECLARE c2 CURSOR WITH RETURN FOR
SELECT name, job, CAST(salary AS INTEGER)
FROM staff
WHERE salary > medianSalary
ORDER BY salary;
DECLARE EXIT HANDLER FOR NOT FOUND
SET medianSalary = 6666;
SET medianSalary = 0;
SELECT COUNT(*) INTO v_numRecords
FROM STAFF;
OPEN c1;
WHILE v_counter < (v_numRecords / 2 + 1)
DO
FETCH c1 INTO medianSalary;
SET v_counter = v_counter + 1;
END WHILE;
CLOSE c1;
OPEN c2;
END
索引-----------------------------------------------------------------------------------
索引是有序鍵值的集合,每一個鍵值指向表的一行。索引的值可以唯一,它改善了數據庫的性
能。在索引上可以定義如下的一些特性:
索引順序可以遞增也可以遞減速
索引鍵可以是獨值的也可以不是獨值
一些列可以一起用作索引 (這被稱作混合索引)
如果索引和物理數據串在聚集在一個相似的索引序列中,它們就成為簇索引。
CREATE UNIQUE INDEX artno_ix ON artists (artno)
刪除對象-----------------------------------------------------------------------------------
drop 對象類型 對象名
導出DB2 DDL-----------------------------------------------------------------------------------
db2look -d <dbname> -e -o db2look.ddl
運行PL腳本------------------------------------------------------------------------------------
db2 -td! –vf myScript.txt
備份-----------------------------------------------------------------------------------------
$ db2 backup db 數據庫名
系統會自動備份生成一個時間戳的數據備份文件,
如:xxxx.0.db2inst1.NODE0000.CATN0000.20070814031212.001
恢復數據庫
$ db2 restore db 數據庫名 taken at 20070814031212(直接取數據備份生成的時間戳即可)
CONNECT TO SAMPLE
CREATE TABLE AA
(
ID INT GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1),
NAME VARCHAR(50) WITH DEFAULT 'BOB',
AGE INT NOT NULL CHECK(AGE > 0 AND AGE<200),
YEARS INT NOT NULL UNIQUE,
DAYS DECIMAL(8,1) NOT NULL,
BIO CLOB(100K) LOGGED,
PIC BLOB(2M) NOT LOGGED COMPACT,
PRIMARY KEY(ID)
)
IN USERSPACE1;
CREATE TABLE BB
(
ID INT GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1),
NAME VARCHAR(50) WITH DEFAULT 'BOB',
AGE INT NOT NULL CHECK(AGE > 0 AND AGE<200),
PRIMARY KEY(ID)
)
IN USERSPACE1;
ALTER TABLE AA
DROP PRIMARY KEY;
alter table BB
add primary key(id);
SELECT * FROM AA;
alter table AA
add UNIQUE(DAYS);
alter table AA
DROP CONSTRAINT SS;
alter table BB
add constraint name_length check (length(rtrim(name)) = 4);
ALTER TABLE BB
ADD BID INT;
alter table AA
ADD CONSTRAINT FK_ID FOREIGN KEY(ID)
references BB on delete cascade;
alter table AA
DROP CONSTRAINT FK_ID ;
INSERT INTO AA (NAME,AGE,YEARS,DAYS) VALUES('DDD',2,11,13);
INSERT INTO BB (NAME,AGE) VALUES('DDDS',2);
CREATE INDEX AA ON BB (BID)
SELECT * FROM SYSCAT.REFERENCES
DROP TABLE AA;