目录
一,DDL
1,REORG
2,修改字段长度
3,修改主建
4,添加字段
5,添加注释
6,添加/删除非空约束
7,删除字段
8,分区
1)TIMESTAMP 类型按月自增分区
2)(CHARACTER )CHAR 类型按月自增分区
3)查看表分区
4)删除表分区
5)添加表分区
9,导出表DDL = > db2look
二,其他
1,全局变量
2,查看索引
3,查看表信息:字段,结构,注释
4,索引序列
5,rank() over()
6,日期
7,执行脚本
8,导入导出
9,编码问题查看
10,null处理
11,查询表所有COLNAME
12,实现wm_concat ,行转列
1)获取表字段colname
2)先把要转换的字段名变成xml 元素
3)用xmlagg函数把分组后的字段连接
4)替换A标签
5)将表字段clob类型转string类型
13,分页
14,获取前几列
15,索引
一,DDL
1,REORG
改变结构需要REORG
--脚本里
REORG table tableName;
--数据库界面工具
CALL SYSPROC.ADMIN_CMD('REORG table tableName');
2,修改字段长度
alter table tableName alter columnName set data type varchar(256);
3,修改主建
alter table tableName drop primary key;
alter table tableName add constraint PK_tableName
primary key(columnName1,columnName2);
4,添加字段
alter table tableName add column columnName varchar(8);
alter table tableName add column columnName varchar(8) not null;
alter table tableName add column columnName varchar(8) default '1' not null;
5,添加注释
comment on table tableName is '表注释';
comment on cplumn tableName.columnName is '字段注释';
6,添加/删除非空约束
alter table tableName alter columnName set not null;
alter table tableName alter columnName drop not null;
7,删除字段
alter table tableName drop column columnName;
8,分区
1)TIMESTAMP 类型按月自增分区
CREATE TABLE T1(
create_time TIMESTAMP(6)
)
PARTITON BY RANGE(create_time)
INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))
(
PARTITON P1 VALUES LESS THAN(TO_TIMESTAMP('2022-01-01 00:00:00','YYYY-MM-DD hh24:mi:ss'))
);
CREATE TABLE T1(
create_time TIMESTAMP
)
PARTITON BY RANGE(create_time)
(starting minvalue,
starting '1/1/2020' ending '12/31/2050' every 1 months,
ending maxvalue
);
2)(CHARACTER )CHAR 类型按月自增分区
CHARACTER ,CHAR是一样
CREATE TABLE T1(
create_time CHARACTER(10),
create_time1 TIMESTAMP(6) GENERATED ALWAYS AS(TO_TIMESTAMP(create_time,'YYYYMMSS'))
)
PARTITON BY RANGE(create_time)
INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))
(
PARTITON P1 VALUES LESS THAN(TO_TIMESTAMP('2022-01-01 00:00:00','YYYY-MM-DD hh24:mi:ss'))
);
CREATE TABLE T1(
create_time CHARACTER(10),
create_time1 TIMESTAMP(6) GENERATED ALWAYS AS(TO_TIMESTAMP(create_time,'YYYYMMSS'))
)
PARTITON BY RANGE(create_time)
(starting minvalue,
starting '1/1/2020' ending '12/31/2050' every 1 months,
ending maxvalue
);
3)查看表分区
SELECT * FROM SYSCAT.DATAPARTITIONS WHERE TABNAME='表名';
SELECT DATAPARTITIONNAME,LOWVALUE,HIGHVALUE FROM SYSCAT.DATAPARTITIONS WHERE TABNAME='TEST1';
PART0 MINVALUE '2020-01-01-00.00.00.000000'
PART1 '2020-01-01-00.00.00.000000' '2020-04-01-00.00.00.000000'
PART2 '2020-04-01-00.00.00.000000' '2020-07-01-00.00.00.000000'
PART3 '2020-07-01-00.00.00.000000' '2020-10-01-00.00.00.000000'
PART4 '2020-10-01-00.00.00.000000' '2020-12-31-00.00.00.000000'
PART5 '2020-12-31-00.00.00.000000' MAXVALUE
4)删除表分区
第一步:把表TEST1 的PART5 分区卸载到新的表TEST1_PART5中
ALTER TABLE 表名 DETACH PARTITION 分区名 INTO TABLE 新表名(推荐当前表名_分区名)
ALTER TABLE TEST1 DETACH PARTITION PART5 INTO TABLE TEST1_PART5
第二步:删除表
DROP TABLE TEST1_PART5
实例:
#1,原有表分区
SELECT DATAPARTITIONNAME,LOWVALUE,HIGHVALUE FROM SYSCAT.DATAPARTITIONS WHERE TABNAME='TEST1';
PART0 MINVALUE '2020-01-01-00.00.00.000000'
PART1 '2020-01-01-00.00.00.000000' '2020-04-01-00.00.00.000000'
PART2 '2020-04-01-00.00.00.000000' '2020-07-01-00.00.00.000000'
PART3 '2020-07-01-00.00.00.000000' '2020-10-01-00.00.00.000000'
PART4 '2020-10-01-00.00.00.000000' '2020-12-31-00.00.00.000000'
PART5 '2020-12-31-00.00.00.000000' MAXVALUE
#2,卸载删除表TEST1的PART5分区
ALTER TABLE TEST1 DETACH PARTITION PART5 INTO TABLE TEST1_PART5
DROP TABLE TEST1_PART5
#3,再次查询表分区
SELECT DATAPARTITIONNAME,LOWVALUE,HIGHVALUE FROM SYSCAT.DATAPARTITIONS WHERE TABNAME='TEST1';
PART0 MINVALUE '2020-01-01-00.00.00.000000'
PART1 '2020-01-01-00.00.00.000000' '2020-04-01-00.00.00.000000'
PART2 '2020-04-01-00.00.00.000000' '2020-07-01-00.00.00.000000'
PART3 '2020-07-01-00.00.00.000000' '2020-10-01-00.00.00.000000'
PART4 '2020-10-01-00.00.00.000000' '2020-12-31-00.00.00.000000'
#4,卸载PART4
ALTER TABLE TEST1 DETACH PARTITION PART4 INTO TABLE TEST1_PART4
SELECT DATAPARTITIONNAME,LOWVALUE,HIGHVALUE FROM SYSCAT.DATAPARTITIONS WHERE TABNAME='TEST1';
PART0 MINVALUE '2020-01-01-00.00.00.000000'
PART1 '2020-01-01-00.00.00.000000' '2020-04-01-00.00.00.000000'
PART2 '2020-04-01-00.00.00.000000' '2020-07-01-00.00.00.000000'
PART3 '2020-07-01-00.00.00.000000' '2020-10-01-00.00.00.000000'
#5,查看PART4卸载表TEST1_PART4
SELECT DATAPARTITIONNAME,LOWVALUE,HIGHVALUE FROM SYSCAT.DATAPARTITIONS WHERE TABNAME='TEST1_PART4';
PART0
#6,删除卸载表
DROP TABLE TEST1_PART4
5)添加表分区
ALTER TABLE 表名 ADD PARTITION "分区名" STARTING '开始日期' ending '截止日期' ;
ALTER TABLE TEST1 ADD PARTITION "PART4" STARTING '10/1/2020' ending '12/31/2020' ;
ALTER TABLE TEST1 ADD PARTITION "PART5" STARTING '1/1/2021' ending '4/1/2021';
ALTER TABLE TEST1 ADD PARTITION "PART6" ending MAXVALUE;
#查看添加后表TEST1分区情况
SELECT DATAPARTITIONNAME,LOWVALUE,HIGHVALUE FROM SYSCAT.DATAPARTITIONS WHERE TABNAME='TEST1';
PART0 MINVALUE '2020-01-01-00.00.00.000000'
PART1 '2020-01-01-00.00.00.000000' '2020-04-01-00.00.00.000000'
PART2 '2020-04-01-00.00.00.000000' '2020-07-01-00.00.00.000000'
PART3 '2020-07-01-00.00.00.000000' '2020-10-01-00.00.00.000000'
PART4 '2020-10-01-00.00.00.000000' '2020-12-31-00.00.00.000000'
PART5 '2021-01-01-00.00.00.000000' '2021-04-01-00.00.00.000000'
PART6 '2021-04-01-00.00.00.000000' MAXVALUE
9,导出表DDL = > db2look
用法:
db2look -d Database_Name -e -t TABLE_NAME -o t1.sql
db2look -d Database_Name -e -t TABLE_NAME TABLE_NAME2 -o t2.sql
说明:
Syntax: db2look -d DBname [-e] [-xs] [-xdir Path] [-u Creator] [-z Schema]
[-t Tname1 Tname2...TnameN] [-tw Tname] [-xdep] [-xddep]
[-n Nname1 Nname2...NnameN] [-nw Nname]
[-o Fname] [-a] [-m] [-c] [-r] [-l] [-x] [-xd] [-f] [-h]
[-fd] [-td x] [-noview] [-i userID] [-w password]
[-v Vname1 Vname2 ... VnameN] [-dp] [-ct]
[-wrapper WrapperName] [-server ServerName] [-nofed]
[-wlm] [-ap] [-mod] [-cor] [-wrap] [-noimplschema] [-nostatsclause]
[-wrapper WrapperName] [-server ServerName][-fedonly] [-nofed]
db2look [-h]
-d: Database Name: This must be specified
-e: Extract DDL file needed to duplicate database
-xs: Export XSR objects and generate a script containing DDL statements
-xdir: Path name: the directory in which XSR objects will be placed
-u: Creator ID: If -u and -a are both not specified then $USER will be used
-z: Schema name: If -z and -a are both specified then -z will be ignored
-t: Generate statistics for the specified tables
-tw: Generate DDLs for tables whose names match the pattern criteria (wildcard characters) of the table name
-n: Generates statistics for the specified nicknames
-nw: Generates DDL statements for nicknames with names that match the pattern
criteria (wildcard characters) of the nickname name
-xdep: Generate authorization DDL's for the tables and their dependent objects
It's supported only with -t and -tw.
-xddep: Generate authorization DDL's for the tables and their dependent objects
including authorizations granted by SYSIBM during object creation time.
It's supported only with -t and -tw.
-ap: Generate AUDIT USING Statements
-wlm: Generate WLM specific DDL Statements
-mod: Generate DDL statements for Module
-cor: Generate DDL with CREATE OR REPLACE clause
-wrap: Generates obfuscated versions of DDL statements
-h: More detailed help message
-o: Redirects the output to the given file name
-a: Generate statistics for all creators
-m: Run the db2look utility in mimic mode
-c: Do not generate COMMIT statements for mimic
-r: Do not generate RUNSTATS statements for mimic
-l: Generate Database Layout: Database partition groups, Bufferpools and Table spaces
-x: Generate Authorization statements DDL excluding the original definer of the object
-xd: Generate Authorization statements DDL including the original definer of the object
-f: Extract configuration parameters and environment variables
-td: Specifies x to be statement delimiter (default is semicolon(;))
-i: User ID to log on to the server where the database resides
-w: Password to log on to the server where the database resides
-noview: Do not generate CREATE VIEW ddl statements
-wrapper: Generates DDLs for federated objects that apply to this wrapper
-server: Generates DDLs for federated objects that apply to this server
-FEDONLY: Only created Federated DDL Statements
-nofed: Do not generate Federated DDL
-fd: Generates db2fopt statements for environment and configuration parameters.
-v: Generate DDL for view only, this option is ignored when -t is specified
-dp: Generate DROP statement before CREATE statement
-ct: Generate DDL Statements by object creation time
-noimplschema: Do not generate CREATE SCHEMA ddl for implicitly created schemas
-nostatsclause: Do not include statistics clause in CREATE INDEX DDL
-createdb: Generate a CREATE DATABASE command
-printdbcfg: Generate UPDATE DB CFG commands for the database configuration parameters
补充说明:
导出结构中 OCTETS指的就是字节,跟没加一样;
CHAR == CHARACTER
二,其他
1,全局变量
--创建全局变量
create VARIABLE h_time varchar(10) default '2021-12-16';
--设置全局变量的值
set h_time = '2021-12-16';
--在现有日期上加减
set h_time = (select current date -12 days from sysibm.sysdummy1);
--在数据库指定参数上加减
set h_time =(select current date -(select integer(columnName) +1
from tableName where id =1) days from sysibm.sysdummy1);
--获取全局变量
values h_time;
--删除全局变量
drop VARIABLE h_time;
2,查看索引
select * from SYSSTAT.INDEXES WHERE TABSCHEMA='databaseName';
3,查看表信息:字段,结构,注释
SELECT T.COLNAME,T.TYPENAME , T.LENGTH, T.SCALE,T.NULLS,T.REMARKS
FROM syscat.colums T
where T.TABSCHEMA ='databaseName' AND T.TABNAME='tableName';
4,索引序列
--创建(从0开始,最大9999,每次张1)
CREATE SEQUENCE sequenceName AS INTEGER START
WITH 1 INCREMENT BY 0 MINVALUE 9999 NO MAXVALUE CYCLE CACHE 100 ORDER;
--查询序列当前值
select sequenceName .prevval from sysibm.sysdummy1;
values prevval for sequenceName ;
--查询序列下一个值
select sequenceName.nextval from sysibm.sysdummy1;
values nextval for sequenceName ;
--删除序列
DROP SEQUENCE sequenceName;
--新增时使用序列
insert into tableName(id,name) values(nextval for sequenceName,'帅哥')
左补零 :数字左补零,数字长度不定。事例是补齐8位
insert into tableName(id,name) values(right(digits(cast(nextval for sequenceName as bigint)),8),'帅哥')
5,rank() over()
select * from (
select rank() over(partition by columnName1 order by columnName2 desc) rk,
t.* from tableName t
)t1 where t1.rk <=1
6,日期
SELECT TO_TATE('','YYYY-MM-dd HH24:mi:ss') FROM sysibm.dual;
SELECT CURRENT DATE -10 DAYS FROM SYSIBM.SYSDUMMY1;
--上一月数据
where month(mydatecol)=month(current date)-1
and year(mydatecol) = year(current date)
WEEK()返回参数中一年的第几周,用范围在 1-54 的整数值表示。以星期日作为一周的开始
VALUES WEEK('2012-05-25')--21
VALUES YEAR(CURRENT TIMESTAMP);/*2012*/
VALUES YEAR('2012-05-25 21:18:12');/*2012*/
VALUES MONTH(CURRENT TIMESTAMP);/*5*/
VALUES MONTH('2012-05-25 21:18:12');/*5*/
VALUES DAY(CURRENT TIMESTAMP);/*25*/
VALUES DAY('2012-05-25 21:18:12');/*25*/
VALUES HOUR(CURRENT TIMESTAMP);/*21*/
VALUES HOUR('2012-05-25 21:18:12');/*21*/
VALUES MINUTE(CURRENT TIMESTAMP);/*18*/
VALUES MINUTE('2012-05-25 21:18:12');/*18*/
VALUES SECOND(CURRENT TIMESTAMP);/*12*/
VALUES SECOND('2012-05-25 21:18:12');/*12*/
VALUES DATE(CURRENT TIMESTAMP);/*2012/5/25 0:00:00*/
VALUES DATE('2012-05-25 21:18:12');/*2012/5/25 0:00:00*/
VALUES TIME(CURRENT TIMESTAMP);/*21:18:12*/ V
ALUES TIME('2012-05-25 21:18:12');/*21:18:12*/
VALUES TIMESTAMP(CURRENT TIMESTAMP);/*2012/5/25 21:18:12*/
VALUES TIMESTAMP('2012-05-25 21:18:12');/*2012/5/25 21:18:12*/
7,执行脚本
--连接用户
db2 connect to databaseName;
--进入命令行
db2
--执行
db2 -txf tableName-update.sql -z tableName-update.log
8,导入导出
--备份数据和表结构
export to bkdata-tableName-备份日期.ixf of ixf
select * from tableName db2look -d database -t tableName
-e -o bkddl-tableName-备份日期.sql
--备份表数据
export bk_tableName.ixf of ixf select * from tableName
--导入表数据
import from bk_tableName.ixf of ixf insert into tableName
--备份txt,csv 数据
export to bk_tableName_20230117.csv of del select * from tableNamewhere id in ('a','b')
9,编码问题查看
db2 ? sql编码(SQLCODE)
[db2@ 1.1.1.1~] db2 ? sq12214
QL2214N This user ID does not have the authorityto run the REORGutility on table<name>
xplanation:
n attempt was made to reorganize the specified table or its indexesithout the appropriate authorization.Appropriate authorization is thethe fo7Towing authorities :ONTROLpriviTege on the table or one0TSYSCTRL,YSADM,SYSMAINT,DBADM,SQLADM02
The utility stops processing.
Jser response:
on as a user with theogesubmit the REORG utilitycommana.
appropriate authority
10,null处理
输入类型为整型,且允许为空的,可以使用COALESCE(inputParameter,0),把空转换成0;
#确保num为null时仍能被更新
update tbName set num=COALESCE(num,0)+1 where id=1
11,查询表所有COLNAME
SELECT COLNAME FROM SYSCAT.COLUMNS
WHERE TABNAME='TABLE' AND TABSCHEMA='SCHEMA' order by colno;
12,实现wm_concat ,行转列
1)获取表字段colname
SELECT TABNAME as full_tab_name,colname FROM SYSCAT.COLUMNS W
HERE TABNAME=’表名称’ ORDER BY COLNO
2)先把要转换的字段名变成xml 元素
SELECT full_tab_name,xmlelement (NAME a, colname || ',') FROM (
SELECT TABNAME as full_tab_name,colname FROM SYSCAT.COLUMNS
WHERE TABNAME=’表名称’ ORDER BY COLNO
)
3)用xmlagg函数把分组后的字段连接
SELECT
full_tab_name,
xmlagg (xmlelement (NAME a, colname || ',')),
xml2clob (xmlagg (xmlelement (NAME a, colname || ','))) AS col_str
FROM (
SELECT TABNAME as full_tab_name,colname FROM SYSCAT.COLUMNS
WHERE TABNAME=’表名称’ ORDER BY COLNO
)
group by full_tab_name
4)替换A标签
SELECT
replace (
replace (
xml2clob (xmlagg (xmlelement (NAME a, colname || ','))),
'<A>',''
),
'</A>',''
) AS col_str
FROM (
SELECT TABNAME as full_tab_name,colname FROM SYSCAT.COLUMNS
WHERE TABNAME=’表名称’ ORDER BY COLNO
)
group by full_tab_name
5)将表字段clob类型转string类型
select cast(col_str as varchar ) col_str from (
SELECT
replace(
replace(
xml2clob (xmlagg (xmlelement (NAME a, colname || ','))),
'<A>',''
),
'</A>',''
) AS col_str
FROM (
SELECT TABNAME as full_tab_name,colname FROM SYSCAT.COLUMNS
WHERE TABNAME=’表名称’ ORDER BY COLNO
)
group by full_tab_name
)
13,分页
select * from (
select tmp_table.*,ROWNUMBER()OVER() AS row_id from
(select * from table_name)tmp_table
) where row_id between 1 and 10
14,获取前几列
select * from test1 order by id FETCH FIRST num ORWS ONLY;
#获取id排序,第一行数据
select * from test1 order by id FETCH FIRST 1 ORWS ONLY;
15,索引
--创建单个普通索引
CREATE INDEX 索引名 ON 模式名.表名(列名1);
--创建联合索引
CREATE INDEX 索引名 ON 模式名.表名(列名1,列名2);
--创建唯一索引
CREATE UNIQUE INDEX 索引名 ON 模式名.表名(列名1,列名2,...);
--删除索引
DROP INDEX 索引名;