DB2常用SQL

一、日期时间

1.获取当前系统时间

SELECT current timestamp FROM sysibm.sysdummy1;

2.日期时间格式化

select to_char(currentdate, 'YYYYMMDD') from tblname;
-- 或者
select to_char(date(xxxdate), 'YYYYMMDD') from tblname;

之所以写下这个是因为我看到我们项目中的shell脚本中,查询会计日期的方法是这样的:

select substr(char(year(txdate) * 10000 + month(txdate) * 100 + day(txdate)), 1, 8) from sys_date;

看到这样的sql不免让我们眉头一皱,愕然一笑,然后就释然了。不过我们只需要记录一下比较优雅准确的方法即可。

Ps:日期减去一天的方法我们下面介绍,当然比较不优雅而且会被后来者讥讽的做法就是把上面那一条sql的txdate直接减-即可,我们项目中也是这么做的。是的,你没看错,银行的项目,什么性能、优雅、扩展性、维护性等等,基本上通通不要也无需考虑,因为你唯一需要考虑的就是怎么把任务既快又正确地完成,不然你会被屌丝的很惨,除非你遇到一个比较好的或者说有代码洁癖的领导。

上面介绍了日期格式化,如果是日期时间格式化道理也是一样的,只需要把括弧中的date修改成timestamp即可。

3.日期时间加减

select * from tblname where upd_time - current_time> 0;
// 或者
select * from tblname where upd_time - '2021-07-08 16:15:30'> 0;
//或者
select * from tblname where upd_time - timestamp ('2021-07-08 16:17:30')> 0;
// 加法,休息年月日中的s
select updtime + 1 year from tblname;
select updtime + 2years +2months -20days from tblname;

日期同理,不再赘述。

4.获取年、月、日、时、分、秒
具体的格式是:

// 年
Year(updtime) = '2021';
// 月
Month(updtime) > '07';
// 日
Day(updtime) = '10';
// 时,此处的hour不要加s
Hour(updtime) = '16';
// 分
Minute(updtime) > '30';
//秒
Second (updtime) > '30';

其他更细小的时间单位类似,这里不再赘述,需要的朋友可以自行尝试。

如果需要两个时间具体相差多少单位,也就是说相差多少天,或者多少小时,可以采用这样的方式:

Select day (updtime) - day (current date) from tblname;

5.截取其实时间

Date (current timestamp)
// 或者
Time (current timestamp)

二、DDL

具体sql如下:
1.修改字段长度或类型

Alter TABLE tblname alter column fieldname set data type varchar (100);

2.删除字段

ALTER TABLE 表名 DROP 列名;

3.增加字段

Alter table 表名 add column 列名 varchar(100);

三、DB2常用操作

1.去除换行符和回车

是否有换行符和回车可以把数据粘贴到notepad++中,然后选择视图——显示符号——显示所有字符。如果数据有换行符,一般会有CRLF,意思是回车键和换行符。

去除回车换行符方法:

REPLACE (REPLACE (REPLACE (列名,CHR (13)CHR (10), ‘’),CHR (13), ‘’), CHR (10),’’)

2.刷新表(REORG)

对数据库的表结构进行修改之后,必须进行reorg操作,不然会出现表不活跃甚至锁表的情况,直观的结果便是无法增删改数据,甚至查询也会报错。这种情况的db2错误码一般情况下都是:57016。

刷新表当然是reorg命令,但是在不同的地方(操作的目标对象上)命令也会有所差异。

在服务器上使用命令行刷新表:

db2 reorg table 表名;

在数据库客户端使用sql刷新表:

call sysproc.admin_cmd('reorg table 表名');

在SQL文件中:

db2 reorg table tblname;

注意:
在服务器上的操作,必须加’db2’,比如修改字段类型:

db2 ‘alter table tblname alter column set data type varchar (100);

切记,必须加db2,而且一般情况下之后的sql必须引号括起来。服务器上刷新表(reorg)db2 reorg table tblname或者db2 'reorg table tblname’都可以。

3.shell脚本中连接数据库:

db2 connect to 数据库名 user 用户名 using 密码;

不过shell脚本中的数据库名、用户、密码这三项基本不可能在脚本中明文显示,都是通过引入公共文件的形式,然后使用公共文件中配置好的变量即可。

简而言之,从配置文件中获取。比如:

// 引入公共文件
. /home/xxx/xx/shell/head.lib

连接数据库:

db2 "connect to $DB_NAME user $DB_USERNAME using $DB_PASSWORD"

这其中$开头的都是从公共文件中读取的。

我们从服务器上找到对应的head.lib文件,然后用notepad++打开,可以发现其中配置了很多信息,依然也包括刚才我问说的数据库相关的几个。虽然是lib文件,但是其实就是一个shell脚本而已。

4.查询某一列不为空的数据

select * from tblname where 列名 is not null;

5.查询前10条数据

select * from tblname fetch first 10 rows only;

6.服务器上显示表空间详情:

db2 list tablespaces show detail;
// 或者
db2 ‘list tablespaces show detail’;

7.服务器上执行sql文件

db2 -tvf 文件名;

注意:
凡是提到在服务器上执行的sql操作必须先连接服务器,方法和3一样,也就是和shell的操作一样。

任何需要在服务器上执行的sql脚本,都需要加强db2这三个字母,其后的sql最好都带上引号。如果你问我为什么这么强调,我只能告诉你,我就干过这种不带db2这个单词的操作,直接一条干巴巴的sql在服务器上执行,结果当然会报错了。我试过带db2,不带db2,带引号,不带引号,最后的结论是:在服务器上带上db2和引号吧!如果是投产SQL,生产上是直接读文件,执行sql文件中的SQL脚本,这个sql脚本和我们平时在数据库客户端上的命令是一致的(个人认为没有区别,有人说不一致——其实他们也不清楚,Ps:我也不清楚,不过无所谓了)。这个SQL文件中的sql就不要带db2三个字母了,因为最终是执行里面的sql的。

8.查询指定行数的数据

Select * from (select row_number() over (order by updtime) as rownm, * from tblname) where rownm = 10;

9.查询数据库锁的情况

Select * from sysibmadm.locks_held with ur;

10.新增字段,设置非空与默认值

Alter table tblname add 列名 varchar(30) not null default '0';

11.给表添加备注

Comment on table 表名 is 'xxx';

12.给表中的字段添加备注

Comment on column 表名.列名 is 'xxx';

给表和字段添加备注一般是在我们创建表的时候、修改字段或者备注的时候。最好把备注添加好,我见过很多表,光秃秃的,除了英文没有见一个中文,给使用者带来巨大的不便。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北冥牧之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值